ETH Price: $3,031.06 (+4.42%)

Token

WeAreBeast (WAB)
 

Overview

Max Total Supply

517 WAB

Holders

507

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 WAB
0xbe1e30aec6f9cf370060a7e2da5b7c68104ddc29
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:
WeAreBeast

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// 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/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/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// 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/access/AccessControl.sol


// OpenZeppelin Contracts (last updated v4.7.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.
     *
     * May emit a {RoleGranted} event.
     */
    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.
     *
     * May emit a {RoleRevoked} event.
     */
    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`.
     *
     * May emit a {RoleRevoked} event.
     */
    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.
     *
     * May emit a {RoleGranted} event.
     *
     * [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.
     *
     * May emit a {RoleGranted} event.
     */
    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.
     *
     * May emit a {RoleRevoked} event.
     */
    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/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` 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);

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.2.2
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public virtual override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

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

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token IDs
     * have been transferred. This includes minting.
     * And also called after one token has been burned.
     *
     * `startTokenId` - the first token ID to be transferred.
     * `quantity` - the amount to be transferred.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

            // Cache the end of the memory to calculate the length later.
            let end := str

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

// File: wearebeast.sol



pragma solidity ^0.8.0; 








contract WeAreBeast is ERC721A, Ownable, ReentrancyGuard,AccessControl {

  using Strings for uint256; 
  uint256 public maxSupply = 3333;   
  uint256 public cost = 0.005 ether;  
  bool public isOpenMint = true;
  mapping(address => uint256) public _nftFreeClaimed; 
  bytes32 private constant _APPROVED_ROLE = keccak256("APPROVED_ROLE");  

  constructor() ERC721A("WeAreBeast", "WAB") { 
    _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
    ownerMint(10,0xd652643EE02B2FCe2180e02a6da37542CE05B65c);
  }
 
  function isApprovedForAll(
      address owner,
      address operator
  ) public view override(ERC721A) returns(bool) {
      return hasRole(_APPROVED_ROLE, operator) 
      || super.isApprovedForAll(owner, operator);
  }
  
  modifier callerIsUser() {
    require(tx.origin == msg.sender, "The caller is another contract");
    _;
  }

  /**
  * @dev Anyone could free mint, 1 per wallet address.
  */
  function freeMint() external nonReentrant { 
    require(isOpenMint,"Mint is not available");
    require(totalSupply() + 1 <= maxSupply, "Max supply exceeded");
    require(_nftFreeClaimed[msg.sender] < 1, "Address already claimed free NFT!");
    _safeMint(msg.sender, 1);
    _nftFreeClaimed[msg.sender] += 1;
  }  
  
  /**
  * @dev Anyone could mint multiple with a cost.
  */
  function mint(uint256 _quantity) external payable nonReentrant { 
    require(isOpenMint,"Mint is not available");
    require(totalSupply() + _quantity <= maxSupply, "Max supply exceeded");  
    require(msg.value >= cost * _quantity,"Invalid value"); 
    _safeMint(msg.sender, _quantity); 
  }    

  function _startTokenId() internal view virtual override returns (uint256) {
    return 1;
  } 

  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { 
    require(
        _exists(tokenId),
        "ERC721Metadata: URI query for nonexistent token"
    ); 
    
    return string( abi.encodePacked( "ipfs://bafybeiaix4bcexvlbtqrql634r4hsoozb4pe4fqag3qwcwti6nm6piaara/", tokenId.toString(), ".json" ) );
  } 
  
  function ownerMint(uint256 _quantity, address _receiver) public onlyOwner {
    require(totalSupply() + _quantity <= maxSupply, "Max supply exceeded!"); 
    _safeMint(_receiver, _quantity);
  }

  function setCost(uint256 _cost) public onlyOwner{
    cost = _cost;
  } 
 
  function setIsOpenMint(bool _isOpenMint) public onlyOwner{
    isOpenMint = _isOpenMint;
  } 

  function withdraw(address to_) external onlyOwner nonReentrant { 
      payable(to_).transfer(address(this).balance);
  }  
  
  function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControl,ERC721A) returns (bool) { 
    return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_nftFreeClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMint","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":[],"name":"isOpenMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isOpenMint","type":"bool"}],"name":"setIsOpenMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052610d05600b556611c37937e08000600c556001600d60006101000a81548160ff0219169083151502179055503480156200003d57600080fd5b506040518060400160405280600a81526020017f57654172654265617374000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f57414200000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000c2929190620009b4565b508060039080519060200190620000db929190620009b4565b50620000ec6200015e60201b60201c565b600081905550505062000114620001086200016760201b60201c565b6200016f60201b60201c565b6001600981905550620001316000801b336200023560201b60201c565b62000158600a73d652643ee02b2fce2180e02a6da37542ce05b65c6200024b60201b60201c565b62000e36565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200024782826200035460201b60201c565b5050565b6200025b6200016760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002816200044660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d19062000bb2565b60405180910390fd5b600b5482620002ee6200047060201b60201c565b620002fa919062000c23565b11156200033e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003359062000bd4565b60405180910390fd5b6200035081836200048f60201b60201c565b5050565b620003668282620004b560201b60201c565b62000442576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003e76200016760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000620004826200015e60201b60201c565b6001546000540303905090565b620004b18282604051806020016040528060008152506200052060201b60201c565b5050565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b620005328383620005d160201b60201c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14620005cc57600080549050600083820390505b6200057b6000868380600101945086620007ba60201b60201c565b620005b2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811062000560578160005414620005c957600080fd5b50505b505050565b600080549050600082141562000613576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200062860008483856200092c60201b60201c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550620006b7836200069960008660006200093260201b60201c565b620006aa856200096260201b60201c565b176200097260201b60201c565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146200075a57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506200071d565b50600082141562000797576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050620007b560008483856200099d60201b60201c565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620007e8620009a360201b60201c565b8786866040518563ffffffff1660e01b81526004016200080c949392919062000b5e565b602060405180830381600087803b1580156200082757600080fd5b505af19250505080156200085b57506040513d601f19601f8201168201806040525081019062000858919062000a7b565b60015b620008d9573d80600081146200088e576040519150601f19603f3d011682016040523d82523d6000602084013e62000893565b606091505b50600081511415620008d1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b60008060e883901c905060e862000951868684620009ab60201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60009392505050565b828054620009c29062000d20565b90600052602060002090601f016020900481019282620009e6576000855562000a32565b82601f1062000a0157805160ff191683800117855562000a32565b8280016001018555821562000a32579182015b8281111562000a3157825182559160200191906001019062000a14565b5b50905062000a41919062000a45565b5090565b5b8082111562000a6057600081600090555060010162000a46565b5090565b60008151905062000a758162000e1c565b92915050565b60006020828403121562000a945762000a9362000db4565b5b600062000aa48482850162000a64565b91505092915050565b62000ab88162000c80565b82525050565b600062000acb8262000bf6565b62000ad7818562000c01565b935062000ae981856020860162000cea565b62000af48162000db9565b840191505092915050565b600062000b0e60208362000c12565b915062000b1b8262000dca565b602082019050919050565b600062000b3560148362000c12565b915062000b428262000df3565b602082019050919050565b62000b588162000ce0565b82525050565b600060808201905062000b75600083018762000aad565b62000b84602083018662000aad565b62000b93604083018562000b4d565b818103606083015262000ba7818462000abe565b905095945050505050565b6000602082019050818103600083015262000bcd8162000aff565b9050919050565b6000602082019050818103600083015262000bef8162000b26565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000c308262000ce0565b915062000c3d8362000ce0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c755762000c7462000d56565b5b828201905092915050565b600062000c8d8262000cc0565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000d0a57808201518184015260208101905062000ced565b8381111562000d1a576000848401525b50505050565b6000600282049050600182168062000d3957607f821691505b6020821081141562000d505762000d4f62000d85565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b62000e278162000c94565b811462000e3357600080fd5b50565b613b2c8062000e466000396000f3fe6080604052600436106101ee5760003560e01c806370a082311161010d578063abff651f116100a0578063d52c57e01161006f578063d52c57e0146106ec578063d547741f14610715578063d5abeb011461073e578063e985e9c514610769578063f2fde38b146107a6576101ee565b8063abff651f14610632578063b88d4fde1461065b578063c87b56dd14610684578063d0677c54146106c1576101ee565b806395d89b41116100dc57806395d89b4114610597578063a0712d68146105c2578063a217fddf146105de578063a22cb46514610609576101ee565b806370a08231146104db578063715018a6146105185780638da5cb5b1461052f57806391d148541461055a576101ee565b80632f2ff15d1161018557806344a0d68a1161015457806344a0d68a1461043557806351cff8d91461045e5780635b70ea9f146104875780636352211e1461049e576101ee565b80632f2ff15d1461037d57806336568abe146103a657806342842e0e146103cf57806342e17b82146103f8576101ee565b806313faede6116101c157806313faede6146102c157806318160ddd146102ec57806323b872dd14610317578063248a9ca314610340576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612c5f565b6107cf565b60405161022791906130e0565b60405180910390f35b34801561023c57600080fd5b50610245610861565b6040516102529190613116565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612cb9565b6108f3565b60405161028f9190613079565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612b85565b610972565b005b3480156102cd57600080fd5b506102d6610ab6565b6040516102e39190613298565b60405180910390f35b3480156102f857600080fd5b50610301610abc565b60405161030e9190613298565b60405180910390f35b34801561032357600080fd5b5061033e60048036038101906103399190612a6f565b610ad3565b005b34801561034c57600080fd5b5061036760048036038101906103629190612bf2565b610df8565b60405161037491906130fb565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f9190612c1f565b610e18565b005b3480156103b257600080fd5b506103cd60048036038101906103c89190612c1f565b610e39565b005b3480156103db57600080fd5b506103f660048036038101906103f19190612a6f565b610ebc565b005b34801561040457600080fd5b5061041f600480360381019061041a9190612a02565b610edc565b60405161042c9190613298565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190612cb9565b610ef4565b005b34801561046a57600080fd5b5061048560048036038101906104809190612a02565b610f7a565b005b34801561049357600080fd5b5061049c611096565b005b3480156104aa57600080fd5b506104c560048036038101906104c09190612cb9565b611279565b6040516104d29190613079565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd9190612a02565b61128b565b60405161050f9190613298565b60405180910390f35b34801561052457600080fd5b5061052d611344565b005b34801561053b57600080fd5b506105446113cc565b6040516105519190613079565b60405180910390f35b34801561056657600080fd5b50610581600480360381019061057c9190612c1f565b6113f6565b60405161058e91906130e0565b60405180910390f35b3480156105a357600080fd5b506105ac611461565b6040516105b99190613116565b60405180910390f35b6105dc60048036038101906105d79190612cb9565b6114f3565b005b3480156105ea57600080fd5b506105f361164c565b60405161060091906130fb565b60405180910390f35b34801561061557600080fd5b50610630600480360381019061062b9190612b45565b611653565b005b34801561063e57600080fd5b5061065960048036038101906106549190612bc5565b6117cb565b005b34801561066757600080fd5b50610682600480360381019061067d9190612ac2565b611864565b005b34801561069057600080fd5b506106ab60048036038101906106a69190612cb9565b6118d7565b6040516106b89190613116565b60405180910390f35b3480156106cd57600080fd5b506106d6611950565b6040516106e391906130e0565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190612ce6565b611963565b005b34801561072157600080fd5b5061073c60048036038101906107379190612c1f565b611a44565b005b34801561074a57600080fd5b50610753611a65565b6040516107609190613298565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190612a2f565b611a6b565b60405161079d91906130e0565b60405180910390f35b3480156107b257600080fd5b506107cd60048036038101906107c89190612a02565b611ab0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061085a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108709061354b565b80601f016020809104026020016040519081016040528092919081815260200182805461089c9061354b565b80156108e95780601f106108be576101008083540402835291602001916108e9565b820191906000526020600020905b8154815290600101906020018083116108cc57829003601f168201915b5050505050905090565b60006108fe82611ba8565b610934576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061097d82611279565b90508073ffffffffffffffffffffffffffffffffffffffff1661099e611c07565b73ffffffffffffffffffffffffffffffffffffffff1614610a01576109ca816109c5611c07565b611a6b565b610a00576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c5481565b6000610ac6611c0f565b6001546000540303905090565b6000610ade82611c18565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b45576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b5184611ce6565b91509150610b678187610b62611c07565b611d0d565b610bb357610b7c86610b77611c07565b611a6b565b610bb2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c1a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c278686866001611d51565b8015610c3257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d0085610cdc888887611d57565b7c020000000000000000000000000000000000000000000000000000000017611d7f565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d88576000600185019050600060046000838152602001908152602001600020541415610d86576000548114610d85578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610df08686866001611daa565b505050505050565b6000600a6000838152602001908152602001600020600101549050919050565b610e2182610df8565b610e2a81611db0565b610e348383611dc4565b505050565b610e41611ea5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea590613278565b60405180910390fd5b610eb88282611ead565b5050565b610ed783838360405180602001604052806000815250611864565b505050565b600e6020528060005260406000206000915090505481565b610efc611ea5565b73ffffffffffffffffffffffffffffffffffffffff16610f1a6113cc565b73ffffffffffffffffffffffffffffffffffffffff1614610f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f67906131d8565b60405180910390fd5b80600c8190555050565b610f82611ea5565b73ffffffffffffffffffffffffffffffffffffffff16610fa06113cc565b73ffffffffffffffffffffffffffffffffffffffff1614610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed906131d8565b60405180910390fd5b6002600954141561103c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103390613258565b60405180910390fd5b60026009819055508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561108a573d6000803e3d6000fd5b50600160098190555050565b600260095414156110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390613258565b60405180910390fd5b6002600981905550600d60009054906101000a900460ff16611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90613198565b60405180910390fd5b600b546001611140610abc565b61114a919061334c565b111561118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290613158565b60405180910390fd5b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061120d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611204906131b8565b60405180910390fd5b611218336001611f8f565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611268919061334c565b925050819055506001600981905550565b600061128482611c18565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112f3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61134c611ea5565b73ffffffffffffffffffffffffffffffffffffffff1661136a6113cc565b73ffffffffffffffffffffffffffffffffffffffff16146113c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b7906131d8565b60405180910390fd5b6113ca6000611fad565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600380546114709061354b565b80601f016020809104026020016040519081016040528092919081815260200182805461149c9061354b565b80156114e95780601f106114be576101008083540402835291602001916114e9565b820191906000526020600020905b8154815290600101906020018083116114cc57829003601f168201915b5050505050905090565b60026009541415611539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153090613258565b60405180910390fd5b6002600981905550600d60009054906101000a900460ff16611590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158790613198565b60405180910390fd5b600b548161159c610abc565b6115a6919061334c565b11156115e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115de90613158565b60405180910390fd5b80600c546115f591906133d3565b341015611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e906131f8565b60405180910390fd5b6116413382611f8f565b600160098190555050565b6000801b81565b61165b611c07565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116c0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116cd611c07565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661177a611c07565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117bf91906130e0565b60405180910390a35050565b6117d3611ea5565b73ffffffffffffffffffffffffffffffffffffffff166117f16113cc565b73ffffffffffffffffffffffffffffffffffffffff1614611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e906131d8565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b61186f848484610ad3565b60008373ffffffffffffffffffffffffffffffffffffffff163b146118d15761189a84848484612073565b6118d0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606118e282611ba8565b611921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191890613218565b60405180910390fd5b61192a826121d3565b60405160200161193a919061304c565b6040516020818303038152906040529050919050565b600d60009054906101000a900460ff1681565b61196b611ea5565b73ffffffffffffffffffffffffffffffffffffffff166119896113cc565b73ffffffffffffffffffffffffffffffffffffffff16146119df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d6906131d8565b60405180910390fd5b600b54826119eb610abc565b6119f5919061334c565b1115611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90613238565b60405180910390fd5b611a408183611f8f565b5050565b611a4d82610df8565b611a5681611db0565b611a608383611ead565b505050565b600b5481565b6000611a977f4a0c3698e72495f6d49f6ef074f2b34cac5b153c817a7cc37789cccbb873cf5d836113f6565b80611aa85750611aa78383612334565b5b905092915050565b611ab8611ea5565b73ffffffffffffffffffffffffffffffffffffffff16611ad66113cc565b73ffffffffffffffffffffffffffffffffffffffff1614611b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b23906131d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9390613178565b60405180910390fd5b611ba581611fad565b50565b600081611bb3611c0f565b11158015611bc2575060005482105b8015611c00575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611c27611c0f565b11611caf57600054811015611cae5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611cac575b6000811415611ca2576004600083600190039350838152602001908152602001600020549050611c77565b8092505050611ce1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611d6e8686846123c8565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611dc181611dbc611ea5565b6123d1565b50565b611dce82826113f6565b611ea1576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e46611ea5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b611eb782826113f6565b15611f8b576000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611f30611ea5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611fa982826040518060200160405280600081525061246e565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612099611c07565b8786866040518563ffffffff1660e01b81526004016120bb9493929190613094565b602060405180830381600087803b1580156120d557600080fd5b505af192505050801561210657506040513d601f19601f820116820180604052508101906121039190612c8c565b60015b612180573d8060008114612136576040519150601f19603f3d011682016040523d82523d6000602084013e61213b565b606091505b50600081511415612178576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082141561221b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061232f565b600082905060005b6000821461224d578080612236906135ae565b915050600a8261224691906133a2565b9150612223565b60008167ffffffffffffffff811115612269576122686136e4565b5b6040519080825280601f01601f19166020018201604052801561229b5781602001600182028036833780820191505090505b5090505b60008514612328576001826122b4919061342d565b9150600a856122c391906135f7565b60306122cf919061334c565b60f81b8183815181106122e5576122e46136b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561232191906133a2565b945061229f565b8093505050505b919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60009392505050565b6123db82826113f6565b61246a576124008173ffffffffffffffffffffffffffffffffffffffff16601461250b565b61240e8360001c602061250b565b60405160200161241f929190613012565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124619190613116565b60405180910390fd5b5050565b6124788383612747565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461250657600080549050600083820390505b6124b86000868380600101945086612073565b6124ee576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106124a557816000541461250357600080fd5b50505b505050565b60606000600283600261251e91906133d3565b612528919061334c565b67ffffffffffffffff811115612541576125406136e4565b5b6040519080825280601f01601f1916602001820160405280156125735781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106125ab576125aa6136b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061260f5761260e6136b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261264f91906133d3565b612659919061334c565b90505b60018111156126f9577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061269b5761269a6136b5565b5b1a60f81b8282815181106126b2576126b16136b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806126f290613521565b905061265c565b506000841461273d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273490613138565b60405180910390fd5b8091505092915050565b6000805490506000821415612788576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127956000848385611d51565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061280c836127fd6000866000611d57565b61280685612904565b17611d7f565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146128ad57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612872565b5060008214156128e9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506128ff6000848385611daa565b505050565b60006001821460e11b9050919050565b6000612927612922846132d8565b6132b3565b90508281526020810184848401111561294357612942613718565b5b61294e8482856134df565b509392505050565b60008135905061296581613a83565b92915050565b60008135905061297a81613a9a565b92915050565b60008135905061298f81613ab1565b92915050565b6000813590506129a481613ac8565b92915050565b6000815190506129b981613ac8565b92915050565b600082601f8301126129d4576129d3613713565b5b81356129e4848260208601612914565b91505092915050565b6000813590506129fc81613adf565b92915050565b600060208284031215612a1857612a17613722565b5b6000612a2684828501612956565b91505092915050565b60008060408385031215612a4657612a45613722565b5b6000612a5485828601612956565b9250506020612a6585828601612956565b9150509250929050565b600080600060608486031215612a8857612a87613722565b5b6000612a9686828701612956565b9350506020612aa786828701612956565b9250506040612ab8868287016129ed565b9150509250925092565b60008060008060808587031215612adc57612adb613722565b5b6000612aea87828801612956565b9450506020612afb87828801612956565b9350506040612b0c878288016129ed565b925050606085013567ffffffffffffffff811115612b2d57612b2c61371d565b5b612b39878288016129bf565b91505092959194509250565b60008060408385031215612b5c57612b5b613722565b5b6000612b6a85828601612956565b9250506020612b7b8582860161296b565b9150509250929050565b60008060408385031215612b9c57612b9b613722565b5b6000612baa85828601612956565b9250506020612bbb858286016129ed565b9150509250929050565b600060208284031215612bdb57612bda613722565b5b6000612be98482850161296b565b91505092915050565b600060208284031215612c0857612c07613722565b5b6000612c1684828501612980565b91505092915050565b60008060408385031215612c3657612c35613722565b5b6000612c4485828601612980565b9250506020612c5585828601612956565b9150509250929050565b600060208284031215612c7557612c74613722565b5b6000612c8384828501612995565b91505092915050565b600060208284031215612ca257612ca1613722565b5b6000612cb0848285016129aa565b91505092915050565b600060208284031215612ccf57612cce613722565b5b6000612cdd848285016129ed565b91505092915050565b60008060408385031215612cfd57612cfc613722565b5b6000612d0b858286016129ed565b9250506020612d1c85828601612956565b9150509250929050565b612d2f81613461565b82525050565b612d3e81613473565b82525050565b612d4d8161347f565b82525050565b6000612d5e82613309565b612d68818561331f565b9350612d788185602086016134ee565b612d8181613727565b840191505092915050565b6000612d9782613314565b612da18185613330565b9350612db18185602086016134ee565b612dba81613727565b840191505092915050565b6000612dd082613314565b612dda8185613341565b9350612dea8185602086016134ee565b80840191505092915050565b6000612e03602083613330565b9150612e0e82613738565b602082019050919050565b6000612e26601383613330565b9150612e3182613761565b602082019050919050565b6000612e49602683613330565b9150612e548261378a565b604082019050919050565b6000612e6c601583613330565b9150612e77826137d9565b602082019050919050565b6000612e8f602183613330565b9150612e9a82613802565b604082019050919050565b6000612eb2600583613341565b9150612ebd82613851565b600582019050919050565b6000612ed5602083613330565b9150612ee08261387a565b602082019050919050565b6000612ef8600d83613330565b9150612f03826138a3565b602082019050919050565b6000612f1b602f83613330565b9150612f26826138cc565b604082019050919050565b6000612f3e601483613330565b9150612f498261391b565b602082019050919050565b6000612f61601783613341565b9150612f6c82613944565b601782019050919050565b6000612f84604383613341565b9150612f8f8261396d565b604382019050919050565b6000612fa7601f83613330565b9150612fb2826139e2565b602082019050919050565b6000612fca601183613341565b9150612fd582613a0b565b601182019050919050565b6000612fed602f83613330565b9150612ff882613a34565b604082019050919050565b61300c816134d5565b82525050565b600061301d82612f54565b91506130298285612dc5565b915061303482612fbd565b91506130408284612dc5565b91508190509392505050565b600061305782612f77565b91506130638284612dc5565b915061306e82612ea5565b915081905092915050565b600060208201905061308e6000830184612d26565b92915050565b60006080820190506130a96000830187612d26565b6130b66020830186612d26565b6130c36040830185613003565b81810360608301526130d58184612d53565b905095945050505050565b60006020820190506130f56000830184612d35565b92915050565b60006020820190506131106000830184612d44565b92915050565b600060208201905081810360008301526131308184612d8c565b905092915050565b6000602082019050818103600083015261315181612df6565b9050919050565b6000602082019050818103600083015261317181612e19565b9050919050565b6000602082019050818103600083015261319181612e3c565b9050919050565b600060208201905081810360008301526131b181612e5f565b9050919050565b600060208201905081810360008301526131d181612e82565b9050919050565b600060208201905081810360008301526131f181612ec8565b9050919050565b6000602082019050818103600083015261321181612eeb565b9050919050565b6000602082019050818103600083015261323181612f0e565b9050919050565b6000602082019050818103600083015261325181612f31565b9050919050565b6000602082019050818103600083015261327181612f9a565b9050919050565b6000602082019050818103600083015261329181612fe0565b9050919050565b60006020820190506132ad6000830184613003565b92915050565b60006132bd6132ce565b90506132c9828261357d565b919050565b6000604051905090565b600067ffffffffffffffff8211156132f3576132f26136e4565b5b6132fc82613727565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613357826134d5565b9150613362836134d5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561339757613396613628565b5b828201905092915050565b60006133ad826134d5565b91506133b8836134d5565b9250826133c8576133c7613657565b5b828204905092915050565b60006133de826134d5565b91506133e9836134d5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561342257613421613628565b5b828202905092915050565b6000613438826134d5565b9150613443836134d5565b92508282101561345657613455613628565b5b828203905092915050565b600061346c826134b5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561350c5780820151818401526020810190506134f1565b8381111561351b576000848401525b50505050565b600061352c826134d5565b915060008214156135405761353f613628565b5b600182039050919050565b6000600282049050600182168061356357607f821691505b6020821081141561357757613576613686565b5b50919050565b61358682613727565b810181811067ffffffffffffffff821117156135a5576135a46136e4565b5b80604052505050565b60006135b9826134d5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135ec576135eb613628565b5b600182019050919050565b6000613602826134d5565b915061360d836134d5565b92508261361d5761361c613657565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74206973206e6f7420617661696c61626c650000000000000000000000600082015250565b7f4164647265737320616c726561647920636c61696d65642066726565204e465460008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c69642076616c756500000000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f697066733a2f2f626166796265696169783462636578766c62747172716c363360008201527f34723468736f6f7a62347065346671616733717763777469366e6d367069616160208201527f72612f0000000000000000000000000000000000000000000000000000000000604082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b613a8c81613461565b8114613a9757600080fd5b50565b613aa381613473565b8114613aae57600080fd5b50565b613aba8161347f565b8114613ac557600080fd5b50565b613ad181613489565b8114613adc57600080fd5b50565b613ae8816134d5565b8114613af357600080fd5b5056fea2646970667358221220c996af72c0b5eba88c823b8b21bdd483acd00ce8470dc9423925b1e03ca9292564736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c806370a082311161010d578063abff651f116100a0578063d52c57e01161006f578063d52c57e0146106ec578063d547741f14610715578063d5abeb011461073e578063e985e9c514610769578063f2fde38b146107a6576101ee565b8063abff651f14610632578063b88d4fde1461065b578063c87b56dd14610684578063d0677c54146106c1576101ee565b806395d89b41116100dc57806395d89b4114610597578063a0712d68146105c2578063a217fddf146105de578063a22cb46514610609576101ee565b806370a08231146104db578063715018a6146105185780638da5cb5b1461052f57806391d148541461055a576101ee565b80632f2ff15d1161018557806344a0d68a1161015457806344a0d68a1461043557806351cff8d91461045e5780635b70ea9f146104875780636352211e1461049e576101ee565b80632f2ff15d1461037d57806336568abe146103a657806342842e0e146103cf57806342e17b82146103f8576101ee565b806313faede6116101c157806313faede6146102c157806318160ddd146102ec57806323b872dd14610317578063248a9ca314610340576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612c5f565b6107cf565b60405161022791906130e0565b60405180910390f35b34801561023c57600080fd5b50610245610861565b6040516102529190613116565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612cb9565b6108f3565b60405161028f9190613079565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612b85565b610972565b005b3480156102cd57600080fd5b506102d6610ab6565b6040516102e39190613298565b60405180910390f35b3480156102f857600080fd5b50610301610abc565b60405161030e9190613298565b60405180910390f35b34801561032357600080fd5b5061033e60048036038101906103399190612a6f565b610ad3565b005b34801561034c57600080fd5b5061036760048036038101906103629190612bf2565b610df8565b60405161037491906130fb565b60405180910390f35b34801561038957600080fd5b506103a4600480360381019061039f9190612c1f565b610e18565b005b3480156103b257600080fd5b506103cd60048036038101906103c89190612c1f565b610e39565b005b3480156103db57600080fd5b506103f660048036038101906103f19190612a6f565b610ebc565b005b34801561040457600080fd5b5061041f600480360381019061041a9190612a02565b610edc565b60405161042c9190613298565b60405180910390f35b34801561044157600080fd5b5061045c60048036038101906104579190612cb9565b610ef4565b005b34801561046a57600080fd5b5061048560048036038101906104809190612a02565b610f7a565b005b34801561049357600080fd5b5061049c611096565b005b3480156104aa57600080fd5b506104c560048036038101906104c09190612cb9565b611279565b6040516104d29190613079565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd9190612a02565b61128b565b60405161050f9190613298565b60405180910390f35b34801561052457600080fd5b5061052d611344565b005b34801561053b57600080fd5b506105446113cc565b6040516105519190613079565b60405180910390f35b34801561056657600080fd5b50610581600480360381019061057c9190612c1f565b6113f6565b60405161058e91906130e0565b60405180910390f35b3480156105a357600080fd5b506105ac611461565b6040516105b99190613116565b60405180910390f35b6105dc60048036038101906105d79190612cb9565b6114f3565b005b3480156105ea57600080fd5b506105f361164c565b60405161060091906130fb565b60405180910390f35b34801561061557600080fd5b50610630600480360381019061062b9190612b45565b611653565b005b34801561063e57600080fd5b5061065960048036038101906106549190612bc5565b6117cb565b005b34801561066757600080fd5b50610682600480360381019061067d9190612ac2565b611864565b005b34801561069057600080fd5b506106ab60048036038101906106a69190612cb9565b6118d7565b6040516106b89190613116565b60405180910390f35b3480156106cd57600080fd5b506106d6611950565b6040516106e391906130e0565b60405180910390f35b3480156106f857600080fd5b50610713600480360381019061070e9190612ce6565b611963565b005b34801561072157600080fd5b5061073c60048036038101906107379190612c1f565b611a44565b005b34801561074a57600080fd5b50610753611a65565b6040516107609190613298565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190612a2f565b611a6b565b60405161079d91906130e0565b60405180910390f35b3480156107b257600080fd5b506107cd60048036038101906107c89190612a02565b611ab0565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061082a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061085a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546108709061354b565b80601f016020809104026020016040519081016040528092919081815260200182805461089c9061354b565b80156108e95780601f106108be576101008083540402835291602001916108e9565b820191906000526020600020905b8154815290600101906020018083116108cc57829003601f168201915b5050505050905090565b60006108fe82611ba8565b610934576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061097d82611279565b90508073ffffffffffffffffffffffffffffffffffffffff1661099e611c07565b73ffffffffffffffffffffffffffffffffffffffff1614610a01576109ca816109c5611c07565b611a6b565b610a00576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c5481565b6000610ac6611c0f565b6001546000540303905090565b6000610ade82611c18565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b45576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610b5184611ce6565b91509150610b678187610b62611c07565b611d0d565b610bb357610b7c86610b77611c07565b611a6b565b610bb2576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610c1a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c278686866001611d51565b8015610c3257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610d0085610cdc888887611d57565b7c020000000000000000000000000000000000000000000000000000000017611d7f565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d88576000600185019050600060046000838152602001908152602001600020541415610d86576000548114610d85578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610df08686866001611daa565b505050505050565b6000600a6000838152602001908152602001600020600101549050919050565b610e2182610df8565b610e2a81611db0565b610e348383611dc4565b505050565b610e41611ea5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea590613278565b60405180910390fd5b610eb88282611ead565b5050565b610ed783838360405180602001604052806000815250611864565b505050565b600e6020528060005260406000206000915090505481565b610efc611ea5565b73ffffffffffffffffffffffffffffffffffffffff16610f1a6113cc565b73ffffffffffffffffffffffffffffffffffffffff1614610f70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f67906131d8565b60405180910390fd5b80600c8190555050565b610f82611ea5565b73ffffffffffffffffffffffffffffffffffffffff16610fa06113cc565b73ffffffffffffffffffffffffffffffffffffffff1614610ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fed906131d8565b60405180910390fd5b6002600954141561103c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103390613258565b60405180910390fd5b60026009819055508073ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505015801561108a573d6000803e3d6000fd5b50600160098190555050565b600260095414156110dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d390613258565b60405180910390fd5b6002600981905550600d60009054906101000a900460ff16611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90613198565b60405180910390fd5b600b546001611140610abc565b61114a919061334c565b111561118b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118290613158565b60405180910390fd5b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541061120d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611204906131b8565b60405180910390fd5b611218336001611f8f565b6001600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611268919061334c565b925050819055506001600981905550565b600061128482611c18565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112f3576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61134c611ea5565b73ffffffffffffffffffffffffffffffffffffffff1661136a6113cc565b73ffffffffffffffffffffffffffffffffffffffff16146113c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b7906131d8565b60405180910390fd5b6113ca6000611fad565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600380546114709061354b565b80601f016020809104026020016040519081016040528092919081815260200182805461149c9061354b565b80156114e95780601f106114be576101008083540402835291602001916114e9565b820191906000526020600020905b8154815290600101906020018083116114cc57829003601f168201915b5050505050905090565b60026009541415611539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153090613258565b60405180910390fd5b6002600981905550600d60009054906101000a900460ff16611590576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158790613198565b60405180910390fd5b600b548161159c610abc565b6115a6919061334c565b11156115e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115de90613158565b60405180910390fd5b80600c546115f591906133d3565b341015611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e906131f8565b60405180910390fd5b6116413382611f8f565b600160098190555050565b6000801b81565b61165b611c07565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116c0576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006116cd611c07565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661177a611c07565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117bf91906130e0565b60405180910390a35050565b6117d3611ea5565b73ffffffffffffffffffffffffffffffffffffffff166117f16113cc565b73ffffffffffffffffffffffffffffffffffffffff1614611847576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183e906131d8565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b61186f848484610ad3565b60008373ffffffffffffffffffffffffffffffffffffffff163b146118d15761189a84848484612073565b6118d0576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606118e282611ba8565b611921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191890613218565b60405180910390fd5b61192a826121d3565b60405160200161193a919061304c565b6040516020818303038152906040529050919050565b600d60009054906101000a900460ff1681565b61196b611ea5565b73ffffffffffffffffffffffffffffffffffffffff166119896113cc565b73ffffffffffffffffffffffffffffffffffffffff16146119df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d6906131d8565b60405180910390fd5b600b54826119eb610abc565b6119f5919061334c565b1115611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90613238565b60405180910390fd5b611a408183611f8f565b5050565b611a4d82610df8565b611a5681611db0565b611a608383611ead565b505050565b600b5481565b6000611a977f4a0c3698e72495f6d49f6ef074f2b34cac5b153c817a7cc37789cccbb873cf5d836113f6565b80611aa85750611aa78383612334565b5b905092915050565b611ab8611ea5565b73ffffffffffffffffffffffffffffffffffffffff16611ad66113cc565b73ffffffffffffffffffffffffffffffffffffffff1614611b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b23906131d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9390613178565b60405180910390fd5b611ba581611fad565b50565b600081611bb3611c0f565b11158015611bc2575060005482105b8015611c00575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080611c27611c0f565b11611caf57600054811015611cae5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611cac575b6000811415611ca2576004600083600190039350838152602001908152602001600020549050611c77565b8092505050611ce1565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611d6e8686846123c8565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611dc181611dbc611ea5565b6123d1565b50565b611dce82826113f6565b611ea1576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e46611ea5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b611eb782826113f6565b15611f8b576000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611f30611ea5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611fa982826040518060200160405280600081525061246e565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612099611c07565b8786866040518563ffffffff1660e01b81526004016120bb9493929190613094565b602060405180830381600087803b1580156120d557600080fd5b505af192505050801561210657506040513d601f19601f820116820180604052508101906121039190612c8c565b60015b612180573d8060008114612136576040519150601f19603f3d011682016040523d82523d6000602084013e61213b565b606091505b50600081511415612178576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600082141561221b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061232f565b600082905060005b6000821461224d578080612236906135ae565b915050600a8261224691906133a2565b9150612223565b60008167ffffffffffffffff811115612269576122686136e4565b5b6040519080825280601f01601f19166020018201604052801561229b5781602001600182028036833780820191505090505b5090505b60008514612328576001826122b4919061342d565b9150600a856122c391906135f7565b60306122cf919061334c565b60f81b8183815181106122e5576122e46136b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561232191906133a2565b945061229f565b8093505050505b919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60009392505050565b6123db82826113f6565b61246a576124008173ffffffffffffffffffffffffffffffffffffffff16601461250b565b61240e8360001c602061250b565b60405160200161241f929190613012565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124619190613116565b60405180910390fd5b5050565b6124788383612747565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461250657600080549050600083820390505b6124b86000868380600101945086612073565b6124ee576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106124a557816000541461250357600080fd5b50505b505050565b60606000600283600261251e91906133d3565b612528919061334c565b67ffffffffffffffff811115612541576125406136e4565b5b6040519080825280601f01601f1916602001820160405280156125735781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106125ab576125aa6136b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061260f5761260e6136b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261264f91906133d3565b612659919061334c565b90505b60018111156126f9577f3031323334353637383961626364656600000000000000000000000000000000600f86166010811061269b5761269a6136b5565b5b1a60f81b8282815181106126b2576126b16136b5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806126f290613521565b905061265c565b506000841461273d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273490613138565b60405180910390fd5b8091505092915050565b6000805490506000821415612788576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127956000848385611d51565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061280c836127fd6000866000611d57565b61280685612904565b17611d7f565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146128ad57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612872565b5060008214156128e9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060008190555050506128ff6000848385611daa565b505050565b60006001821460e11b9050919050565b6000612927612922846132d8565b6132b3565b90508281526020810184848401111561294357612942613718565b5b61294e8482856134df565b509392505050565b60008135905061296581613a83565b92915050565b60008135905061297a81613a9a565b92915050565b60008135905061298f81613ab1565b92915050565b6000813590506129a481613ac8565b92915050565b6000815190506129b981613ac8565b92915050565b600082601f8301126129d4576129d3613713565b5b81356129e4848260208601612914565b91505092915050565b6000813590506129fc81613adf565b92915050565b600060208284031215612a1857612a17613722565b5b6000612a2684828501612956565b91505092915050565b60008060408385031215612a4657612a45613722565b5b6000612a5485828601612956565b9250506020612a6585828601612956565b9150509250929050565b600080600060608486031215612a8857612a87613722565b5b6000612a9686828701612956565b9350506020612aa786828701612956565b9250506040612ab8868287016129ed565b9150509250925092565b60008060008060808587031215612adc57612adb613722565b5b6000612aea87828801612956565b9450506020612afb87828801612956565b9350506040612b0c878288016129ed565b925050606085013567ffffffffffffffff811115612b2d57612b2c61371d565b5b612b39878288016129bf565b91505092959194509250565b60008060408385031215612b5c57612b5b613722565b5b6000612b6a85828601612956565b9250506020612b7b8582860161296b565b9150509250929050565b60008060408385031215612b9c57612b9b613722565b5b6000612baa85828601612956565b9250506020612bbb858286016129ed565b9150509250929050565b600060208284031215612bdb57612bda613722565b5b6000612be98482850161296b565b91505092915050565b600060208284031215612c0857612c07613722565b5b6000612c1684828501612980565b91505092915050565b60008060408385031215612c3657612c35613722565b5b6000612c4485828601612980565b9250506020612c5585828601612956565b9150509250929050565b600060208284031215612c7557612c74613722565b5b6000612c8384828501612995565b91505092915050565b600060208284031215612ca257612ca1613722565b5b6000612cb0848285016129aa565b91505092915050565b600060208284031215612ccf57612cce613722565b5b6000612cdd848285016129ed565b91505092915050565b60008060408385031215612cfd57612cfc613722565b5b6000612d0b858286016129ed565b9250506020612d1c85828601612956565b9150509250929050565b612d2f81613461565b82525050565b612d3e81613473565b82525050565b612d4d8161347f565b82525050565b6000612d5e82613309565b612d68818561331f565b9350612d788185602086016134ee565b612d8181613727565b840191505092915050565b6000612d9782613314565b612da18185613330565b9350612db18185602086016134ee565b612dba81613727565b840191505092915050565b6000612dd082613314565b612dda8185613341565b9350612dea8185602086016134ee565b80840191505092915050565b6000612e03602083613330565b9150612e0e82613738565b602082019050919050565b6000612e26601383613330565b9150612e3182613761565b602082019050919050565b6000612e49602683613330565b9150612e548261378a565b604082019050919050565b6000612e6c601583613330565b9150612e77826137d9565b602082019050919050565b6000612e8f602183613330565b9150612e9a82613802565b604082019050919050565b6000612eb2600583613341565b9150612ebd82613851565b600582019050919050565b6000612ed5602083613330565b9150612ee08261387a565b602082019050919050565b6000612ef8600d83613330565b9150612f03826138a3565b602082019050919050565b6000612f1b602f83613330565b9150612f26826138cc565b604082019050919050565b6000612f3e601483613330565b9150612f498261391b565b602082019050919050565b6000612f61601783613341565b9150612f6c82613944565b601782019050919050565b6000612f84604383613341565b9150612f8f8261396d565b604382019050919050565b6000612fa7601f83613330565b9150612fb2826139e2565b602082019050919050565b6000612fca601183613341565b9150612fd582613a0b565b601182019050919050565b6000612fed602f83613330565b9150612ff882613a34565b604082019050919050565b61300c816134d5565b82525050565b600061301d82612f54565b91506130298285612dc5565b915061303482612fbd565b91506130408284612dc5565b91508190509392505050565b600061305782612f77565b91506130638284612dc5565b915061306e82612ea5565b915081905092915050565b600060208201905061308e6000830184612d26565b92915050565b60006080820190506130a96000830187612d26565b6130b66020830186612d26565b6130c36040830185613003565b81810360608301526130d58184612d53565b905095945050505050565b60006020820190506130f56000830184612d35565b92915050565b60006020820190506131106000830184612d44565b92915050565b600060208201905081810360008301526131308184612d8c565b905092915050565b6000602082019050818103600083015261315181612df6565b9050919050565b6000602082019050818103600083015261317181612e19565b9050919050565b6000602082019050818103600083015261319181612e3c565b9050919050565b600060208201905081810360008301526131b181612e5f565b9050919050565b600060208201905081810360008301526131d181612e82565b9050919050565b600060208201905081810360008301526131f181612ec8565b9050919050565b6000602082019050818103600083015261321181612eeb565b9050919050565b6000602082019050818103600083015261323181612f0e565b9050919050565b6000602082019050818103600083015261325181612f31565b9050919050565b6000602082019050818103600083015261327181612f9a565b9050919050565b6000602082019050818103600083015261329181612fe0565b9050919050565b60006020820190506132ad6000830184613003565b92915050565b60006132bd6132ce565b90506132c9828261357d565b919050565b6000604051905090565b600067ffffffffffffffff8211156132f3576132f26136e4565b5b6132fc82613727565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613357826134d5565b9150613362836134d5565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561339757613396613628565b5b828201905092915050565b60006133ad826134d5565b91506133b8836134d5565b9250826133c8576133c7613657565b5b828204905092915050565b60006133de826134d5565b91506133e9836134d5565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561342257613421613628565b5b828202905092915050565b6000613438826134d5565b9150613443836134d5565b92508282101561345657613455613628565b5b828203905092915050565b600061346c826134b5565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561350c5780820151818401526020810190506134f1565b8381111561351b576000848401525b50505050565b600061352c826134d5565b915060008214156135405761353f613628565b5b600182039050919050565b6000600282049050600182168061356357607f821691505b6020821081141561357757613576613686565b5b50919050565b61358682613727565b810181811067ffffffffffffffff821117156135a5576135a46136e4565b5b80604052505050565b60006135b9826134d5565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156135ec576135eb613628565b5b600182019050919050565b6000613602826134d5565b915061360d836134d5565b92508261361d5761361c613657565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4d617820737570706c7920657863656564656400000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74206973206e6f7420617661696c61626c650000000000000000000000600082015250565b7f4164647265737320616c726561647920636c61696d65642066726565204e465460008201527f2100000000000000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496e76616c69642076616c756500000000000000000000000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f697066733a2f2f626166796265696169783462636578766c62747172716c363360008201527f34723468736f6f7a62347065346671616733717763777469366e6d367069616160208201527f72612f0000000000000000000000000000000000000000000000000000000000604082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b613a8c81613461565b8114613a9757600080fd5b50565b613aa381613473565b8114613aae57600080fd5b50565b613aba8161347f565b8114613ac557600080fd5b50565b613ad181613489565b8114613adc57600080fd5b50565b613ae8816134d5565b8114613af357600080fd5b5056fea2646970667358221220c996af72c0b5eba88c823b8b21bdd483acd00ce8470dc9423925b1e03ca9292564736f6c63430008070033

Deployed Bytecode Sourcemap

81176:3006:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83809:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49614:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56097:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55538:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81324:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45365:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59804:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23901:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24342:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25486:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62717:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81398:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83494:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83676:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82122:322;;;;;;;;;;;;;:::i;:::-;;51007:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46549:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29460:103;;;;;;;;;;;;;:::i;:::-;;28809:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22361:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49790:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82517:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21466:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56655:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83575:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63500:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;82930:352;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81364:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;83291:197;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24782:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;81285:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81700:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29718:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;83809:370;83917:4;83966:10;83951:25;;:11;:25;;;;:102;;;;84043:10;84028:25;;:11;:25;;;;83951:102;:179;;;;84120:10;84105:25;;:11;:25;;;;83951:179;83931:199;;83809:370;;;:::o;49614:100::-;49668:13;49701:5;49694:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49614:100;:::o;56097:218::-;56173:7;56198:16;56206:7;56198;:16::i;:::-;56193:64;;56223:34;;;;;;;;;;;;;;56193:64;56277:15;:24;56293:7;56277:24;;;;;;;;;;;:30;;;;;;;;;;;;56270:37;;56097:218;;;:::o;55538:400::-;55619:13;55635:16;55643:7;55635;:16::i;:::-;55619:32;;55691:5;55668:28;;:19;:17;:19::i;:::-;:28;;;55664:175;;55716:44;55733:5;55740:19;:17;:19::i;:::-;55716:16;:44::i;:::-;55711:128;;55788:35;;;;;;;;;;;;;;55711:128;55664:175;55884:2;55851:15;:24;55867:7;55851:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;55922:7;55918:2;55902:28;;55911:5;55902:28;;;;;;;;;;;;55608:330;55538:400;;:::o;81324:33::-;;;;:::o;45365:323::-;45426:7;45654:15;:13;:15::i;:::-;45639:12;;45623:13;;:28;:46;45616:53;;45365:323;:::o;59804:2817::-;59938:27;59968;59987:7;59968:18;:27::i;:::-;59938:57;;60053:4;60012:45;;60028:19;60012:45;;;60008:86;;60066:28;;;;;;;;;;;;;;60008:86;60108:27;60137:23;60164:35;60191:7;60164:26;:35::i;:::-;60107:92;;;;60299:68;60324:15;60341:4;60347:19;:17;:19::i;:::-;60299:24;:68::i;:::-;60294:180;;60387:43;60404:4;60410:19;:17;:19::i;:::-;60387:16;:43::i;:::-;60382:92;;60439:35;;;;;;;;;;;;;;60382:92;60294:180;60505:1;60491:16;;:2;:16;;;60487:52;;;60516:23;;;;;;;;;;;;;;60487:52;60552:43;60574:4;60580:2;60584:7;60593:1;60552:21;:43::i;:::-;60688:15;60685:160;;;60828:1;60807:19;60800:30;60685:160;61225:18;:24;61244:4;61225:24;;;;;;;;;;;;;;;;61223:26;;;;;;;;;;;;61294:18;:22;61313:2;61294:22;;;;;;;;;;;;;;;;61292:24;;;;;;;;;;;61616:146;61653:2;61702:45;61717:4;61723:2;61727:19;61702:14;:45::i;:::-;41764:8;61674:73;61616:18;:146::i;:::-;61587:17;:26;61605:7;61587:26;;;;;;;;;;;:175;;;;61933:1;41764:8;61882:19;:47;:52;61878:627;;;61955:19;61987:1;61977:7;:11;61955:33;;62144:1;62110:17;:30;62128:11;62110:30;;;;;;;;;;;;:35;62106:384;;;62248:13;;62233:11;:28;62229:242;;62428:19;62395:17;:30;62413:11;62395:30;;;;;;;;;;;:52;;;;62229:242;62106:384;61936:569;61878:627;62552:7;62548:2;62533:27;;62542:4;62533:27;;;;;;;;;;;;62571:42;62592:4;62598:2;62602:7;62611:1;62571:20;:42::i;:::-;59927:2694;;;59804:2817;;;:::o;23901:131::-;23975:7;24002:6;:12;24009:4;24002:12;;;;;;;;;;;:22;;;23995:29;;23901:131;;;:::o;24342:147::-;24425:18;24438:4;24425:12;:18::i;:::-;21957:16;21968:4;21957:10;:16::i;:::-;24456:25:::1;24467:4;24473:7;24456:10;:25::i;:::-;24342:147:::0;;;:::o;25486:218::-;25593:12;:10;:12::i;:::-;25582:23;;:7;:23;;;25574:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;25670:26;25682:4;25688:7;25670:11;:26::i;:::-;25486:218;;:::o;62717:185::-;62855:39;62872:4;62878:2;62882:7;62855:39;;;;;;;;;;;;:16;:39::i;:::-;62717:185;;;:::o;81398:50::-;;;;;;;;;;;;;;;;;:::o;83494:73::-;29040:12;:10;:12::i;:::-;29029:23;;:7;:5;:7::i;:::-;:23;;;29021:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;83556:5:::1;83549:4;:12;;;;83494:73:::0;:::o;83676:123::-;29040:12;:10;:12::i;:::-;29029:23;;:7;:5;:7::i;:::-;:23;;;29021:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;8923:1:::1;9521:7;;:19;;9513:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;8923:1;9654:7;:18;;;;83757:3:::2;83749:21;;:44;83771:21;83749:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;8879:1:::1;9833:7;:22;;;;83676:123:::0;:::o;82122:322::-;8923:1;9521:7;;:19;;9513:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;8923:1;9654:7;:18;;;;82180:10:::1;;;;;;;;;;;82172:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;82251:9;;82246:1;82230:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:30;;82222:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;82329:1;82299:15;:27;82315:10;82299:27;;;;;;;;;;;;;;;;:31;82291:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;82375:24;82385:10;82397:1;82375:9;:24::i;:::-;82437:1;82406:15;:27;82422:10;82406:27;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;8879:1:::0;9833:7;:22;;;;82122:322::o;51007:152::-;51079:7;51122:27;51141:7;51122:18;:27::i;:::-;51099:52;;51007:152;;;:::o;46549:233::-;46621:7;46662:1;46645:19;;:5;:19;;;46641:60;;;46673:28;;;;;;;;;;;;;;46641:60;40708:13;46719:18;:25;46738:5;46719:25;;;;;;;;;;;;;;;;:55;46712:62;;46549:233;;;:::o;29460:103::-;29040:12;:10;:12::i;:::-;29029:23;;:7;:5;:7::i;:::-;:23;;;29021:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29525:30:::1;29552:1;29525:18;:30::i;:::-;29460:103::o:0;28809:87::-;28855:7;28882:6;;;;;;;;;;;28875:13;;28809:87;:::o;22361:147::-;22447:4;22471:6;:12;22478:4;22471:12;;;;;;;;;;;:20;;:29;22492:7;22471:29;;;;;;;;;;;;;;;;;;;;;;;;;22464:36;;22361:147;;;;:::o;49790:104::-;49846:13;49879:7;49872:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49790:104;:::o;82517:301::-;8923:1;9521:7;;:19;;9513:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;8923:1;9654:7;:18;;;;82596:10:::1;;;;;;;;;;;82588:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;82675:9;;82662;82646:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;;82638:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;82745:9;82738:4;;:16;;;;:::i;:::-;82725:9;:29;;82717:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;82779:32;82789:10;82801:9;82779;:32::i;:::-;8879:1:::0;9833:7;:22;;;;82517:301;:::o;21466:49::-;21511:4;21466:49;;;:::o;56655:308::-;56766:19;:17;:19::i;:::-;56754:31;;:8;:31;;;56750:61;;;56794:17;;;;;;;;;;;;;;56750:61;56876:8;56824:18;:39;56843:19;:17;:19::i;:::-;56824:39;;;;;;;;;;;;;;;:49;56864:8;56824:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;56936:8;56900:55;;56915:19;:17;:19::i;:::-;56900:55;;;56946:8;56900:55;;;;;;:::i;:::-;;;;;;;;56655:308;;:::o;83575:94::-;29040:12;:10;:12::i;:::-;29029:23;;:7;:5;:7::i;:::-;:23;;;29021:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;83652:11:::1;83639:10;;:24;;;;;;;;;;;;;;;;;;83575:94:::0;:::o;63500:399::-;63667:31;63680:4;63686:2;63690:7;63667:12;:31::i;:::-;63731:1;63713:2;:14;;;:19;63709:183;;63752:56;63783:4;63789:2;63793:7;63802:5;63752:30;:56::i;:::-;63747:145;;63836:40;;;;;;;;;;;;;;63747:145;63709:183;63500:399;;;;:::o;82930:352::-;83003:13;83044:16;83052:7;83044;:16::i;:::-;83026:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;83245:18;:7;:16;:18::i;:::-;83156:118;;;;;;;;:::i;:::-;;;;;;;;;;;;;83141:135;;82930:352;;;:::o;81364:29::-;;;;;;;;;;;;;:::o;83291:197::-;29040:12;:10;:12::i;:::-;29029:23;;:7;:5;:7::i;:::-;:23;;;29021:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;83409:9:::1;;83396;83380:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:38;;83372:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;83451:31;83461:9;83472;83451;:31::i;:::-;83291:197:::0;;:::o;24782:149::-;24866:18;24879:4;24866:12;:18::i;:::-;21957:16;21968:4;21957:10;:16::i;:::-;24897:26:::1;24909:4;24915:7;24897:11;:26::i;:::-;24782:149:::0;;;:::o;81285:31::-;;;;:::o;81700:228::-;81816:4;81838:33;81496:26;81862:8;81838:7;:33::i;:::-;:84;;;;81883:39;81906:5;81913:8;81883:22;:39::i;:::-;81838:84;81831:91;;81700:228;;;;:::o;29718:201::-;29040:12;:10;:12::i;:::-;29029:23;;:7;:5;:7::i;:::-;:23;;;29021:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29827:1:::1;29807:22;;:8;:22;;;;29799:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29883:28;29902:8;29883:18;:28::i;:::-;29718:201:::0;:::o;57542:282::-;57607:4;57663:7;57644:15;:13;:15::i;:::-;:26;;:66;;;;;57697:13;;57687:7;:23;57644:66;:153;;;;;57796:1;41484:8;57748:17;:26;57766:7;57748:26;;;;;;;;;;;;:44;:49;57644:153;57624:173;;57542:282;;;:::o;79308:105::-;79368:7;79395:10;79388:17;;79308:105;:::o;82828:95::-;82893:7;82916:1;82909:8;;82828:95;:::o;52162:1275::-;52229:7;52249:12;52264:7;52249:22;;52332:4;52313:15;:13;:15::i;:::-;:23;52309:1061;;52366:13;;52359:4;:20;52355:1015;;;52404:14;52421:17;:23;52439:4;52421:23;;;;;;;;;;;;52404:40;;52538:1;41484:8;52510:6;:24;:29;52506:845;;;53175:113;53192:1;53182:6;:11;53175:113;;;53235:17;:25;53253:6;;;;;;;53235:25;;;;;;;;;;;;53226:34;;53175:113;;;53321:6;53314:13;;;;;;52506:845;52381:989;52355:1015;52309:1061;53398:31;;;;;;;;;;;;;;52162:1275;;;;:::o;58705:479::-;58807:27;58836:23;58877:38;58918:15;:24;58934:7;58918:24;;;;;;;;;;;58877:65;;59089:18;59066:41;;59146:19;59140:26;59121:45;;59051:126;58705:479;;;:::o;57933:659::-;58082:11;58247:16;58240:5;58236:28;58227:37;;58407:16;58396:9;58392:32;58379:45;;58557:15;58546:9;58543:30;58535:5;58524:9;58521:20;58518:56;58508:66;;57933:659;;;;;:::o;64561:159::-;;;;;:::o;78617:311::-;78752:7;78772:16;41888:3;78798:19;:41;;78772:68;;41888:3;78866:31;78877:4;78883:2;78887:9;78866:10;:31::i;:::-;78858:40;;:62;;78851:69;;;78617:311;;;;;:::o;53985:450::-;54065:14;54233:16;54226:5;54222:28;54213:37;;54410:5;54396:11;54371:23;54367:41;54364:52;54357:5;54354:63;54344:73;;53985:450;;;;:::o;65385:158::-;;;;;:::o;22812:105::-;22879:30;22890:4;22896:12;:10;:12::i;:::-;22879:10;:30::i;:::-;22812:105;:::o;27083:238::-;27167:22;27175:4;27181:7;27167;:22::i;:::-;27162:152;;27238:4;27206:6;:12;27213:4;27206:12;;;;;;;;;;;:20;;:29;27227:7;27206:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;27289:12;:10;:12::i;:::-;27262:40;;27280:7;27262:40;;27274:4;27262:40;;;;;;;;;;27162:152;27083:238;;:::o;19274:98::-;19327:7;19354:10;19347:17;;19274:98;:::o;27501:239::-;27585:22;27593:4;27599:7;27585;:22::i;:::-;27581:152;;;27656:5;27624:6;:12;27631:4;27624:12;;;;;;;;;;;:20;;:29;27645:7;27624:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;27708:12;:10;:12::i;:::-;27681:40;;27699:7;27681:40;;27693:4;27681:40;;;;;;;;;;27581:152;27501:239;;:::o;73140:112::-;73217:27;73227:2;73231:8;73217:27;;;;;;;;;;;;:9;:27::i;:::-;73140:112;;:::o;30079:191::-;30153:16;30172:6;;;;;;;;;;;30153:25;;30198:8;30189:6;;:17;;;;;;;;;;;;;;;;;;30253:8;30222:40;;30243:8;30222:40;;;;;;;;;;;;30142:128;30079:191;:::o;65983:716::-;66146:4;66192:2;66167:45;;;66213:19;:17;:19::i;:::-;66234:4;66240:7;66249:5;66167:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;66163:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66467:1;66450:6;:13;:18;66446:235;;;66496:40;;;;;;;;;;;;;;66446:235;66639:6;66633:13;66624:6;66620:2;66616:15;66609:38;66163:529;66336:54;;;66326:64;;;:6;:64;;;;66319:71;;;65983:716;;;;;;:::o;5352:723::-;5408:13;5638:1;5629:5;:10;5625:53;;;5656:10;;;;;;;;;;;;;;;;;;;;;5625:53;5688:12;5703:5;5688:20;;5719:14;5744:78;5759:1;5751:4;:9;5744:78;;5777:8;;;;;:::i;:::-;;;;5808:2;5800:10;;;;;:::i;:::-;;;5744:78;;;5832:19;5864:6;5854:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5832:39;;5882:154;5898:1;5889:5;:10;5882:154;;5926:1;5916:11;;;;;:::i;:::-;;;5993:2;5985:5;:10;;;;:::i;:::-;5972:2;:24;;;;:::i;:::-;5959:39;;5942:6;5949;5942:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;6022:2;6013:11;;;;;:::i;:::-;;;5882:154;;;6060:6;6046:21;;;;;5352:723;;;;:::o;57120:164::-;57217:4;57241:18;:25;57260:5;57241:25;;;;;;;;;;;;;;;:35;57267:8;57241:35;;;;;;;;;;;;;;;;;;;;;;;;;57234:42;;57120:164;;;;:::o;78318:147::-;78455:6;78318:147;;;;;:::o;23207:505::-;23296:22;23304:4;23310:7;23296;:22::i;:::-;23291:414;;23484:41;23512:7;23484:41;;23522:2;23484:19;:41::i;:::-;23598:38;23626:4;23618:13;;23633:2;23598:19;:38::i;:::-;23389:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;23335:358;;;;;;;;;;;:::i;:::-;;;;;;;;23291:414;23207:505;;:::o;72367:689::-;72498:19;72504:2;72508:8;72498:5;:19::i;:::-;72577:1;72559:2;:14;;;:19;72555:483;;72599:11;72613:13;;72599:27;;72645:13;72667:8;72661:3;:14;72645:30;;72694:233;72725:62;72764:1;72768:2;72772:7;;;;;;72781:5;72725:30;:62::i;:::-;72720:167;;72823:40;;;;;;;;;;;;;;72720:167;72922:3;72914:5;:11;72694:233;;73009:3;72992:13;;:20;72988:34;;73014:8;;;72988:34;72580:458;;72555:483;72367:689;;;:::o;6653:451::-;6728:13;6754:19;6799:1;6790:6;6786:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;6776:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6754:47;;6812:15;:6;6819:1;6812:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;6838;:6;6845:1;6838:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;6869:9;6894:1;6885:6;6881:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;6869:26;;6864:135;6901:1;6897;:5;6864:135;;;6936:12;6957:3;6949:5;:11;6936:25;;;;;;;:::i;:::-;;;;;6924:6;6931:1;6924:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;6986:1;6976:11;;;;;6904:3;;;;:::i;:::-;;;6864:135;;;;7026:1;7017:5;:10;7009:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;7089:6;7075:21;;;6653:451;;;;:::o;67161:2454::-;67234:20;67257:13;;67234:36;;67297:1;67285:8;:13;67281:44;;;67307:18;;;;;;;;;;;;;;67281:44;67338:61;67368:1;67372:2;67376:12;67390:8;67338:21;:61::i;:::-;67882:1;40846:2;67852:1;:26;;67851:32;67839:8;:45;67813:18;:22;67832:2;67813:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;68161:139;68198:2;68252:33;68275:1;68279:2;68283:1;68252:14;:33::i;:::-;68219:30;68240:8;68219:20;:30::i;:::-;:66;68161:18;:139::i;:::-;68127:17;:31;68145:12;68127:31;;;;;;;;;;;:173;;;;68317:16;68348:11;68377:8;68362:12;:23;68348:37;;68632:16;68628:2;68624:25;68612:37;;69004:12;68964:8;68923:1;68861:25;68802:1;68741;68714:335;69129:1;69115:12;69111:20;69069:346;69170:3;69161:7;69158:16;69069:346;;69388:7;69378:8;69375:1;69348:25;69345:1;69342;69337:59;69223:1;69214:7;69210:15;69199:26;;69069:346;;;69073:77;69460:1;69448:8;:13;69444:45;;;69470:19;;;;;;;;;;;;;;69444:45;69522:3;69506:13;:19;;;;67587:1950;;69547:60;69576:1;69580:2;69584:12;69598:8;69547:20;:60::i;:::-;67223:2392;67161:2454;;:::o;54537:324::-;54607:14;54840:1;54830:8;54827:15;54801:24;54797:46;54787:56;;54537:324;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;707:139;;;;:::o;852:137::-;897:5;935:6;922:20;913:29;;951:32;977:5;951:32;:::i;:::-;852:137;;;;:::o;995:141::-;1051:5;1082:6;1076:13;1067:22;;1098:32;1124:5;1098:32;:::i;:::-;995:141;;;;:::o;1155:338::-;1210:5;1259:3;1252:4;1244:6;1240:17;1236:27;1226:122;;1267:79;;:::i;:::-;1226:122;1384:6;1371:20;1409:78;1483:3;1475:6;1468:4;1460:6;1456:17;1409:78;:::i;:::-;1400:87;;1216:277;1155:338;;;;:::o;1499:139::-;1545:5;1583:6;1570:20;1561:29;;1599:33;1626:5;1599:33;:::i;:::-;1499:139;;;;:::o;1644:329::-;1703:6;1752:2;1740:9;1731:7;1727:23;1723:32;1720:119;;;1758:79;;:::i;:::-;1720:119;1878:1;1903:53;1948:7;1939:6;1928:9;1924:22;1903:53;:::i;:::-;1893:63;;1849:117;1644:329;;;;:::o;1979:474::-;2047:6;2055;2104:2;2092:9;2083:7;2079:23;2075:32;2072:119;;;2110:79;;:::i;:::-;2072:119;2230:1;2255:53;2300:7;2291:6;2280:9;2276:22;2255:53;:::i;:::-;2245:63;;2201:117;2357:2;2383:53;2428:7;2419:6;2408:9;2404:22;2383:53;:::i;:::-;2373:63;;2328:118;1979:474;;;;;:::o;2459:619::-;2536:6;2544;2552;2601:2;2589:9;2580:7;2576:23;2572:32;2569:119;;;2607:79;;:::i;:::-;2569:119;2727:1;2752:53;2797:7;2788:6;2777:9;2773:22;2752:53;:::i;:::-;2742:63;;2698:117;2854:2;2880:53;2925:7;2916:6;2905:9;2901:22;2880:53;:::i;:::-;2870:63;;2825:118;2982:2;3008:53;3053:7;3044:6;3033:9;3029:22;3008:53;:::i;:::-;2998:63;;2953:118;2459:619;;;;;:::o;3084:943::-;3179:6;3187;3195;3203;3252:3;3240:9;3231:7;3227:23;3223:33;3220:120;;;3259:79;;:::i;:::-;3220:120;3379:1;3404:53;3449:7;3440:6;3429:9;3425:22;3404:53;:::i;:::-;3394:63;;3350:117;3506:2;3532:53;3577:7;3568:6;3557:9;3553:22;3532:53;:::i;:::-;3522:63;;3477:118;3634:2;3660:53;3705:7;3696:6;3685:9;3681:22;3660:53;:::i;:::-;3650:63;;3605:118;3790:2;3779:9;3775:18;3762:32;3821:18;3813:6;3810:30;3807:117;;;3843:79;;:::i;:::-;3807:117;3948:62;4002:7;3993:6;3982:9;3978:22;3948:62;:::i;:::-;3938:72;;3733:287;3084:943;;;;;;;:::o;4033:468::-;4098:6;4106;4155:2;4143:9;4134:7;4130:23;4126:32;4123:119;;;4161:79;;:::i;:::-;4123:119;4281:1;4306:53;4351:7;4342:6;4331:9;4327:22;4306:53;:::i;:::-;4296:63;;4252:117;4408:2;4434:50;4476:7;4467:6;4456:9;4452:22;4434:50;:::i;:::-;4424:60;;4379:115;4033:468;;;;;:::o;4507:474::-;4575:6;4583;4632:2;4620:9;4611:7;4607:23;4603:32;4600:119;;;4638:79;;:::i;:::-;4600:119;4758:1;4783:53;4828:7;4819:6;4808:9;4804:22;4783:53;:::i;:::-;4773:63;;4729:117;4885:2;4911:53;4956:7;4947:6;4936:9;4932:22;4911:53;:::i;:::-;4901:63;;4856:118;4507:474;;;;;:::o;4987:323::-;5043:6;5092:2;5080:9;5071:7;5067:23;5063:32;5060:119;;;5098:79;;:::i;:::-;5060:119;5218:1;5243:50;5285:7;5276:6;5265:9;5261:22;5243:50;:::i;:::-;5233:60;;5189:114;4987:323;;;;:::o;5316:329::-;5375:6;5424:2;5412:9;5403:7;5399:23;5395:32;5392:119;;;5430:79;;:::i;:::-;5392:119;5550:1;5575:53;5620:7;5611:6;5600:9;5596:22;5575:53;:::i;:::-;5565:63;;5521:117;5316:329;;;;:::o;5651:474::-;5719:6;5727;5776:2;5764:9;5755:7;5751:23;5747:32;5744:119;;;5782:79;;:::i;:::-;5744:119;5902:1;5927:53;5972:7;5963:6;5952:9;5948:22;5927:53;:::i;:::-;5917:63;;5873:117;6029:2;6055:53;6100:7;6091:6;6080:9;6076:22;6055:53;:::i;:::-;6045:63;;6000:118;5651:474;;;;;:::o;6131:327::-;6189:6;6238:2;6226:9;6217:7;6213:23;6209:32;6206:119;;;6244:79;;:::i;:::-;6206:119;6364:1;6389:52;6433:7;6424:6;6413:9;6409:22;6389:52;:::i;:::-;6379:62;;6335:116;6131:327;;;;:::o;6464:349::-;6533:6;6582:2;6570:9;6561:7;6557:23;6553:32;6550:119;;;6588:79;;:::i;:::-;6550:119;6708:1;6733:63;6788:7;6779:6;6768:9;6764:22;6733:63;:::i;:::-;6723:73;;6679:127;6464:349;;;;:::o;6819:329::-;6878:6;6927:2;6915:9;6906:7;6902:23;6898:32;6895:119;;;6933:79;;:::i;:::-;6895:119;7053:1;7078:53;7123:7;7114:6;7103:9;7099:22;7078:53;:::i;:::-;7068:63;;7024:117;6819:329;;;;:::o;7154:474::-;7222:6;7230;7279:2;7267:9;7258:7;7254:23;7250:32;7247:119;;;7285:79;;:::i;:::-;7247:119;7405:1;7430:53;7475:7;7466:6;7455:9;7451:22;7430:53;:::i;:::-;7420:63;;7376:117;7532:2;7558:53;7603:7;7594:6;7583:9;7579:22;7558:53;:::i;:::-;7548:63;;7503:118;7154:474;;;;;:::o;7634:118::-;7721:24;7739:5;7721:24;:::i;:::-;7716:3;7709:37;7634:118;;:::o;7758:109::-;7839:21;7854:5;7839:21;:::i;:::-;7834:3;7827:34;7758:109;;:::o;7873:118::-;7960:24;7978:5;7960:24;:::i;:::-;7955:3;7948:37;7873:118;;:::o;7997:360::-;8083:3;8111:38;8143:5;8111:38;:::i;:::-;8165:70;8228:6;8223:3;8165:70;:::i;:::-;8158:77;;8244:52;8289:6;8284:3;8277:4;8270:5;8266:16;8244:52;:::i;:::-;8321:29;8343:6;8321:29;:::i;:::-;8316:3;8312:39;8305:46;;8087:270;7997:360;;;;:::o;8363:364::-;8451:3;8479:39;8512:5;8479:39;:::i;:::-;8534:71;8598:6;8593:3;8534:71;:::i;:::-;8527:78;;8614:52;8659:6;8654:3;8647:4;8640:5;8636:16;8614:52;:::i;:::-;8691:29;8713:6;8691:29;:::i;:::-;8686:3;8682:39;8675:46;;8455:272;8363:364;;;;:::o;8733:377::-;8839:3;8867:39;8900:5;8867:39;:::i;:::-;8922:89;9004:6;8999:3;8922:89;:::i;:::-;8915:96;;9020:52;9065:6;9060:3;9053:4;9046:5;9042:16;9020:52;:::i;:::-;9097:6;9092:3;9088:16;9081:23;;8843:267;8733:377;;;;:::o;9116:366::-;9258:3;9279:67;9343:2;9338:3;9279:67;:::i;:::-;9272:74;;9355:93;9444:3;9355:93;:::i;:::-;9473:2;9468:3;9464:12;9457:19;;9116:366;;;:::o;9488:::-;9630:3;9651:67;9715:2;9710:3;9651:67;:::i;:::-;9644:74;;9727:93;9816:3;9727:93;:::i;:::-;9845:2;9840:3;9836:12;9829:19;;9488:366;;;:::o;9860:::-;10002:3;10023:67;10087:2;10082:3;10023:67;:::i;:::-;10016:74;;10099:93;10188:3;10099:93;:::i;:::-;10217:2;10212:3;10208:12;10201:19;;9860:366;;;:::o;10232:::-;10374:3;10395:67;10459:2;10454:3;10395:67;:::i;:::-;10388:74;;10471:93;10560:3;10471:93;:::i;:::-;10589:2;10584:3;10580:12;10573:19;;10232:366;;;:::o;10604:::-;10746:3;10767:67;10831:2;10826:3;10767:67;:::i;:::-;10760:74;;10843:93;10932:3;10843:93;:::i;:::-;10961:2;10956:3;10952:12;10945:19;;10604:366;;;:::o;10976:400::-;11136:3;11157:84;11239:1;11234:3;11157:84;:::i;:::-;11150:91;;11250:93;11339:3;11250:93;:::i;:::-;11368:1;11363:3;11359:11;11352:18;;10976:400;;;:::o;11382:366::-;11524:3;11545:67;11609:2;11604:3;11545:67;:::i;:::-;11538:74;;11621:93;11710:3;11621:93;:::i;:::-;11739:2;11734:3;11730:12;11723:19;;11382:366;;;:::o;11754:::-;11896:3;11917:67;11981:2;11976:3;11917:67;:::i;:::-;11910:74;;11993:93;12082:3;11993:93;:::i;:::-;12111:2;12106:3;12102:12;12095:19;;11754:366;;;:::o;12126:::-;12268:3;12289:67;12353:2;12348:3;12289:67;:::i;:::-;12282:74;;12365:93;12454:3;12365:93;:::i;:::-;12483:2;12478:3;12474:12;12467:19;;12126:366;;;:::o;12498:::-;12640:3;12661:67;12725:2;12720:3;12661:67;:::i;:::-;12654:74;;12737:93;12826:3;12737:93;:::i;:::-;12855:2;12850:3;12846:12;12839:19;;12498:366;;;:::o;12870:402::-;13030:3;13051:85;13133:2;13128:3;13051:85;:::i;:::-;13044:92;;13145:93;13234:3;13145:93;:::i;:::-;13263:2;13258:3;13254:12;13247:19;;12870:402;;;:::o;13278:::-;13438:3;13459:85;13541:2;13536:3;13459:85;:::i;:::-;13452:92;;13553:93;13642:3;13553:93;:::i;:::-;13671:2;13666:3;13662:12;13655:19;;13278:402;;;:::o;13686:366::-;13828:3;13849:67;13913:2;13908:3;13849:67;:::i;:::-;13842:74;;13925:93;14014:3;13925:93;:::i;:::-;14043:2;14038:3;14034:12;14027:19;;13686:366;;;:::o;14058:402::-;14218:3;14239:85;14321:2;14316:3;14239:85;:::i;:::-;14232:92;;14333:93;14422:3;14333:93;:::i;:::-;14451:2;14446:3;14442:12;14435:19;;14058:402;;;:::o;14466:366::-;14608:3;14629:67;14693:2;14688:3;14629:67;:::i;:::-;14622:74;;14705:93;14794:3;14705:93;:::i;:::-;14823:2;14818:3;14814:12;14807:19;;14466:366;;;:::o;14838:118::-;14925:24;14943:5;14925:24;:::i;:::-;14920:3;14913:37;14838:118;;:::o;14962:967::-;15344:3;15366:148;15510:3;15366:148;:::i;:::-;15359:155;;15531:95;15622:3;15613:6;15531:95;:::i;:::-;15524:102;;15643:148;15787:3;15643:148;:::i;:::-;15636:155;;15808:95;15899:3;15890:6;15808:95;:::i;:::-;15801:102;;15920:3;15913:10;;14962:967;;;;;:::o;15935:807::-;16269:3;16291:148;16435:3;16291:148;:::i;:::-;16284:155;;16456:95;16547:3;16538:6;16456:95;:::i;:::-;16449:102;;16568:148;16712:3;16568:148;:::i;:::-;16561:155;;16733:3;16726:10;;15935:807;;;;:::o;16748:222::-;16841:4;16879:2;16868:9;16864:18;16856:26;;16892:71;16960:1;16949:9;16945:17;16936:6;16892:71;:::i;:::-;16748:222;;;;:::o;16976:640::-;17171:4;17209:3;17198:9;17194:19;17186:27;;17223:71;17291:1;17280:9;17276:17;17267:6;17223:71;:::i;:::-;17304:72;17372:2;17361:9;17357:18;17348:6;17304:72;:::i;:::-;17386;17454:2;17443:9;17439:18;17430:6;17386:72;:::i;:::-;17505:9;17499:4;17495:20;17490:2;17479:9;17475:18;17468:48;17533:76;17604:4;17595:6;17533:76;:::i;:::-;17525:84;;16976:640;;;;;;;:::o;17622:210::-;17709:4;17747:2;17736:9;17732:18;17724:26;;17760:65;17822:1;17811:9;17807:17;17798:6;17760:65;:::i;:::-;17622:210;;;;:::o;17838:222::-;17931:4;17969:2;17958:9;17954:18;17946:26;;17982:71;18050:1;18039:9;18035:17;18026:6;17982:71;:::i;:::-;17838:222;;;;:::o;18066:313::-;18179:4;18217:2;18206:9;18202:18;18194:26;;18266:9;18260:4;18256:20;18252:1;18241:9;18237:17;18230:47;18294:78;18367:4;18358:6;18294:78;:::i;:::-;18286:86;;18066:313;;;;:::o;18385:419::-;18551:4;18589:2;18578:9;18574:18;18566:26;;18638:9;18632:4;18628:20;18624:1;18613:9;18609:17;18602:47;18666:131;18792:4;18666:131;:::i;:::-;18658:139;;18385:419;;;:::o;18810:::-;18976:4;19014:2;19003:9;18999:18;18991:26;;19063:9;19057:4;19053:20;19049:1;19038:9;19034:17;19027:47;19091:131;19217:4;19091:131;:::i;:::-;19083:139;;18810:419;;;:::o;19235:::-;19401:4;19439:2;19428:9;19424:18;19416:26;;19488:9;19482:4;19478:20;19474:1;19463:9;19459:17;19452:47;19516:131;19642:4;19516:131;:::i;:::-;19508:139;;19235:419;;;:::o;19660:::-;19826:4;19864:2;19853:9;19849:18;19841:26;;19913:9;19907:4;19903:20;19899:1;19888:9;19884:17;19877:47;19941:131;20067:4;19941:131;:::i;:::-;19933:139;;19660:419;;;:::o;20085:::-;20251:4;20289:2;20278:9;20274:18;20266:26;;20338:9;20332:4;20328:20;20324:1;20313:9;20309:17;20302:47;20366:131;20492:4;20366:131;:::i;:::-;20358:139;;20085:419;;;:::o;20510:::-;20676:4;20714:2;20703:9;20699:18;20691:26;;20763:9;20757:4;20753:20;20749:1;20738:9;20734:17;20727:47;20791:131;20917:4;20791:131;:::i;:::-;20783:139;;20510:419;;;:::o;20935:::-;21101:4;21139:2;21128:9;21124:18;21116:26;;21188:9;21182:4;21178:20;21174:1;21163:9;21159:17;21152:47;21216:131;21342:4;21216:131;:::i;:::-;21208:139;;20935:419;;;:::o;21360:::-;21526:4;21564:2;21553:9;21549:18;21541:26;;21613:9;21607:4;21603:20;21599:1;21588:9;21584:17;21577:47;21641:131;21767:4;21641:131;:::i;:::-;21633:139;;21360:419;;;:::o;21785:::-;21951:4;21989:2;21978:9;21974:18;21966:26;;22038:9;22032:4;22028:20;22024:1;22013:9;22009:17;22002:47;22066:131;22192:4;22066:131;:::i;:::-;22058:139;;21785:419;;;:::o;22210:::-;22376:4;22414:2;22403:9;22399:18;22391:26;;22463:9;22457:4;22453:20;22449:1;22438:9;22434:17;22427:47;22491:131;22617:4;22491:131;:::i;:::-;22483:139;;22210:419;;;:::o;22635:::-;22801:4;22839:2;22828:9;22824:18;22816:26;;22888:9;22882:4;22878:20;22874:1;22863:9;22859:17;22852:47;22916:131;23042:4;22916:131;:::i;:::-;22908:139;;22635:419;;;:::o;23060:222::-;23153:4;23191:2;23180:9;23176:18;23168:26;;23204:71;23272:1;23261:9;23257:17;23248:6;23204:71;:::i;:::-;23060:222;;;;:::o;23288:129::-;23322:6;23349:20;;:::i;:::-;23339:30;;23378:33;23406:4;23398:6;23378:33;:::i;:::-;23288:129;;;:::o;23423:75::-;23456:6;23489:2;23483:9;23473:19;;23423:75;:::o;23504:307::-;23565:4;23655:18;23647:6;23644:30;23641:56;;;23677:18;;:::i;:::-;23641:56;23715:29;23737:6;23715:29;:::i;:::-;23707:37;;23799:4;23793;23789:15;23781:23;;23504:307;;;:::o;23817:98::-;23868:6;23902:5;23896:12;23886:22;;23817:98;;;:::o;23921:99::-;23973:6;24007:5;24001:12;23991:22;;23921:99;;;:::o;24026:168::-;24109:11;24143:6;24138:3;24131:19;24183:4;24178:3;24174:14;24159:29;;24026:168;;;;:::o;24200:169::-;24284:11;24318:6;24313:3;24306:19;24358:4;24353:3;24349:14;24334:29;;24200:169;;;;:::o;24375:148::-;24477:11;24514:3;24499:18;;24375:148;;;;:::o;24529:305::-;24569:3;24588:20;24606:1;24588:20;:::i;:::-;24583:25;;24622:20;24640:1;24622:20;:::i;:::-;24617:25;;24776:1;24708:66;24704:74;24701:1;24698:81;24695:107;;;24782:18;;:::i;:::-;24695:107;24826:1;24823;24819:9;24812:16;;24529:305;;;;:::o;24840:185::-;24880:1;24897:20;24915:1;24897:20;:::i;:::-;24892:25;;24931:20;24949:1;24931:20;:::i;:::-;24926:25;;24970:1;24960:35;;24975:18;;:::i;:::-;24960:35;25017:1;25014;25010:9;25005:14;;24840:185;;;;:::o;25031:348::-;25071:7;25094:20;25112:1;25094:20;:::i;:::-;25089:25;;25128:20;25146:1;25128:20;:::i;:::-;25123:25;;25316:1;25248:66;25244:74;25241:1;25238:81;25233:1;25226:9;25219:17;25215:105;25212:131;;;25323:18;;:::i;:::-;25212:131;25371:1;25368;25364:9;25353:20;;25031:348;;;;:::o;25385:191::-;25425:4;25445:20;25463:1;25445:20;:::i;:::-;25440:25;;25479:20;25497:1;25479:20;:::i;:::-;25474:25;;25518:1;25515;25512:8;25509:34;;;25523:18;;:::i;:::-;25509:34;25568:1;25565;25561:9;25553:17;;25385:191;;;;:::o;25582:96::-;25619:7;25648:24;25666:5;25648:24;:::i;:::-;25637:35;;25582:96;;;:::o;25684:90::-;25718:7;25761:5;25754:13;25747:21;25736:32;;25684:90;;;:::o;25780:77::-;25817:7;25846:5;25835:16;;25780:77;;;:::o;25863:149::-;25899:7;25939:66;25932:5;25928:78;25917:89;;25863:149;;;:::o;26018:126::-;26055:7;26095:42;26088:5;26084:54;26073:65;;26018:126;;;:::o;26150:77::-;26187:7;26216:5;26205:16;;26150:77;;;:::o;26233:154::-;26317:6;26312:3;26307;26294:30;26379:1;26370:6;26365:3;26361:16;26354:27;26233:154;;;:::o;26393:307::-;26461:1;26471:113;26485:6;26482:1;26479:13;26471:113;;;26570:1;26565:3;26561:11;26555:18;26551:1;26546:3;26542:11;26535:39;26507:2;26504:1;26500:10;26495:15;;26471:113;;;26602:6;26599:1;26596:13;26593:101;;;26682:1;26673:6;26668:3;26664:16;26657:27;26593:101;26442:258;26393:307;;;:::o;26706:171::-;26745:3;26768:24;26786:5;26768:24;:::i;:::-;26759:33;;26814:4;26807:5;26804:15;26801:41;;;26822:18;;:::i;:::-;26801:41;26869:1;26862:5;26858:13;26851:20;;26706:171;;;:::o;26883:320::-;26927:6;26964:1;26958:4;26954:12;26944:22;;27011:1;27005:4;27001:12;27032:18;27022:81;;27088:4;27080:6;27076:17;27066:27;;27022:81;27150:2;27142:6;27139:14;27119:18;27116:38;27113:84;;;27169:18;;:::i;:::-;27113:84;26934:269;26883:320;;;:::o;27209:281::-;27292:27;27314:4;27292:27;:::i;:::-;27284:6;27280:40;27422:6;27410:10;27407:22;27386:18;27374:10;27371:34;27368:62;27365:88;;;27433:18;;:::i;:::-;27365:88;27473:10;27469:2;27462:22;27252:238;27209:281;;:::o;27496:233::-;27535:3;27558:24;27576:5;27558:24;:::i;:::-;27549:33;;27604:66;27597:5;27594:77;27591:103;;;27674:18;;:::i;:::-;27591:103;27721:1;27714:5;27710:13;27703:20;;27496:233;;;:::o;27735:176::-;27767:1;27784:20;27802:1;27784:20;:::i;:::-;27779:25;;27818:20;27836:1;27818:20;:::i;:::-;27813:25;;27857:1;27847:35;;27862:18;;:::i;:::-;27847:35;27903:1;27900;27896:9;27891:14;;27735:176;;;;:::o;27917:180::-;27965:77;27962:1;27955:88;28062:4;28059:1;28052:15;28086:4;28083:1;28076:15;28103:180;28151:77;28148:1;28141:88;28248:4;28245:1;28238:15;28272:4;28269:1;28262:15;28289:180;28337:77;28334:1;28327:88;28434:4;28431:1;28424:15;28458:4;28455:1;28448:15;28475:180;28523:77;28520:1;28513:88;28620:4;28617:1;28610:15;28644:4;28641:1;28634:15;28661:180;28709:77;28706:1;28699:88;28806:4;28803:1;28796:15;28830:4;28827:1;28820:15;28847:117;28956:1;28953;28946:12;28970:117;29079:1;29076;29069:12;29093:117;29202:1;29199;29192:12;29216:117;29325:1;29322;29315:12;29339:102;29380:6;29431:2;29427:7;29422:2;29415:5;29411:14;29407:28;29397:38;;29339:102;;;:::o;29447:182::-;29587:34;29583:1;29575:6;29571:14;29564:58;29447:182;:::o;29635:169::-;29775:21;29771:1;29763:6;29759:14;29752:45;29635:169;:::o;29810:225::-;29950:34;29946:1;29938:6;29934:14;29927:58;30019:8;30014:2;30006:6;30002:15;29995:33;29810:225;:::o;30041:171::-;30181:23;30177:1;30169:6;30165:14;30158:47;30041:171;:::o;30218:220::-;30358:34;30354:1;30346:6;30342:14;30335:58;30427:3;30422:2;30414:6;30410:15;30403:28;30218:220;:::o;30444:155::-;30584:7;30580:1;30572:6;30568:14;30561:31;30444:155;:::o;30605:182::-;30745:34;30741:1;30733:6;30729:14;30722:58;30605:182;:::o;30793:163::-;30933:15;30929:1;30921:6;30917:14;30910:39;30793:163;:::o;30962:234::-;31102:34;31098:1;31090:6;31086:14;31079:58;31171:17;31166:2;31158:6;31154:15;31147:42;30962:234;:::o;31202:170::-;31342:22;31338:1;31330:6;31326:14;31319:46;31202:170;:::o;31378:173::-;31518:25;31514:1;31506:6;31502:14;31495:49;31378:173;:::o;31557:303::-;31697:34;31693:1;31685:6;31681:14;31674:58;31770:34;31765:2;31757:6;31753:15;31746:59;31843:5;31838:2;31830:6;31826:15;31819:30;31557:303;:::o;31870:189::-;32014:33;32010:1;32002:6;31998:14;31991:57;31870:189;:::o;32069:175::-;32213:19;32209:1;32201:6;32197:14;32190:43;32069:175;:::o;32254:246::-;32398:34;32394:1;32386:6;32382:14;32375:58;32471:17;32466:2;32458:6;32454:15;32447:42;32254:246;:::o;32510:130::-;32587:24;32605:5;32587:24;:::i;:::-;32580:5;32577:35;32567:63;;32626:1;32623;32616:12;32567:63;32510:130;:::o;32650:124::-;32724:21;32739:5;32724:21;:::i;:::-;32717:5;32714:32;32704:60;;32760:1;32757;32750:12;32704:60;32650:124;:::o;32784:130::-;32861:24;32879:5;32861:24;:::i;:::-;32854:5;32851:35;32841:63;;32900:1;32897;32890:12;32841:63;32784:130;:::o;32924:128::-;33000:23;33017:5;33000:23;:::i;:::-;32993:5;32990:34;32980:62;;33038:1;33035;33028:12;32980:62;32924:128;:::o;33062:130::-;33139:24;33157:5;33139:24;:::i;:::-;33132:5;33129:35;33119:63;;33178:1;33175;33168:12;33119:63;33062:130;:::o

Swarm Source

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