ETH Price: $3,099.78 (+1.24%)
Gas: 4 Gwei

Token

TigerVC DAO (Tiger)
 

Overview

Max Total Supply

2,998 Tiger

Holders

403

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
aiker.eth
Balance
1 Tiger
0xffded0d3dbdf048de6f2cb0be25a96f3e271d538
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Tiger

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-19
*/

// File: Tiger_flat.sol


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


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

pragma solidity ^0.8.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;
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;





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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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);
}

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be 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 {}
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

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

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/Tiger.sol


pragma solidity ^0.8.0;





contract Tiger is ERC721, ERC721Enumerable, AccessControl {
    using Strings for uint256;
    string public baseTokenURI;
    bytes32 public constant MINT_TOKEN_ROLE = keccak256("MINT_TOKEN_ROLE");    // Role that can mint tiger item
    bytes32 public constant SET_TOKEN_ROLE = keccak256("SET_TOKEN_ROLE");    // Role that can mint tiger item
    bytes32 public constant BURN_TOKEN_ROLE = keccak256("BURN_TOKEN_ROLE");    // Role that can mint tiger item
    constructor()
    ERC721("TigerVC DAO", "Tiger")
    {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setupRole(SET_TOKEN_ROLE, msg.sender);
        _setupRole(MINT_TOKEN_ROLE, msg.sender);
    }
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

    function tokenURI(uint256 tokenId) public override view returns (string memory) {
        require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');
        string memory baseURI = _baseURI();
        string memory uriSuffix = Strings.toString(tokenId);
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, uriSuffix)) : '';
    }

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

    function setBaseURI(string memory _baseTokenURI) public onlyRole(SET_TOKEN_ROLE) {
        baseTokenURI = _baseTokenURI;
    }

    function mintToken(uint256 _tokenId, address to) public onlyRole(MINT_TOKEN_ROLE) {
        require(!_exists(_tokenId), 'The token URI should be unique');
        _safeMint(to, _tokenId);
    }

    function burnToken(uint256 _tokenId) public onlyRole(BURN_TOKEN_ROLE) {
        _burn(_tokenId);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"BURN_TOKEN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_TOKEN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_TOKEN_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":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burnToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"mintToken","outputs":[],"stateMutability":"nonpayable","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600b81526020017f546967657256432044414f0000000000000000000000000000000000000000008152506040518060400160405280600581526020017f5469676572000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620002ac565b508060019080519060200190620000af929190620002ac565b505050620000c76000801b336200013160201b60201c565b620000f97f9b27b5f34c38cd0d691143dc6188f9aa90e75f5e87b428e9315e822224da1dd2336200013160201b60201c565b6200012b7f821650d24875d860aeb74c5880ed2f612118829056d3e7545f282a4b19f2ed3f336200013160201b60201c565b620003c0565b6200014382826200014760201b60201c565b5050565b6200015982826200023960201b60201c565b62000235576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001da620002a460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b828054620002ba906200038b565b90600052602060002090601f016020900481019282620002de57600085556200032a565b82601f10620002f957805160ff19168380011785556200032a565b828001600101855582156200032a579182015b82811115620003295782518255916020019190600101906200030c565b5b5090506200033991906200033d565b5090565b5b80821115620003585760008160009055506001016200033e565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003a457607f821691505b602082108103620003ba57620003b96200035c565b5b50919050565b6140b680620003d06000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063a217fddf116100a2578063c87b56dd11610071578063c87b56dd1461053e578063d547741f1461056e578063d547cfb71461058a578063e985e9c5146105a8576101cf565b8063a217fddf146104ca578063a22cb465146104e8578063b88d4fde14610504578063c75bcaa114610520576101cf565b806386622e5e116100de57806386622e5e1461044257806391d148541461046057806395d89b4114610490578063a140ae23146104ae576101cf565b806370a08231146103d8578063785769a3146104085780637b47ec1a14610426576101cf565b80632f2ff15d1161017157806342842e0e1161014b57806342842e0e146103405780634f6ccce71461035c57806355f804b31461038c5780636352211e146103a8576101cf565b80632f2ff15d146102d85780632f745c59146102f457806336568abe14610324576101cf565b8063095ea7b3116101ad578063095ea7b31461025257806318160ddd1461026e57806323b872dd1461028c578063248a9ca3146102a8576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e99190612a32565b6105d8565b6040516101fb9190612a7a565b60405180910390f35b61020c6105ea565b6040516102199190612b2e565b60405180910390f35b61023c60048036038101906102379190612b86565b61067c565b6040516102499190612bf4565b60405180910390f35b61026c60048036038101906102679190612c3b565b610701565b005b610276610818565b6040516102839190612c8a565b60405180910390f35b6102a660048036038101906102a19190612ca5565b610825565b005b6102c260048036038101906102bd9190612d2e565b610885565b6040516102cf9190612d6a565b60405180910390f35b6102f260048036038101906102ed9190612d85565b6108a5565b005b61030e60048036038101906103099190612c3b565b6108c6565b60405161031b9190612c8a565b60405180910390f35b61033e60048036038101906103399190612d85565b61096b565b005b61035a60048036038101906103559190612ca5565b6109ee565b005b61037660048036038101906103719190612b86565b610a0e565b6040516103839190612c8a565b60405180910390f35b6103a660048036038101906103a19190612efa565b610a7f565b005b6103c260048036038101906103bd9190612b86565b610ac4565b6040516103cf9190612bf4565b60405180910390f35b6103f260048036038101906103ed9190612f43565b610b75565b6040516103ff9190612c8a565b60405180910390f35b610410610c2c565b60405161041d9190612d6a565b60405180910390f35b610440600480360381019061043b9190612b86565b610c50565b005b61044a610c87565b6040516104579190612d6a565b60405180910390f35b61047a60048036038101906104759190612d85565b610cab565b6040516104879190612a7a565b60405180910390f35b610498610d16565b6040516104a59190612b2e565b60405180910390f35b6104c860048036038101906104c39190612f70565b610da8565b005b6104d2610e2a565b6040516104df9190612d6a565b60405180910390f35b61050260048036038101906104fd9190612fdc565b610e31565b005b61051e600480360381019061051991906130bd565b610e47565b005b610528610ea9565b6040516105359190612d6a565b60405180910390f35b61055860048036038101906105539190612b86565b610ecd565b6040516105659190612b2e565b60405180910390f35b61058860048036038101906105839190612d85565b610f7a565b005b610592610f9b565b60405161059f9190612b2e565b60405180910390f35b6105c260048036038101906105bd9190613140565b611029565b6040516105cf9190612a7a565b60405180910390f35b60006105e3826110bd565b9050919050565b6060600080546105f9906131af565b80601f0160208091040260200160405190810160405280929190818152602001828054610625906131af565b80156106725780601f1061064757610100808354040283529160200191610672565b820191906000526020600020905b81548152906001019060200180831161065557829003601f168201915b5050505050905090565b600061068782611137565b6106c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd90613252565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070c82610ac4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361077c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610773906132e4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079b6111a3565b73ffffffffffffffffffffffffffffffffffffffff1614806107ca57506107c9816107c46111a3565b611029565b5b610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080090613376565b60405180910390fd5b61081383836111ab565b505050565b6000600880549050905090565b6108366108306111a3565b82611264565b610875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086c90613408565b60405180910390fd5b610880838383611342565b505050565b6000600a6000838152602001908152602001600020600101549050919050565b6108ae82610885565b6108b7816115a8565b6108c183836115bc565b505050565b60006108d183610b75565b8210610912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109099061349a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109736111a3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d79061352c565b60405180910390fd5b6109ea828261169d565b5050565b610a0983838360405180602001604052806000815250610e47565b505050565b6000610a18610818565b8210610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a50906135be565b60405180910390fd5b60088281548110610a6d57610a6c6135de565b5b90600052602060002001549050919050565b7f9b27b5f34c38cd0d691143dc6188f9aa90e75f5e87b428e9315e822224da1dd2610aa9816115a8565b81600b9080519060200190610abf929190612923565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b639061367f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc90613711565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7fcf76522267be6fe846994cc9ebd70a74ca2bb374905702dab138305b404391d281565b7fcf76522267be6fe846994cc9ebd70a74ca2bb374905702dab138305b404391d2610c7a816115a8565b610c838261177f565b5050565b7f821650d24875d860aeb74c5880ed2f612118829056d3e7545f282a4b19f2ed3f81565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610d25906131af565b80601f0160208091040260200160405190810160405280929190818152602001828054610d51906131af565b8015610d9e5780601f10610d7357610100808354040283529160200191610d9e565b820191906000526020600020905b815481529060010190602001808311610d8157829003601f168201915b5050505050905090565b7f821650d24875d860aeb74c5880ed2f612118829056d3e7545f282a4b19f2ed3f610dd2816115a8565b610ddb83611137565b15610e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e129061377d565b60405180910390fd5b610e25828461189c565b505050565b6000801b81565b610e43610e3c6111a3565b83836118ba565b5050565b610e58610e526111a3565b83611264565b610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e90613408565b60405180910390fd5b610ea384848484611a26565b50505050565b7f9b27b5f34c38cd0d691143dc6188f9aa90e75f5e87b428e9315e822224da1dd281565b6060610ed882611137565b610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e9061380f565b60405180910390fd5b6000610f21611a82565b90506000610f2e84611b14565b90506000825103610f4e5760405180602001604052806000815250610f71565b8181604051602001610f6192919061386b565b6040516020818303038152906040525b92505050919050565b610f8382610885565b610f8c816115a8565b610f96838361169d565b505050565b600b8054610fa8906131af565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd4906131af565b80156110215780601f10610ff657610100808354040283529160200191611021565b820191906000526020600020905b81548152906001019060200180831161100457829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611130575061112f82611c74565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661121e83610ac4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061126f82611137565b6112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a590613901565b60405180910390fd5b60006112b983610ac4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806112fb57506112fa8185611029565b5b8061133957508373ffffffffffffffffffffffffffffffffffffffff166113218461067c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661136282610ac4565b73ffffffffffffffffffffffffffffffffffffffff16146113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90613993565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141e90613a25565b60405180910390fd5b611432838383611cee565b61143d6000826111ab565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461148d9190613a74565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114e49190613aa8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115a3838383611cfe565b505050565b6115b9816115b46111a3565b611d03565b50565b6115c68282610cab565b611699576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061163e6111a3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6116a78282610cab565b1561177b576000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506117206111a3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600061178a82610ac4565b905061179881600084611cee565b6117a36000836111ab565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117f39190613a74565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461189881600084611cfe565b5050565b6118b6828260405180602001604052806000815250611da0565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f90613b4a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a199190612a7a565b60405180910390a3505050565b611a31848484611342565b611a3d84848484611dfb565b611a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7390613bdc565b60405180910390fd5b50505050565b6060600b8054611a91906131af565b80601f0160208091040260200160405190810160405280929190818152602001828054611abd906131af565b8015611b0a5780601f10611adf57610100808354040283529160200191611b0a565b820191906000526020600020905b815481529060010190602001808311611aed57829003601f168201915b5050505050905090565b606060008203611b5b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c6f565b600082905060005b60008214611b8d578080611b7690613bfc565b915050600a82611b869190613c73565b9150611b63565b60008167ffffffffffffffff811115611ba957611ba8612dcf565b5b6040519080825280601f01601f191660200182016040528015611bdb5781602001600182028036833780820191505090505b5090505b60008514611c6857600182611bf49190613a74565b9150600a85611c039190613ca4565b6030611c0f9190613aa8565b60f81b818381518110611c2557611c246135de565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611c619190613c73565b9450611bdf565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ce75750611ce682611f82565b5b9050919050565b611cf9838383612064565b505050565b505050565b611d0d8282610cab565b611d9c57611d328173ffffffffffffffffffffffffffffffffffffffff166014612176565b611d408360001c6020612176565b604051602001611d51929190613d6d565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d939190612b2e565b60405180910390fd5b5050565b611daa83836123b2565b611db76000848484611dfb565b611df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ded90613bdc565b60405180910390fd5b505050565b6000611e1c8473ffffffffffffffffffffffffffffffffffffffff1661258b565b15611f75578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e456111a3565b8786866040518563ffffffff1660e01b8152600401611e679493929190613dfc565b6020604051808303816000875af1925050508015611ea357506040513d601f19601f82011682018060405250810190611ea09190613e5d565b60015b611f25573d8060008114611ed3576040519150601f19603f3d011682016040523d82523d6000602084013e611ed8565b606091505b506000815103611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1490613bdc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f7a565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061204d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061205d575061205c826125ae565b5b9050919050565b61206f838383612618565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120b1576120ac8161261d565b6120f0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146120ef576120ee8382612666565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121325761212d816127d3565b612171565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121705761216f82826128a4565b5b5b505050565b6060600060028360026121899190613e8a565b6121939190613aa8565b67ffffffffffffffff8111156121ac576121ab612dcf565b5b6040519080825280601f01601f1916602001820160405280156121de5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612216576122156135de565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061227a576122796135de565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026122ba9190613e8a565b6122c49190613aa8565b90505b6001811115612364577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612306576123056135de565b5b1a60f81b82828151811061231d5761231c6135de565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061235d90613ee4565b90506122c7565b50600084146123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f90613f59565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241890613fc5565b60405180910390fd5b61242a81611137565b1561246a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246190614031565b60405180910390fd5b61247660008383611cee565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124c69190613aa8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461258760008383611cfe565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161267384610b75565b61267d9190613a74565b9050600060076000848152602001908152602001600020549050818114612762576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127e79190613a74565b9050600060096000848152602001908152602001600020549050600060088381548110612817576128166135de565b5b906000526020600020015490508060088381548110612839576128386135de565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061288857612887614051565b5b6001900381819060005260206000200160009055905550505050565b60006128af83610b75565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461292f906131af565b90600052602060002090601f0160209004810192826129515760008555612998565b82601f1061296a57805160ff1916838001178555612998565b82800160010185558215612998579182015b8281111561299757825182559160200191906001019061297c565b5b5090506129a591906129a9565b5090565b5b808211156129c25760008160009055506001016129aa565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a0f816129da565b8114612a1a57600080fd5b50565b600081359050612a2c81612a06565b92915050565b600060208284031215612a4857612a476129d0565b5b6000612a5684828501612a1d565b91505092915050565b60008115159050919050565b612a7481612a5f565b82525050565b6000602082019050612a8f6000830184612a6b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612acf578082015181840152602081019050612ab4565b83811115612ade576000848401525b50505050565b6000601f19601f8301169050919050565b6000612b0082612a95565b612b0a8185612aa0565b9350612b1a818560208601612ab1565b612b2381612ae4565b840191505092915050565b60006020820190508181036000830152612b488184612af5565b905092915050565b6000819050919050565b612b6381612b50565b8114612b6e57600080fd5b50565b600081359050612b8081612b5a565b92915050565b600060208284031215612b9c57612b9b6129d0565b5b6000612baa84828501612b71565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bde82612bb3565b9050919050565b612bee81612bd3565b82525050565b6000602082019050612c096000830184612be5565b92915050565b612c1881612bd3565b8114612c2357600080fd5b50565b600081359050612c3581612c0f565b92915050565b60008060408385031215612c5257612c516129d0565b5b6000612c6085828601612c26565b9250506020612c7185828601612b71565b9150509250929050565b612c8481612b50565b82525050565b6000602082019050612c9f6000830184612c7b565b92915050565b600080600060608486031215612cbe57612cbd6129d0565b5b6000612ccc86828701612c26565b9350506020612cdd86828701612c26565b9250506040612cee86828701612b71565b9150509250925092565b6000819050919050565b612d0b81612cf8565b8114612d1657600080fd5b50565b600081359050612d2881612d02565b92915050565b600060208284031215612d4457612d436129d0565b5b6000612d5284828501612d19565b91505092915050565b612d6481612cf8565b82525050565b6000602082019050612d7f6000830184612d5b565b92915050565b60008060408385031215612d9c57612d9b6129d0565b5b6000612daa85828601612d19565b9250506020612dbb85828601612c26565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612e0782612ae4565b810181811067ffffffffffffffff82111715612e2657612e25612dcf565b5b80604052505050565b6000612e396129c6565b9050612e458282612dfe565b919050565b600067ffffffffffffffff821115612e6557612e64612dcf565b5b612e6e82612ae4565b9050602081019050919050565b82818337600083830152505050565b6000612e9d612e9884612e4a565b612e2f565b905082815260208101848484011115612eb957612eb8612dca565b5b612ec4848285612e7b565b509392505050565b600082601f830112612ee157612ee0612dc5565b5b8135612ef1848260208601612e8a565b91505092915050565b600060208284031215612f1057612f0f6129d0565b5b600082013567ffffffffffffffff811115612f2e57612f2d6129d5565b5b612f3a84828501612ecc565b91505092915050565b600060208284031215612f5957612f586129d0565b5b6000612f6784828501612c26565b91505092915050565b60008060408385031215612f8757612f866129d0565b5b6000612f9585828601612b71565b9250506020612fa685828601612c26565b9150509250929050565b612fb981612a5f565b8114612fc457600080fd5b50565b600081359050612fd681612fb0565b92915050565b60008060408385031215612ff357612ff26129d0565b5b600061300185828601612c26565b925050602061301285828601612fc7565b9150509250929050565b600067ffffffffffffffff82111561303757613036612dcf565b5b61304082612ae4565b9050602081019050919050565b600061306061305b8461301c565b612e2f565b90508281526020810184848401111561307c5761307b612dca565b5b613087848285612e7b565b509392505050565b600082601f8301126130a4576130a3612dc5565b5b81356130b484826020860161304d565b91505092915050565b600080600080608085870312156130d7576130d66129d0565b5b60006130e587828801612c26565b94505060206130f687828801612c26565b935050604061310787828801612b71565b925050606085013567ffffffffffffffff811115613128576131276129d5565b5b6131348782880161308f565b91505092959194509250565b60008060408385031215613157576131566129d0565b5b600061316585828601612c26565b925050602061317685828601612c26565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131c757607f821691505b6020821081036131da576131d9613180565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061323c602c83612aa0565b9150613247826131e0565b604082019050919050565b6000602082019050818103600083015261326b8161322f565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006132ce602183612aa0565b91506132d982613272565b604082019050919050565b600060208201905081810360008301526132fd816132c1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613360603883612aa0565b915061336b82613304565b604082019050919050565b6000602082019050818103600083015261338f81613353565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006133f2603183612aa0565b91506133fd82613396565b604082019050919050565b60006020820190508181036000830152613421816133e5565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613484602b83612aa0565b915061348f82613428565b604082019050919050565b600060208201905081810360008301526134b381613477565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613516602f83612aa0565b9150613521826134ba565b604082019050919050565b6000602082019050818103600083015261354581613509565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006135a8602c83612aa0565b91506135b38261354c565b604082019050919050565b600060208201905081810360008301526135d78161359b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613669602983612aa0565b91506136748261360d565b604082019050919050565b600060208201905081810360008301526136988161365c565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006136fb602a83612aa0565b91506137068261369f565b604082019050919050565b6000602082019050818103600083015261372a816136ee565b9050919050565b7f54686520746f6b656e205552492073686f756c6420626520756e697175650000600082015250565b6000613767601e83612aa0565b915061377282613731565b602082019050919050565b600060208201905081810360008301526137968161375a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006137f9602f83612aa0565b91506138048261379d565b604082019050919050565b60006020820190508181036000830152613828816137ec565b9050919050565b600081905092915050565b600061384582612a95565b61384f818561382f565b935061385f818560208601612ab1565b80840191505092915050565b6000613877828561383a565b9150613883828461383a565b91508190509392505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006138eb602c83612aa0565b91506138f68261388f565b604082019050919050565b6000602082019050818103600083015261391a816138de565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061397d602583612aa0565b915061398882613921565b604082019050919050565b600060208201905081810360008301526139ac81613970565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613a0f602483612aa0565b9150613a1a826139b3565b604082019050919050565b60006020820190508181036000830152613a3e81613a02565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a7f82612b50565b9150613a8a83612b50565b925082821015613a9d57613a9c613a45565b5b828203905092915050565b6000613ab382612b50565b9150613abe83612b50565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613af357613af2613a45565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613b34601983612aa0565b9150613b3f82613afe565b602082019050919050565b60006020820190508181036000830152613b6381613b27565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613bc6603283612aa0565b9150613bd182613b6a565b604082019050919050565b60006020820190508181036000830152613bf581613bb9565b9050919050565b6000613c0782612b50565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c3957613c38613a45565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c7e82612b50565b9150613c8983612b50565b925082613c9957613c98613c44565b5b828204905092915050565b6000613caf82612b50565b9150613cba83612b50565b925082613cca57613cc9613c44565b5b828206905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613d0b60178361382f565b9150613d1682613cd5565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613d5760118361382f565b9150613d6282613d21565b601182019050919050565b6000613d7882613cfe565b9150613d84828561383a565b9150613d8f82613d4a565b9150613d9b828461383a565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000613dce82613da7565b613dd88185613db2565b9350613de8818560208601612ab1565b613df181612ae4565b840191505092915050565b6000608082019050613e116000830187612be5565b613e1e6020830186612be5565b613e2b6040830185612c7b565b8181036060830152613e3d8184613dc3565b905095945050505050565b600081519050613e5781612a06565b92915050565b600060208284031215613e7357613e726129d0565b5b6000613e8184828501613e48565b91505092915050565b6000613e9582612b50565b9150613ea083612b50565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ed957613ed8613a45565b5b828202905092915050565b6000613eef82612b50565b915060008203613f0257613f01613a45565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613f43602083612aa0565b9150613f4e82613f0d565b602082019050919050565b60006020820190508181036000830152613f7281613f36565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613faf602083612aa0565b9150613fba82613f79565b602082019050919050565b60006020820190508181036000830152613fde81613fa2565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061401b601c83612aa0565b915061402682613fe5565b602082019050919050565b6000602082019050818103600083015261404a8161400e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122084618a47127764628e3a45bf17e02dde5a05f3119ebe3e7eb10ecfbd0042207a64736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063a217fddf116100a2578063c87b56dd11610071578063c87b56dd1461053e578063d547741f1461056e578063d547cfb71461058a578063e985e9c5146105a8576101cf565b8063a217fddf146104ca578063a22cb465146104e8578063b88d4fde14610504578063c75bcaa114610520576101cf565b806386622e5e116100de57806386622e5e1461044257806391d148541461046057806395d89b4114610490578063a140ae23146104ae576101cf565b806370a08231146103d8578063785769a3146104085780637b47ec1a14610426576101cf565b80632f2ff15d1161017157806342842e0e1161014b57806342842e0e146103405780634f6ccce71461035c57806355f804b31461038c5780636352211e146103a8576101cf565b80632f2ff15d146102d85780632f745c59146102f457806336568abe14610324576101cf565b8063095ea7b3116101ad578063095ea7b31461025257806318160ddd1461026e57806323b872dd1461028c578063248a9ca3146102a8576101cf565b806301ffc9a7146101d457806306fdde0314610204578063081812fc14610222575b600080fd5b6101ee60048036038101906101e99190612a32565b6105d8565b6040516101fb9190612a7a565b60405180910390f35b61020c6105ea565b6040516102199190612b2e565b60405180910390f35b61023c60048036038101906102379190612b86565b61067c565b6040516102499190612bf4565b60405180910390f35b61026c60048036038101906102679190612c3b565b610701565b005b610276610818565b6040516102839190612c8a565b60405180910390f35b6102a660048036038101906102a19190612ca5565b610825565b005b6102c260048036038101906102bd9190612d2e565b610885565b6040516102cf9190612d6a565b60405180910390f35b6102f260048036038101906102ed9190612d85565b6108a5565b005b61030e60048036038101906103099190612c3b565b6108c6565b60405161031b9190612c8a565b60405180910390f35b61033e60048036038101906103399190612d85565b61096b565b005b61035a60048036038101906103559190612ca5565b6109ee565b005b61037660048036038101906103719190612b86565b610a0e565b6040516103839190612c8a565b60405180910390f35b6103a660048036038101906103a19190612efa565b610a7f565b005b6103c260048036038101906103bd9190612b86565b610ac4565b6040516103cf9190612bf4565b60405180910390f35b6103f260048036038101906103ed9190612f43565b610b75565b6040516103ff9190612c8a565b60405180910390f35b610410610c2c565b60405161041d9190612d6a565b60405180910390f35b610440600480360381019061043b9190612b86565b610c50565b005b61044a610c87565b6040516104579190612d6a565b60405180910390f35b61047a60048036038101906104759190612d85565b610cab565b6040516104879190612a7a565b60405180910390f35b610498610d16565b6040516104a59190612b2e565b60405180910390f35b6104c860048036038101906104c39190612f70565b610da8565b005b6104d2610e2a565b6040516104df9190612d6a565b60405180910390f35b61050260048036038101906104fd9190612fdc565b610e31565b005b61051e600480360381019061051991906130bd565b610e47565b005b610528610ea9565b6040516105359190612d6a565b60405180910390f35b61055860048036038101906105539190612b86565b610ecd565b6040516105659190612b2e565b60405180910390f35b61058860048036038101906105839190612d85565b610f7a565b005b610592610f9b565b60405161059f9190612b2e565b60405180910390f35b6105c260048036038101906105bd9190613140565b611029565b6040516105cf9190612a7a565b60405180910390f35b60006105e3826110bd565b9050919050565b6060600080546105f9906131af565b80601f0160208091040260200160405190810160405280929190818152602001828054610625906131af565b80156106725780601f1061064757610100808354040283529160200191610672565b820191906000526020600020905b81548152906001019060200180831161065557829003601f168201915b5050505050905090565b600061068782611137565b6106c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106bd90613252565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070c82610ac4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361077c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610773906132e4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079b6111a3565b73ffffffffffffffffffffffffffffffffffffffff1614806107ca57506107c9816107c46111a3565b611029565b5b610809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080090613376565b60405180910390fd5b61081383836111ab565b505050565b6000600880549050905090565b6108366108306111a3565b82611264565b610875576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086c90613408565b60405180910390fd5b610880838383611342565b505050565b6000600a6000838152602001908152602001600020600101549050919050565b6108ae82610885565b6108b7816115a8565b6108c183836115bc565b505050565b60006108d183610b75565b8210610912576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109099061349a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6109736111a3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d79061352c565b60405180910390fd5b6109ea828261169d565b5050565b610a0983838360405180602001604052806000815250610e47565b505050565b6000610a18610818565b8210610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a50906135be565b60405180910390fd5b60088281548110610a6d57610a6c6135de565b5b90600052602060002001549050919050565b7f9b27b5f34c38cd0d691143dc6188f9aa90e75f5e87b428e9315e822224da1dd2610aa9816115a8565b81600b9080519060200190610abf929190612923565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b639061367f565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610be5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdc90613711565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7fcf76522267be6fe846994cc9ebd70a74ca2bb374905702dab138305b404391d281565b7fcf76522267be6fe846994cc9ebd70a74ca2bb374905702dab138305b404391d2610c7a816115a8565b610c838261177f565b5050565b7f821650d24875d860aeb74c5880ed2f612118829056d3e7545f282a4b19f2ed3f81565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610d25906131af565b80601f0160208091040260200160405190810160405280929190818152602001828054610d51906131af565b8015610d9e5780601f10610d7357610100808354040283529160200191610d9e565b820191906000526020600020905b815481529060010190602001808311610d8157829003601f168201915b5050505050905090565b7f821650d24875d860aeb74c5880ed2f612118829056d3e7545f282a4b19f2ed3f610dd2816115a8565b610ddb83611137565b15610e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e129061377d565b60405180910390fd5b610e25828461189c565b505050565b6000801b81565b610e43610e3c6111a3565b83836118ba565b5050565b610e58610e526111a3565b83611264565b610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e90613408565b60405180910390fd5b610ea384848484611a26565b50505050565b7f9b27b5f34c38cd0d691143dc6188f9aa90e75f5e87b428e9315e822224da1dd281565b6060610ed882611137565b610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e9061380f565b60405180910390fd5b6000610f21611a82565b90506000610f2e84611b14565b90506000825103610f4e5760405180602001604052806000815250610f71565b8181604051602001610f6192919061386b565b6040516020818303038152906040525b92505050919050565b610f8382610885565b610f8c816115a8565b610f96838361169d565b505050565b600b8054610fa8906131af565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd4906131af565b80156110215780601f10610ff657610100808354040283529160200191611021565b820191906000526020600020905b81548152906001019060200180831161100457829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611130575061112f82611c74565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661121e83610ac4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061126f82611137565b6112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a590613901565b60405180910390fd5b60006112b983610ac4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806112fb57506112fa8185611029565b5b8061133957508373ffffffffffffffffffffffffffffffffffffffff166113218461067c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661136282610ac4565b73ffffffffffffffffffffffffffffffffffffffff16146113b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113af90613993565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141e90613a25565b60405180910390fd5b611432838383611cee565b61143d6000826111ab565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461148d9190613a74565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114e49190613aa8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46115a3838383611cfe565b505050565b6115b9816115b46111a3565b611d03565b50565b6115c68282610cab565b611699576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061163e6111a3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6116a78282610cab565b1561177b576000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506117206111a3565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600061178a82610ac4565b905061179881600084611cee565b6117a36000836111ab565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117f39190613a74565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461189881600084611cfe565b5050565b6118b6828260405180602001604052806000815250611da0565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611928576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191f90613b4a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a199190612a7a565b60405180910390a3505050565b611a31848484611342565b611a3d84848484611dfb565b611a7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7390613bdc565b60405180910390fd5b50505050565b6060600b8054611a91906131af565b80601f0160208091040260200160405190810160405280929190818152602001828054611abd906131af565b8015611b0a5780601f10611adf57610100808354040283529160200191611b0a565b820191906000526020600020905b815481529060010190602001808311611aed57829003601f168201915b5050505050905090565b606060008203611b5b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c6f565b600082905060005b60008214611b8d578080611b7690613bfc565b915050600a82611b869190613c73565b9150611b63565b60008167ffffffffffffffff811115611ba957611ba8612dcf565b5b6040519080825280601f01601f191660200182016040528015611bdb5781602001600182028036833780820191505090505b5090505b60008514611c6857600182611bf49190613a74565b9150600a85611c039190613ca4565b6030611c0f9190613aa8565b60f81b818381518110611c2557611c246135de565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611c619190613c73565b9450611bdf565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ce75750611ce682611f82565b5b9050919050565b611cf9838383612064565b505050565b505050565b611d0d8282610cab565b611d9c57611d328173ffffffffffffffffffffffffffffffffffffffff166014612176565b611d408360001c6020612176565b604051602001611d51929190613d6d565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d939190612b2e565b60405180910390fd5b5050565b611daa83836123b2565b611db76000848484611dfb565b611df6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ded90613bdc565b60405180910390fd5b505050565b6000611e1c8473ffffffffffffffffffffffffffffffffffffffff1661258b565b15611f75578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e456111a3565b8786866040518563ffffffff1660e01b8152600401611e679493929190613dfc565b6020604051808303816000875af1925050508015611ea357506040513d601f19601f82011682018060405250810190611ea09190613e5d565b60015b611f25573d8060008114611ed3576040519150601f19603f3d011682016040523d82523d6000602084013e611ed8565b606091505b506000815103611f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1490613bdc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f7a565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061204d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061205d575061205c826125ae565b5b9050919050565b61206f838383612618565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120b1576120ac8161261d565b6120f0565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146120ef576120ee8382612666565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036121325761212d816127d3565b612171565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146121705761216f82826128a4565b5b5b505050565b6060600060028360026121899190613e8a565b6121939190613aa8565b67ffffffffffffffff8111156121ac576121ab612dcf565b5b6040519080825280601f01601f1916602001820160405280156121de5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612216576122156135de565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061227a576122796135de565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026122ba9190613e8a565b6122c49190613aa8565b90505b6001811115612364577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612306576123056135de565b5b1a60f81b82828151811061231d5761231c6135de565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061235d90613ee4565b90506122c7565b50600084146123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f90613f59565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241890613fc5565b60405180910390fd5b61242a81611137565b1561246a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246190614031565b60405180910390fd5b61247660008383611cee565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124c69190613aa8565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461258760008383611cfe565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161267384610b75565b61267d9190613a74565b9050600060076000848152602001908152602001600020549050818114612762576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506127e79190613a74565b9050600060096000848152602001908152602001600020549050600060088381548110612817576128166135de565b5b906000526020600020015490508060088381548110612839576128386135de565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061288857612887614051565b5b6001900381819060005260206000200160009055905550505050565b60006128af83610b75565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461292f906131af565b90600052602060002090601f0160209004810192826129515760008555612998565b82601f1061296a57805160ff1916838001178555612998565b82800160010185558215612998579182015b8281111561299757825182559160200191906001019061297c565b5b5090506129a591906129a9565b5090565b5b808211156129c25760008160009055506001016129aa565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612a0f816129da565b8114612a1a57600080fd5b50565b600081359050612a2c81612a06565b92915050565b600060208284031215612a4857612a476129d0565b5b6000612a5684828501612a1d565b91505092915050565b60008115159050919050565b612a7481612a5f565b82525050565b6000602082019050612a8f6000830184612a6b565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612acf578082015181840152602081019050612ab4565b83811115612ade576000848401525b50505050565b6000601f19601f8301169050919050565b6000612b0082612a95565b612b0a8185612aa0565b9350612b1a818560208601612ab1565b612b2381612ae4565b840191505092915050565b60006020820190508181036000830152612b488184612af5565b905092915050565b6000819050919050565b612b6381612b50565b8114612b6e57600080fd5b50565b600081359050612b8081612b5a565b92915050565b600060208284031215612b9c57612b9b6129d0565b5b6000612baa84828501612b71565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bde82612bb3565b9050919050565b612bee81612bd3565b82525050565b6000602082019050612c096000830184612be5565b92915050565b612c1881612bd3565b8114612c2357600080fd5b50565b600081359050612c3581612c0f565b92915050565b60008060408385031215612c5257612c516129d0565b5b6000612c6085828601612c26565b9250506020612c7185828601612b71565b9150509250929050565b612c8481612b50565b82525050565b6000602082019050612c9f6000830184612c7b565b92915050565b600080600060608486031215612cbe57612cbd6129d0565b5b6000612ccc86828701612c26565b9350506020612cdd86828701612c26565b9250506040612cee86828701612b71565b9150509250925092565b6000819050919050565b612d0b81612cf8565b8114612d1657600080fd5b50565b600081359050612d2881612d02565b92915050565b600060208284031215612d4457612d436129d0565b5b6000612d5284828501612d19565b91505092915050565b612d6481612cf8565b82525050565b6000602082019050612d7f6000830184612d5b565b92915050565b60008060408385031215612d9c57612d9b6129d0565b5b6000612daa85828601612d19565b9250506020612dbb85828601612c26565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612e0782612ae4565b810181811067ffffffffffffffff82111715612e2657612e25612dcf565b5b80604052505050565b6000612e396129c6565b9050612e458282612dfe565b919050565b600067ffffffffffffffff821115612e6557612e64612dcf565b5b612e6e82612ae4565b9050602081019050919050565b82818337600083830152505050565b6000612e9d612e9884612e4a565b612e2f565b905082815260208101848484011115612eb957612eb8612dca565b5b612ec4848285612e7b565b509392505050565b600082601f830112612ee157612ee0612dc5565b5b8135612ef1848260208601612e8a565b91505092915050565b600060208284031215612f1057612f0f6129d0565b5b600082013567ffffffffffffffff811115612f2e57612f2d6129d5565b5b612f3a84828501612ecc565b91505092915050565b600060208284031215612f5957612f586129d0565b5b6000612f6784828501612c26565b91505092915050565b60008060408385031215612f8757612f866129d0565b5b6000612f9585828601612b71565b9250506020612fa685828601612c26565b9150509250929050565b612fb981612a5f565b8114612fc457600080fd5b50565b600081359050612fd681612fb0565b92915050565b60008060408385031215612ff357612ff26129d0565b5b600061300185828601612c26565b925050602061301285828601612fc7565b9150509250929050565b600067ffffffffffffffff82111561303757613036612dcf565b5b61304082612ae4565b9050602081019050919050565b600061306061305b8461301c565b612e2f565b90508281526020810184848401111561307c5761307b612dca565b5b613087848285612e7b565b509392505050565b600082601f8301126130a4576130a3612dc5565b5b81356130b484826020860161304d565b91505092915050565b600080600080608085870312156130d7576130d66129d0565b5b60006130e587828801612c26565b94505060206130f687828801612c26565b935050604061310787828801612b71565b925050606085013567ffffffffffffffff811115613128576131276129d5565b5b6131348782880161308f565b91505092959194509250565b60008060408385031215613157576131566129d0565b5b600061316585828601612c26565b925050602061317685828601612c26565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131c757607f821691505b6020821081036131da576131d9613180565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061323c602c83612aa0565b9150613247826131e0565b604082019050919050565b6000602082019050818103600083015261326b8161322f565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006132ce602183612aa0565b91506132d982613272565b604082019050919050565b600060208201905081810360008301526132fd816132c1565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613360603883612aa0565b915061336b82613304565b604082019050919050565b6000602082019050818103600083015261338f81613353565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006133f2603183612aa0565b91506133fd82613396565b604082019050919050565b60006020820190508181036000830152613421816133e5565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613484602b83612aa0565b915061348f82613428565b604082019050919050565b600060208201905081810360008301526134b381613477565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613516602f83612aa0565b9150613521826134ba565b604082019050919050565b6000602082019050818103600083015261354581613509565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b60006135a8602c83612aa0565b91506135b38261354c565b604082019050919050565b600060208201905081810360008301526135d78161359b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613669602983612aa0565b91506136748261360d565b604082019050919050565b600060208201905081810360008301526136988161365c565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b60006136fb602a83612aa0565b91506137068261369f565b604082019050919050565b6000602082019050818103600083015261372a816136ee565b9050919050565b7f54686520746f6b656e205552492073686f756c6420626520756e697175650000600082015250565b6000613767601e83612aa0565b915061377282613731565b602082019050919050565b600060208201905081810360008301526137968161375a565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006137f9602f83612aa0565b91506138048261379d565b604082019050919050565b60006020820190508181036000830152613828816137ec565b9050919050565b600081905092915050565b600061384582612a95565b61384f818561382f565b935061385f818560208601612ab1565b80840191505092915050565b6000613877828561383a565b9150613883828461383a565b91508190509392505050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006138eb602c83612aa0565b91506138f68261388f565b604082019050919050565b6000602082019050818103600083015261391a816138de565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061397d602583612aa0565b915061398882613921565b604082019050919050565b600060208201905081810360008301526139ac81613970565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613a0f602483612aa0565b9150613a1a826139b3565b604082019050919050565b60006020820190508181036000830152613a3e81613a02565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a7f82612b50565b9150613a8a83612b50565b925082821015613a9d57613a9c613a45565b5b828203905092915050565b6000613ab382612b50565b9150613abe83612b50565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613af357613af2613a45565b5b828201905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613b34601983612aa0565b9150613b3f82613afe565b602082019050919050565b60006020820190508181036000830152613b6381613b27565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613bc6603283612aa0565b9150613bd182613b6a565b604082019050919050565b60006020820190508181036000830152613bf581613bb9565b9050919050565b6000613c0782612b50565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c3957613c38613a45565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613c7e82612b50565b9150613c8983612b50565b925082613c9957613c98613c44565b5b828204905092915050565b6000613caf82612b50565b9150613cba83612b50565b925082613cca57613cc9613c44565b5b828206905092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000613d0b60178361382f565b9150613d1682613cd5565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000613d5760118361382f565b9150613d6282613d21565b601182019050919050565b6000613d7882613cfe565b9150613d84828561383a565b9150613d8f82613d4a565b9150613d9b828461383a565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000613dce82613da7565b613dd88185613db2565b9350613de8818560208601612ab1565b613df181612ae4565b840191505092915050565b6000608082019050613e116000830187612be5565b613e1e6020830186612be5565b613e2b6040830185612c7b565b8181036060830152613e3d8184613dc3565b905095945050505050565b600081519050613e5781612a06565b92915050565b600060208284031215613e7357613e726129d0565b5b6000613e8184828501613e48565b91505092915050565b6000613e9582612b50565b9150613ea083612b50565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ed957613ed8613a45565b5b828202905092915050565b6000613eef82612b50565b915060008203613f0257613f01613a45565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000613f43602083612aa0565b9150613f4e82613f0d565b602082019050919050565b60006020820190508181036000830152613f7281613f36565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613faf602083612aa0565b9150613fba82613f79565b602082019050919050565b60006020820190508181036000830152613fde81613fa2565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061401b601c83612aa0565b915061402682613fe5565b602082019050919050565b6000602082019050818103600083015261404a8161400e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea264697066735822122084618a47127764628e3a45bf17e02dde5a05f3119ebe3e7eb10ecfbd0042207a64736f6c634300080d0033

Deployed Bytecode Sourcemap

54081:2025:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54958:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34683:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36243:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35766:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48504:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36993:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22003:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22396:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48172:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23444:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37403:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48694:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55659:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34377:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34107:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54435:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55999:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54211:70;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20463:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34852:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55795:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19568:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36536:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37659:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54324:68;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55152:378;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22788:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54178:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36762:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54958:186;55076:4;55100:36;55124:11;55100:23;:36::i;:::-;55093:43;;54958:186;;;:::o;34683:100::-;34737:13;34770:5;34763:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34683:100;:::o;36243:221::-;36319:7;36347:16;36355:7;36347;:16::i;:::-;36339:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36432:15;:24;36448:7;36432:24;;;;;;;;;;;;;;;;;;;;;36425:31;;36243:221;;;:::o;35766:411::-;35847:13;35863:23;35878:7;35863:14;:23::i;:::-;35847:39;;35911:5;35905:11;;:2;:11;;;35897:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36005:5;35989:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36014:37;36031:5;36038:12;:10;:12::i;:::-;36014:16;:37::i;:::-;35989:62;35967:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;36148:21;36157:2;36161:7;36148:8;:21::i;:::-;35836:341;35766:411;;:::o;48504:113::-;48565:7;48592:10;:17;;;;48585:24;;48504:113;:::o;36993:339::-;37188:41;37207:12;:10;:12::i;:::-;37221:7;37188:18;:41::i;:::-;37180:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37296:28;37306:4;37312:2;37316:7;37296:9;:28::i;:::-;36993:339;;;:::o;22003:131::-;22077:7;22104:6;:12;22111:4;22104:12;;;;;;;;;;;:22;;;22097:29;;22003:131;;;:::o;22396:147::-;22479:18;22492:4;22479:12;:18::i;:::-;20059:16;20070:4;20059:10;:16::i;:::-;22510:25:::1;22521:4;22527:7;22510:10;:25::i;:::-;22396:147:::0;;;:::o;48172:256::-;48269:7;48305:23;48322:5;48305:16;:23::i;:::-;48297:5;:31;48289:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;48394:12;:19;48407:5;48394:19;;;;;;;;;;;;;;;:26;48414:5;48394:26;;;;;;;;;;;;48387:33;;48172:256;;;;:::o;23444:218::-;23551:12;:10;:12::i;:::-;23540:23;;:7;:23;;;23532:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;23628:26;23640:4;23646:7;23628:11;:26::i;:::-;23444:218;;:::o;37403:185::-;37541:39;37558:4;37564:2;37568:7;37541:39;;;;;;;;;;;;:16;:39::i;:::-;37403:185;;;:::o;48694:233::-;48769:7;48805:30;:28;:30::i;:::-;48797:5;:38;48789:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;48902:10;48913:5;48902:17;;;;;;;;:::i;:::-;;;;;;;;;;48895:24;;48694:233;;;:::o;55659:128::-;54365:27;20059:16;20070:4;20059:10;:16::i;:::-;55766:13:::1;55751:12;:28;;;;;;;;;;;;:::i;:::-;;55659:128:::0;;:::o;34377:239::-;34449:7;34469:13;34485:7;:16;34493:7;34485:16;;;;;;;;;;;;;;;;;;;;;34469:32;;34537:1;34520:19;;:5;:19;;;34512:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34603:5;34596:12;;;34377:239;;;:::o;34107:208::-;34179:7;34224:1;34207:19;;:5;:19;;;34199:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34291:9;:16;34301:5;34291:16;;;;;;;;;;;;;;;;34284:23;;34107:208;;;:::o;54435:70::-;54477:28;54435:70;:::o;55999:104::-;54477:28;20059:16;20070:4;20059:10;:16::i;:::-;56080:15:::1;56086:8;56080:5;:15::i;:::-;55999:104:::0;;:::o;54211:70::-;54253:28;54211:70;:::o;20463:147::-;20549:4;20573:6;:12;20580:4;20573:12;;;;;;;;;;;:20;;:29;20594:7;20573:29;;;;;;;;;;;;;;;;;;;;;;;;;20566:36;;20463:147;;;;:::o;34852:104::-;34908:13;34941:7;34934:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34852:104;:::o;55795:196::-;54253:28;20059:16;20070:4;20059:10;:16::i;:::-;55897:17:::1;55905:8;55897:7;:17::i;:::-;55896:18;55888:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;55960:23;55970:2;55974:8;55960:9;:23::i;:::-;55795:196:::0;;;:::o;19568:49::-;19613:4;19568:49;;;:::o;36536:155::-;36631:52;36650:12;:10;:12::i;:::-;36664:8;36674;36631:18;:52::i;:::-;36536:155;;:::o;37659:328::-;37834:41;37853:12;:10;:12::i;:::-;37867:7;37834:18;:41::i;:::-;37826:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;37940:39;37954:4;37960:2;37964:7;37973:5;37940:13;:39::i;:::-;37659:328;;;;:::o;54324:68::-;54365:27;54324:68;:::o;55152:378::-;55217:13;55251:16;55259:7;55251;:16::i;:::-;55243:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;55330:21;55354:10;:8;:10::i;:::-;55330:34;;55375:23;55401:25;55418:7;55401:16;:25::i;:::-;55375:51;;55469:1;55450:7;55444:21;:26;:78;;;;;;;;;;;;;;;;;55497:7;55506:9;55480:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55444:78;55437:85;;;;55152:378;;;:::o;22788:149::-;22872:18;22885:4;22872:12;:18::i;:::-;20059:16;20070:4;20059:10;:16::i;:::-;22903:26:::1;22915:4;22921:7;22903:11;:26::i;:::-;22788:149:::0;;;:::o;54178:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36762:164::-;36859:4;36883:18;:25;36902:5;36883:25;;;;;;;;;;;;;;;:35;36909:8;36883:35;;;;;;;;;;;;;;;;;;;;;;;;;36876:42;;36762:164;;;;:::o;20167:204::-;20252:4;20291:32;20276:47;;;:11;:47;;;;:87;;;;20327:36;20351:11;20327:23;:36::i;:::-;20276:87;20269:94;;20167:204;;;:::o;39497:127::-;39562:4;39614:1;39586:30;;:7;:16;39594:7;39586:16;;;;;;;;;;;;;;;;;;;;;:30;;;;39579:37;;39497:127;;;:::o;5873:98::-;5926:7;5953:10;5946:17;;5873:98;:::o;43643:174::-;43745:2;43718:15;:24;43734:7;43718:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43801:7;43797:2;43763:46;;43772:23;43787:7;43772:14;:23::i;:::-;43763:46;;;;;;;;;;;;43643:174;;:::o;39791:348::-;39884:4;39909:16;39917:7;39909;:16::i;:::-;39901:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39985:13;40001:23;40016:7;40001:14;:23::i;:::-;39985:39;;40054:5;40043:16;;:7;:16;;;:52;;;;40063:32;40080:5;40087:7;40063:16;:32::i;:::-;40043:52;:87;;;;40123:7;40099:31;;:20;40111:7;40099:11;:20::i;:::-;:31;;;40043:87;40035:96;;;39791:348;;;;:::o;42900:625::-;43059:4;43032:31;;:23;43047:7;43032:14;:23::i;:::-;:31;;;43024:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;43138:1;43124:16;;:2;:16;;;43116:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;43194:39;43215:4;43221:2;43225:7;43194:20;:39::i;:::-;43298:29;43315:1;43319:7;43298:8;:29::i;:::-;43359:1;43340:9;:15;43350:4;43340:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;43388:1;43371:9;:13;43381:2;43371:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;43419:2;43400:7;:16;43408:7;43400:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;43458:7;43454:2;43439:27;;43448:4;43439:27;;;;;;;;;;;;43479:38;43499:4;43505:2;43509:7;43479:19;:38::i;:::-;42900:625;;;:::o;20914:105::-;20981:30;20992:4;20998:12;:10;:12::i;:::-;20981:10;:30::i;:::-;20914:105;:::o;24945:238::-;25029:22;25037:4;25043:7;25029;:22::i;:::-;25024:152;;25100:4;25068:6;:12;25075:4;25068:12;;;;;;;;;;;:20;;:29;25089:7;25068:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;25151:12;:10;:12::i;:::-;25124:40;;25142:7;25124:40;;25136:4;25124:40;;;;;;;;;;25024:152;24945:238;;:::o;25315:239::-;25399:22;25407:4;25413:7;25399;:22::i;:::-;25395:152;;;25470:5;25438:6;:12;25445:4;25438:12;;;;;;;;;;;:20;;:29;25459:7;25438:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;25522:12;:10;:12::i;:::-;25495:40;;25513:7;25495:40;;25507:4;25495:40;;;;;;;;;;25395:152;25315:239;;:::o;42143:420::-;42203:13;42219:23;42234:7;42219:14;:23::i;:::-;42203:39;;42255:48;42276:5;42291:1;42295:7;42255:20;:48::i;:::-;42344:29;42361:1;42365:7;42344:8;:29::i;:::-;42406:1;42386:9;:16;42396:5;42386:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;42425:7;:16;42433:7;42425:16;;;;;;;;;;;;42418:23;;;;;;;;;;;42487:7;42483:1;42459:36;;42468:5;42459:36;;;;;;;;;;;;42508:47;42528:5;42543:1;42547:7;42508:19;:47::i;:::-;42192:371;42143:420;:::o;40481:110::-;40557:26;40567:2;40571:7;40557:26;;;;;;;;;;;;:9;:26::i;:::-;40481:110;;:::o;43959:315::-;44114:8;44105:17;;:5;:17;;;44097:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;44201:8;44163:18;:25;44182:5;44163:25;;;;;;;;;;;;;;;:35;44189:8;44163:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;44247:8;44225:41;;44240:5;44225:41;;;44257:8;44225:41;;;;;;:::i;:::-;;;;;;;;43959:315;;;:::o;38869:::-;39026:28;39036:4;39042:2;39046:7;39026:9;:28::i;:::-;39073:48;39096:4;39102:2;39106:7;39115:5;39073:22;:48::i;:::-;39065:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;38869:315;;;;:::o;55538:113::-;55598:13;55631:12;55624:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55538:113;:::o;3435:723::-;3491:13;3721:1;3712:5;:10;3708:53;;3739:10;;;;;;;;;;;;;;;;;;;;;3708:53;3771:12;3786:5;3771:20;;3802:14;3827:78;3842:1;3834:4;:9;3827:78;;3860:8;;;;;:::i;:::-;;;;3891:2;3883:10;;;;;:::i;:::-;;;3827:78;;;3915:19;3947:6;3937:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3915:39;;3965:154;3981:1;3972:5;:10;3965:154;;4009:1;3999:11;;;;;:::i;:::-;;;4076:2;4068:5;:10;;;;:::i;:::-;4055:2;:24;;;;:::i;:::-;4042:39;;4025:6;4032;4025:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4105:2;4096:11;;;;;:::i;:::-;;;3965:154;;;4143:6;4129:21;;;;;3435:723;;;;:::o;47864:224::-;47966:4;48005:35;47990:50;;;:11;:50;;;;:90;;;;48044:36;48068:11;48044:23;:36::i;:::-;47990:90;47983:97;;47864:224;;;:::o;54769:181::-;54897:45;54924:4;54930:2;54934:7;54897:26;:45::i;:::-;54769:181;;;:::o;46721:125::-;;;;:::o;21309:505::-;21398:22;21406:4;21412:7;21398;:22::i;:::-;21393:414;;21586:41;21614:7;21586:41;;21624:2;21586:19;:41::i;:::-;21700:38;21728:4;21720:13;;21735:2;21700:19;:38::i;:::-;21491:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21437:358;;;;;;;;;;;:::i;:::-;;;;;;;;21393:414;21309:505;;:::o;40818:321::-;40948:18;40954:2;40958:7;40948:5;:18::i;:::-;40999:54;41030:1;41034:2;41038:7;41047:5;40999:22;:54::i;:::-;40977:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;40818:321;;;:::o;44839:799::-;44994:4;45015:15;:2;:13;;;:15::i;:::-;45011:620;;;45067:2;45051:36;;;45088:12;:10;:12::i;:::-;45102:4;45108:7;45117:5;45051:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45047:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45310:1;45293:6;:13;:18;45289:272;;45336:60;;;;;;;;;;:::i;:::-;;;;;;;;45289:272;45511:6;45505:13;45496:6;45492:2;45488:15;45481:38;45047:529;45184:41;;;45174:51;;;:6;:51;;;;45167:58;;;;;45011:620;45615:4;45608:11;;44839:799;;;;;;;:::o;33738:305::-;33840:4;33892:25;33877:40;;;:11;:40;;;;:105;;;;33949:33;33934:48;;;:11;:48;;;;33877:105;:158;;;;33999:36;34023:11;33999:23;:36::i;:::-;33877:158;33857:178;;33738:305;;;:::o;49540:589::-;49684:45;49711:4;49717:2;49721:7;49684:26;:45::i;:::-;49762:1;49746:18;;:4;:18;;;49742:187;;49781:40;49813:7;49781:31;:40::i;:::-;49742:187;;;49851:2;49843:10;;:4;:10;;;49839:90;;49870:47;49903:4;49909:7;49870:32;:47::i;:::-;49839:90;49742:187;49957:1;49943:16;;:2;:16;;;49939:183;;49976:45;50013:7;49976:36;:45::i;:::-;49939:183;;;50049:4;50043:10;;:2;:10;;;50039:83;;50070:40;50098:2;50102:7;50070:27;:40::i;:::-;50039:83;49939:183;49540:589;;;:::o;4736:451::-;4811:13;4837:19;4882:1;4873:6;4869:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;4859:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4837:47;;4895:15;:6;4902:1;4895:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;4921;:6;4928:1;4921:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;4952:9;4977:1;4968:6;4964:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;4952:26;;4947:135;4984:1;4980;:5;4947:135;;;5019:12;5040:3;5032:5;:11;5019:25;;;;;;;:::i;:::-;;;;;5007:6;5014:1;5007:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;5069:1;5059:11;;;;;4987:3;;;;:::i;:::-;;;4947:135;;;;5109:1;5100:5;:10;5092:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;5172:6;5158:21;;;4736:451;;;;:::o;41475:439::-;41569:1;41555:16;;:2;:16;;;41547:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41628:16;41636:7;41628;:16::i;:::-;41627:17;41619:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41690:45;41719:1;41723:2;41727:7;41690:20;:45::i;:::-;41765:1;41748:9;:13;41758:2;41748:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41796:2;41777:7;:16;41785:7;41777:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41841:7;41837:2;41816:33;;41833:1;41816:33;;;;;;;;;;;;41862:44;41890:1;41894:2;41898:7;41862:19;:44::i;:::-;41475:439;;:::o;7320:326::-;7380:4;7637:1;7615:7;:19;;;:23;7608:30;;7320:326;;;:::o;17426:157::-;17511:4;17550:25;17535:40;;;:11;:40;;;;17528:47;;17426:157;;;:::o;46210:126::-;;;;:::o;50852:164::-;50956:10;:17;;;;50929:15;:24;50945:7;50929:24;;;;;;;;;;;:44;;;;50984:10;51000:7;50984:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50852:164;:::o;51643:988::-;51909:22;51959:1;51934:22;51951:4;51934:16;:22::i;:::-;:26;;;;:::i;:::-;51909:51;;51971:18;51992:17;:26;52010:7;51992:26;;;;;;;;;;;;51971:47;;52139:14;52125:10;:28;52121:328;;52170:19;52192:12;:18;52205:4;52192:18;;;;;;;;;;;;;;;:34;52211:14;52192:34;;;;;;;;;;;;52170:56;;52276:11;52243:12;:18;52256:4;52243:18;;;;;;;;;;;;;;;:30;52262:10;52243:30;;;;;;;;;;;:44;;;;52393:10;52360:17;:30;52378:11;52360:30;;;;;;;;;;;:43;;;;52155:294;52121:328;52545:17;:26;52563:7;52545:26;;;;;;;;;;;52538:33;;;52589:12;:18;52602:4;52589:18;;;;;;;;;;;;;;;:34;52608:14;52589:34;;;;;;;;;;;52582:41;;;51724:907;;51643:988;;:::o;52926:1079::-;53179:22;53224:1;53204:10;:17;;;;:21;;;;:::i;:::-;53179:46;;53236:18;53257:15;:24;53273:7;53257:24;;;;;;;;;;;;53236:45;;53608:19;53630:10;53641:14;53630:26;;;;;;;;:::i;:::-;;;;;;;;;;53608:48;;53694:11;53669:10;53680;53669:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;53805:10;53774:15;:28;53790:11;53774:28;;;;;;;;;;;:41;;;;53946:15;:24;53962:7;53946:24;;;;;;;;;;;53939:31;;;53981:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;52997:1008;;;52926:1079;:::o;50430:221::-;50515:14;50532:20;50549:2;50532:16;:20::i;:::-;50515:37;;50590:7;50563:12;:16;50576:2;50563:16;;;;;;;;;;;;;;;:24;50580:6;50563:24;;;;;;;;;;;:34;;;;50637:6;50608:17;:26;50626:7;50608:26;;;;;;;;;;;:35;;;;50504:147;50430:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:122::-;6071:24;6089:5;6071:24;:::i;:::-;6064:5;6061:35;6051:63;;6110:1;6107;6100:12;6051:63;5998:122;:::o;6126:139::-;6172:5;6210:6;6197:20;6188:29;;6226:33;6253:5;6226:33;:::i;:::-;6126:139;;;;:::o;6271:329::-;6330:6;6379:2;6367:9;6358:7;6354:23;6350:32;6347:119;;;6385:79;;:::i;:::-;6347:119;6505:1;6530:53;6575:7;6566:6;6555:9;6551:22;6530:53;:::i;:::-;6520:63;;6476:117;6271:329;;;;:::o;6606:118::-;6693:24;6711:5;6693:24;:::i;:::-;6688:3;6681:37;6606:118;;:::o;6730:222::-;6823:4;6861:2;6850:9;6846:18;6838:26;;6874:71;6942:1;6931:9;6927:17;6918:6;6874:71;:::i;:::-;6730:222;;;;:::o;6958:474::-;7026:6;7034;7083:2;7071:9;7062:7;7058:23;7054:32;7051:119;;;7089:79;;:::i;:::-;7051:119;7209:1;7234:53;7279:7;7270:6;7259:9;7255:22;7234:53;:::i;:::-;7224:63;;7180:117;7336:2;7362:53;7407:7;7398:6;7387:9;7383:22;7362:53;:::i;:::-;7352:63;;7307:118;6958:474;;;;;:::o;7438:117::-;7547:1;7544;7537:12;7561:117;7670:1;7667;7660:12;7684:180;7732:77;7729:1;7722:88;7829:4;7826:1;7819:15;7853:4;7850:1;7843:15;7870:281;7953:27;7975:4;7953:27;:::i;:::-;7945:6;7941:40;8083:6;8071:10;8068:22;8047:18;8035:10;8032:34;8029:62;8026:88;;;8094:18;;:::i;:::-;8026:88;8134:10;8130:2;8123:22;7913:238;7870:281;;:::o;8157:129::-;8191:6;8218:20;;:::i;:::-;8208:30;;8247:33;8275:4;8267:6;8247:33;:::i;:::-;8157:129;;;:::o;8292:308::-;8354:4;8444:18;8436:6;8433:30;8430:56;;;8466:18;;:::i;:::-;8430:56;8504:29;8526:6;8504:29;:::i;:::-;8496:37;;8588:4;8582;8578:15;8570:23;;8292:308;;;:::o;8606:154::-;8690:6;8685:3;8680;8667:30;8752:1;8743:6;8738:3;8734:16;8727:27;8606:154;;;:::o;8766:412::-;8844:5;8869:66;8885:49;8927:6;8885:49;:::i;:::-;8869:66;:::i;:::-;8860:75;;8958:6;8951:5;8944:21;8996:4;8989:5;8985:16;9034:3;9025:6;9020:3;9016:16;9013:25;9010:112;;;9041:79;;:::i;:::-;9010:112;9131:41;9165:6;9160:3;9155;9131:41;:::i;:::-;8850:328;8766:412;;;;;:::o;9198:340::-;9254:5;9303:3;9296:4;9288:6;9284:17;9280:27;9270:122;;9311:79;;:::i;:::-;9270:122;9428:6;9415:20;9453:79;9528:3;9520:6;9513:4;9505:6;9501:17;9453:79;:::i;:::-;9444:88;;9260:278;9198:340;;;;:::o;9544:509::-;9613:6;9662:2;9650:9;9641:7;9637:23;9633:32;9630:119;;;9668:79;;:::i;:::-;9630:119;9816:1;9805:9;9801:17;9788:31;9846:18;9838:6;9835:30;9832:117;;;9868:79;;:::i;:::-;9832:117;9973:63;10028:7;10019:6;10008:9;10004:22;9973:63;:::i;:::-;9963:73;;9759:287;9544:509;;;;:::o;10059:329::-;10118:6;10167:2;10155:9;10146:7;10142:23;10138:32;10135:119;;;10173:79;;:::i;:::-;10135:119;10293:1;10318:53;10363:7;10354:6;10343:9;10339:22;10318:53;:::i;:::-;10308:63;;10264:117;10059:329;;;;:::o;10394:474::-;10462:6;10470;10519:2;10507:9;10498:7;10494:23;10490:32;10487:119;;;10525:79;;:::i;:::-;10487:119;10645:1;10670:53;10715:7;10706:6;10695:9;10691:22;10670:53;:::i;:::-;10660:63;;10616:117;10772:2;10798:53;10843:7;10834:6;10823:9;10819:22;10798:53;:::i;:::-;10788:63;;10743:118;10394:474;;;;;:::o;10874:116::-;10944:21;10959:5;10944:21;:::i;:::-;10937:5;10934:32;10924:60;;10980:1;10977;10970:12;10924:60;10874:116;:::o;10996:133::-;11039:5;11077:6;11064:20;11055:29;;11093:30;11117:5;11093:30;:::i;:::-;10996:133;;;;:::o;11135:468::-;11200:6;11208;11257:2;11245:9;11236:7;11232:23;11228:32;11225:119;;;11263:79;;:::i;:::-;11225:119;11383:1;11408:53;11453:7;11444:6;11433:9;11429:22;11408:53;:::i;:::-;11398:63;;11354:117;11510:2;11536:50;11578:7;11569:6;11558:9;11554:22;11536:50;:::i;:::-;11526:60;;11481:115;11135:468;;;;;:::o;11609:307::-;11670:4;11760:18;11752:6;11749:30;11746:56;;;11782:18;;:::i;:::-;11746:56;11820:29;11842:6;11820:29;:::i;:::-;11812:37;;11904:4;11898;11894:15;11886:23;;11609:307;;;:::o;11922:410::-;11999:5;12024:65;12040:48;12081:6;12040:48;:::i;:::-;12024:65;:::i;:::-;12015:74;;12112:6;12105:5;12098:21;12150:4;12143:5;12139:16;12188:3;12179:6;12174:3;12170:16;12167:25;12164:112;;;12195:79;;:::i;:::-;12164:112;12285:41;12319:6;12314:3;12309;12285:41;:::i;:::-;12005:327;11922:410;;;;;:::o;12351:338::-;12406:5;12455:3;12448:4;12440:6;12436:17;12432:27;12422:122;;12463:79;;:::i;:::-;12422:122;12580:6;12567:20;12605:78;12679:3;12671:6;12664:4;12656:6;12652:17;12605:78;:::i;:::-;12596:87;;12412:277;12351:338;;;;:::o;12695:943::-;12790:6;12798;12806;12814;12863:3;12851:9;12842:7;12838:23;12834:33;12831:120;;;12870:79;;:::i;:::-;12831:120;12990:1;13015:53;13060:7;13051:6;13040:9;13036:22;13015:53;:::i;:::-;13005:63;;12961:117;13117:2;13143:53;13188:7;13179:6;13168:9;13164:22;13143:53;:::i;:::-;13133:63;;13088:118;13245:2;13271:53;13316:7;13307:6;13296:9;13292:22;13271:53;:::i;:::-;13261:63;;13216:118;13401:2;13390:9;13386:18;13373:32;13432:18;13424:6;13421:30;13418:117;;;13454:79;;:::i;:::-;13418:117;13559:62;13613:7;13604:6;13593:9;13589:22;13559:62;:::i;:::-;13549:72;;13344:287;12695:943;;;;;;;:::o;13644:474::-;13712:6;13720;13769:2;13757:9;13748:7;13744:23;13740:32;13737:119;;;13775:79;;:::i;:::-;13737:119;13895:1;13920:53;13965:7;13956:6;13945:9;13941:22;13920:53;:::i;:::-;13910:63;;13866:117;14022:2;14048:53;14093:7;14084:6;14073:9;14069:22;14048:53;:::i;:::-;14038:63;;13993:118;13644:474;;;;;:::o;14124:180::-;14172:77;14169:1;14162:88;14269:4;14266:1;14259:15;14293:4;14290:1;14283:15;14310:320;14354:6;14391:1;14385:4;14381:12;14371:22;;14438:1;14432:4;14428:12;14459:18;14449:81;;14515:4;14507:6;14503:17;14493:27;;14449:81;14577:2;14569:6;14566:14;14546:18;14543:38;14540:84;;14596:18;;:::i;:::-;14540:84;14361:269;14310:320;;;:::o;14636:231::-;14776:34;14772:1;14764:6;14760:14;14753:58;14845:14;14840:2;14832:6;14828:15;14821:39;14636:231;:::o;14873:366::-;15015:3;15036:67;15100:2;15095:3;15036:67;:::i;:::-;15029:74;;15112:93;15201:3;15112:93;:::i;:::-;15230:2;15225:3;15221:12;15214:19;;14873:366;;;:::o;15245:419::-;15411:4;15449:2;15438:9;15434:18;15426:26;;15498:9;15492:4;15488:20;15484:1;15473:9;15469:17;15462:47;15526:131;15652:4;15526:131;:::i;:::-;15518:139;;15245:419;;;:::o;15670:220::-;15810:34;15806:1;15798:6;15794:14;15787:58;15879:3;15874:2;15866:6;15862:15;15855:28;15670:220;:::o;15896:366::-;16038:3;16059:67;16123:2;16118:3;16059:67;:::i;:::-;16052:74;;16135:93;16224:3;16135:93;:::i;:::-;16253:2;16248:3;16244:12;16237:19;;15896:366;;;:::o;16268:419::-;16434:4;16472:2;16461:9;16457:18;16449:26;;16521:9;16515:4;16511:20;16507:1;16496:9;16492:17;16485:47;16549:131;16675:4;16549:131;:::i;:::-;16541:139;;16268:419;;;:::o;16693:243::-;16833:34;16829:1;16821:6;16817:14;16810:58;16902:26;16897:2;16889:6;16885:15;16878:51;16693:243;:::o;16942:366::-;17084:3;17105:67;17169:2;17164:3;17105:67;:::i;:::-;17098:74;;17181:93;17270:3;17181:93;:::i;:::-;17299:2;17294:3;17290:12;17283:19;;16942:366;;;:::o;17314:419::-;17480:4;17518:2;17507:9;17503:18;17495:26;;17567:9;17561:4;17557:20;17553:1;17542:9;17538:17;17531:47;17595:131;17721:4;17595:131;:::i;:::-;17587:139;;17314:419;;;:::o;17739:236::-;17879:34;17875:1;17867:6;17863:14;17856:58;17948:19;17943:2;17935:6;17931:15;17924:44;17739:236;:::o;17981:366::-;18123:3;18144:67;18208:2;18203:3;18144:67;:::i;:::-;18137:74;;18220:93;18309:3;18220:93;:::i;:::-;18338:2;18333:3;18329:12;18322:19;;17981:366;;;:::o;18353:419::-;18519:4;18557:2;18546:9;18542:18;18534:26;;18606:9;18600:4;18596:20;18592:1;18581:9;18577:17;18570:47;18634:131;18760:4;18634:131;:::i;:::-;18626:139;;18353:419;;;:::o;18778:230::-;18918:34;18914:1;18906:6;18902:14;18895:58;18987:13;18982:2;18974:6;18970:15;18963:38;18778:230;:::o;19014:366::-;19156:3;19177:67;19241:2;19236:3;19177:67;:::i;:::-;19170:74;;19253:93;19342:3;19253:93;:::i;:::-;19371:2;19366:3;19362:12;19355:19;;19014:366;;;:::o;19386:419::-;19552:4;19590:2;19579:9;19575:18;19567:26;;19639:9;19633:4;19629:20;19625:1;19614:9;19610:17;19603:47;19667:131;19793:4;19667:131;:::i;:::-;19659:139;;19386:419;;;:::o;19811:234::-;19951:34;19947:1;19939:6;19935:14;19928:58;20020:17;20015:2;20007:6;20003:15;19996:42;19811:234;:::o;20051:366::-;20193:3;20214:67;20278:2;20273:3;20214:67;:::i;:::-;20207:74;;20290:93;20379:3;20290:93;:::i;:::-;20408:2;20403:3;20399:12;20392:19;;20051:366;;;:::o;20423:419::-;20589:4;20627:2;20616:9;20612:18;20604:26;;20676:9;20670:4;20666:20;20662:1;20651:9;20647:17;20640:47;20704:131;20830:4;20704:131;:::i;:::-;20696:139;;20423:419;;;:::o;20848:231::-;20988:34;20984:1;20976:6;20972:14;20965:58;21057:14;21052:2;21044:6;21040:15;21033:39;20848:231;:::o;21085:366::-;21227:3;21248:67;21312:2;21307:3;21248:67;:::i;:::-;21241:74;;21324:93;21413:3;21324:93;:::i;:::-;21442:2;21437:3;21433:12;21426:19;;21085:366;;;:::o;21457:419::-;21623:4;21661:2;21650:9;21646:18;21638:26;;21710:9;21704:4;21700:20;21696:1;21685:9;21681:17;21674:47;21738:131;21864:4;21738:131;:::i;:::-;21730:139;;21457:419;;;:::o;21882:180::-;21930:77;21927:1;21920:88;22027:4;22024:1;22017:15;22051:4;22048:1;22041:15;22068:228;22208:34;22204:1;22196:6;22192:14;22185:58;22277:11;22272:2;22264:6;22260:15;22253:36;22068:228;:::o;22302:366::-;22444:3;22465:67;22529:2;22524:3;22465:67;:::i;:::-;22458:74;;22541:93;22630:3;22541:93;:::i;:::-;22659:2;22654:3;22650:12;22643:19;;22302:366;;;:::o;22674:419::-;22840:4;22878:2;22867:9;22863:18;22855:26;;22927:9;22921:4;22917:20;22913:1;22902:9;22898:17;22891:47;22955:131;23081:4;22955:131;:::i;:::-;22947:139;;22674:419;;;:::o;23099:229::-;23239:34;23235:1;23227:6;23223:14;23216:58;23308:12;23303:2;23295:6;23291:15;23284:37;23099:229;:::o;23334:366::-;23476:3;23497:67;23561:2;23556:3;23497:67;:::i;:::-;23490:74;;23573:93;23662:3;23573:93;:::i;:::-;23691:2;23686:3;23682:12;23675:19;;23334:366;;;:::o;23706:419::-;23872:4;23910:2;23899:9;23895:18;23887:26;;23959:9;23953:4;23949:20;23945:1;23934:9;23930:17;23923:47;23987:131;24113:4;23987:131;:::i;:::-;23979:139;;23706:419;;;:::o;24131:180::-;24271:32;24267:1;24259:6;24255:14;24248:56;24131:180;:::o;24317:366::-;24459:3;24480:67;24544:2;24539:3;24480:67;:::i;:::-;24473:74;;24556:93;24645:3;24556:93;:::i;:::-;24674:2;24669:3;24665:12;24658:19;;24317:366;;;:::o;24689:419::-;24855:4;24893:2;24882:9;24878:18;24870:26;;24942:9;24936:4;24932:20;24928:1;24917:9;24913:17;24906:47;24970:131;25096:4;24970:131;:::i;:::-;24962:139;;24689:419;;;:::o;25114:234::-;25254:34;25250:1;25242:6;25238:14;25231:58;25323:17;25318:2;25310:6;25306:15;25299:42;25114:234;:::o;25354:366::-;25496:3;25517:67;25581:2;25576:3;25517:67;:::i;:::-;25510:74;;25593:93;25682:3;25593:93;:::i;:::-;25711:2;25706:3;25702:12;25695:19;;25354:366;;;:::o;25726:419::-;25892:4;25930:2;25919:9;25915:18;25907:26;;25979:9;25973:4;25969:20;25965:1;25954:9;25950:17;25943:47;26007:131;26133:4;26007:131;:::i;:::-;25999:139;;25726:419;;;:::o;26151:148::-;26253:11;26290:3;26275:18;;26151:148;;;;:::o;26305:377::-;26411:3;26439:39;26472:5;26439:39;:::i;:::-;26494:89;26576:6;26571:3;26494:89;:::i;:::-;26487:96;;26592:52;26637:6;26632:3;26625:4;26618:5;26614:16;26592:52;:::i;:::-;26669:6;26664:3;26660:16;26653:23;;26415:267;26305:377;;;;:::o;26688:435::-;26868:3;26890:95;26981:3;26972:6;26890:95;:::i;:::-;26883:102;;27002:95;27093:3;27084:6;27002:95;:::i;:::-;26995:102;;27114:3;27107:10;;26688:435;;;;;:::o;27129:231::-;27269:34;27265:1;27257:6;27253:14;27246:58;27338:14;27333:2;27325:6;27321:15;27314:39;27129:231;:::o;27366:366::-;27508:3;27529:67;27593:2;27588:3;27529:67;:::i;:::-;27522:74;;27605:93;27694:3;27605:93;:::i;:::-;27723:2;27718:3;27714:12;27707:19;;27366:366;;;:::o;27738:419::-;27904:4;27942:2;27931:9;27927:18;27919:26;;27991:9;27985:4;27981:20;27977:1;27966:9;27962:17;27955:47;28019:131;28145:4;28019:131;:::i;:::-;28011:139;;27738:419;;;:::o;28163:224::-;28303:34;28299:1;28291:6;28287:14;28280:58;28372:7;28367:2;28359:6;28355:15;28348:32;28163:224;:::o;28393:366::-;28535:3;28556:67;28620:2;28615:3;28556:67;:::i;:::-;28549:74;;28632:93;28721:3;28632:93;:::i;:::-;28750:2;28745:3;28741:12;28734:19;;28393:366;;;:::o;28765:419::-;28931:4;28969:2;28958:9;28954:18;28946:26;;29018:9;29012:4;29008:20;29004:1;28993:9;28989:17;28982:47;29046:131;29172:4;29046:131;:::i;:::-;29038:139;;28765:419;;;:::o;29190:223::-;29330:34;29326:1;29318:6;29314:14;29307:58;29399:6;29394:2;29386:6;29382:15;29375:31;29190:223;:::o;29419:366::-;29561:3;29582:67;29646:2;29641:3;29582:67;:::i;:::-;29575:74;;29658:93;29747:3;29658:93;:::i;:::-;29776:2;29771:3;29767:12;29760:19;;29419:366;;;:::o;29791:419::-;29957:4;29995:2;29984:9;29980:18;29972:26;;30044:9;30038:4;30034:20;30030:1;30019:9;30015:17;30008:47;30072:131;30198:4;30072:131;:::i;:::-;30064:139;;29791:419;;;:::o;30216:180::-;30264:77;30261:1;30254:88;30361:4;30358:1;30351:15;30385:4;30382:1;30375:15;30402:191;30442:4;30462:20;30480:1;30462:20;:::i;:::-;30457:25;;30496:20;30514:1;30496:20;:::i;:::-;30491:25;;30535:1;30532;30529:8;30526:34;;;30540:18;;:::i;:::-;30526:34;30585:1;30582;30578:9;30570:17;;30402:191;;;;:::o;30599:305::-;30639:3;30658:20;30676:1;30658:20;:::i;:::-;30653:25;;30692:20;30710:1;30692:20;:::i;:::-;30687:25;;30846:1;30778:66;30774:74;30771:1;30768:81;30765:107;;;30852:18;;:::i;:::-;30765:107;30896:1;30893;30889:9;30882:16;;30599:305;;;;:::o;30910:175::-;31050:27;31046:1;31038:6;31034:14;31027:51;30910:175;:::o;31091:366::-;31233:3;31254:67;31318:2;31313:3;31254:67;:::i;:::-;31247:74;;31330:93;31419:3;31330:93;:::i;:::-;31448:2;31443:3;31439:12;31432:19;;31091:366;;;:::o;31463:419::-;31629:4;31667:2;31656:9;31652:18;31644:26;;31716:9;31710:4;31706:20;31702:1;31691:9;31687:17;31680:47;31744:131;31870:4;31744:131;:::i;:::-;31736:139;;31463:419;;;:::o;31888:237::-;32028:34;32024:1;32016:6;32012:14;32005:58;32097:20;32092:2;32084:6;32080:15;32073:45;31888:237;:::o;32131:366::-;32273:3;32294:67;32358:2;32353:3;32294:67;:::i;:::-;32287:74;;32370:93;32459:3;32370:93;:::i;:::-;32488:2;32483:3;32479:12;32472:19;;32131:366;;;:::o;32503:419::-;32669:4;32707:2;32696:9;32692:18;32684:26;;32756:9;32750:4;32746:20;32742:1;32731:9;32727:17;32720:47;32784:131;32910:4;32784:131;:::i;:::-;32776:139;;32503:419;;;:::o;32928:233::-;32967:3;32990:24;33008:5;32990:24;:::i;:::-;32981:33;;33036:66;33029:5;33026:77;33023:103;;33106:18;;:::i;:::-;33023:103;33153:1;33146:5;33142:13;33135:20;;32928:233;;;:::o;33167:180::-;33215:77;33212:1;33205:88;33312:4;33309:1;33302:15;33336:4;33333:1;33326:15;33353:185;33393:1;33410:20;33428:1;33410:20;:::i;:::-;33405:25;;33444:20;33462:1;33444:20;:::i;:::-;33439:25;;33483:1;33473:35;;33488:18;;:::i;:::-;33473:35;33530:1;33527;33523:9;33518:14;;33353:185;;;;:::o;33544:176::-;33576:1;33593:20;33611:1;33593:20;:::i;:::-;33588:25;;33627:20;33645:1;33627:20;:::i;:::-;33622:25;;33666:1;33656:35;;33671:18;;:::i;:::-;33656:35;33712:1;33709;33705:9;33700:14;;33544:176;;;;:::o;33726:173::-;33866:25;33862:1;33854:6;33850:14;33843:49;33726:173;:::o;33905:402::-;34065:3;34086:85;34168:2;34163:3;34086:85;:::i;:::-;34079:92;;34180:93;34269:3;34180:93;:::i;:::-;34298:2;34293:3;34289:12;34282:19;;33905:402;;;:::o;34313:167::-;34453:19;34449:1;34441:6;34437:14;34430:43;34313:167;:::o;34486:402::-;34646:3;34667:85;34749:2;34744:3;34667:85;:::i;:::-;34660:92;;34761:93;34850:3;34761:93;:::i;:::-;34879:2;34874:3;34870:12;34863:19;;34486:402;;;:::o;34894:967::-;35276:3;35298:148;35442:3;35298:148;:::i;:::-;35291:155;;35463:95;35554:3;35545:6;35463:95;:::i;:::-;35456:102;;35575:148;35719:3;35575:148;:::i;:::-;35568:155;;35740:95;35831:3;35822:6;35740:95;:::i;:::-;35733:102;;35852:3;35845:10;;34894:967;;;;;:::o;35867:98::-;35918:6;35952:5;35946:12;35936:22;;35867:98;;;:::o;35971:168::-;36054:11;36088:6;36083:3;36076:19;36128:4;36123:3;36119:14;36104:29;;35971:168;;;;:::o;36145:360::-;36231:3;36259:38;36291:5;36259:38;:::i;:::-;36313:70;36376:6;36371:3;36313:70;:::i;:::-;36306:77;;36392:52;36437:6;36432:3;36425:4;36418:5;36414:16;36392:52;:::i;:::-;36469:29;36491:6;36469:29;:::i;:::-;36464:3;36460:39;36453:46;;36235:270;36145:360;;;;:::o;36511:640::-;36706:4;36744:3;36733:9;36729:19;36721:27;;36758:71;36826:1;36815:9;36811:17;36802:6;36758:71;:::i;:::-;36839:72;36907:2;36896:9;36892:18;36883:6;36839:72;:::i;:::-;36921;36989:2;36978:9;36974:18;36965:6;36921:72;:::i;:::-;37040:9;37034:4;37030:20;37025:2;37014:9;37010:18;37003:48;37068:76;37139:4;37130:6;37068:76;:::i;:::-;37060:84;;36511:640;;;;;;;:::o;37157:141::-;37213:5;37244:6;37238:13;37229:22;;37260:32;37286:5;37260:32;:::i;:::-;37157:141;;;;:::o;37304:349::-;37373:6;37422:2;37410:9;37401:7;37397:23;37393:32;37390:119;;;37428:79;;:::i;:::-;37390:119;37548:1;37573:63;37628:7;37619:6;37608:9;37604:22;37573:63;:::i;:::-;37563:73;;37519:127;37304:349;;;;:::o;37659:348::-;37699:7;37722:20;37740:1;37722:20;:::i;:::-;37717:25;;37756:20;37774:1;37756:20;:::i;:::-;37751:25;;37944:1;37876:66;37872:74;37869:1;37866:81;37861:1;37854:9;37847:17;37843:105;37840:131;;;37951:18;;:::i;:::-;37840:131;37999:1;37996;37992:9;37981:20;;37659:348;;;;:::o;38013:171::-;38052:3;38075:24;38093:5;38075:24;:::i;:::-;38066:33;;38121:4;38114:5;38111:15;38108:41;;38129:18;;:::i;:::-;38108:41;38176:1;38169:5;38165:13;38158:20;;38013:171;;;:::o;38190:182::-;38330:34;38326:1;38318:6;38314:14;38307:58;38190:182;:::o;38378:366::-;38520:3;38541:67;38605:2;38600:3;38541:67;:::i;:::-;38534:74;;38617:93;38706:3;38617:93;:::i;:::-;38735:2;38730:3;38726:12;38719:19;;38378:366;;;:::o;38750:419::-;38916:4;38954:2;38943:9;38939:18;38931:26;;39003:9;38997:4;38993:20;38989:1;38978:9;38974:17;38967:47;39031:131;39157:4;39031:131;:::i;:::-;39023:139;;38750:419;;;:::o;39175:182::-;39315:34;39311:1;39303:6;39299:14;39292:58;39175:182;:::o;39363:366::-;39505:3;39526:67;39590:2;39585:3;39526:67;:::i;:::-;39519:74;;39602:93;39691:3;39602:93;:::i;:::-;39720:2;39715:3;39711:12;39704:19;;39363:366;;;:::o;39735:419::-;39901:4;39939:2;39928:9;39924:18;39916:26;;39988:9;39982:4;39978:20;39974:1;39963:9;39959:17;39952:47;40016:131;40142:4;40016:131;:::i;:::-;40008:139;;39735:419;;;:::o;40160:178::-;40300:30;40296:1;40288:6;40284:14;40277:54;40160:178;:::o;40344:366::-;40486:3;40507:67;40571:2;40566:3;40507:67;:::i;:::-;40500:74;;40583:93;40672:3;40583:93;:::i;:::-;40701:2;40696:3;40692:12;40685:19;;40344:366;;;:::o;40716:419::-;40882:4;40920:2;40909:9;40905:18;40897:26;;40969:9;40963:4;40959:20;40955:1;40944:9;40940:17;40933:47;40997:131;41123:4;40997:131;:::i;:::-;40989:139;;40716:419;;;:::o;41141:180::-;41189:77;41186:1;41179:88;41286:4;41283:1;41276:15;41310:4;41307:1;41300:15

Swarm Source

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