ETH Price: $3,361.27 (+0.29%)

Token

ZONMUSPASS (ZMP)
 

Overview

Max Total Supply

0 ZMP

Holders

100

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
taklok.eth
Balance
1 ZMP
0x19fc1d3df70a570b41ee7e7c841f574d4ed6eeda
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:
ZONMUSPASS

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File @openzeppelin/contracts/utils/[email protected]


// 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/[email protected]


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 contracts/passaddresslisttemp.sol


pragma solidity ^0.8.0;

contract passaddresslist is Ownable {
    mapping (uint256 => address) public mintList;
    uint256 public totalAdressQuantity;
    uint256 private mintMaxAmount = 100;

    constructor() {}

    function addAdress(address to) public onlyOwner{
        require(totalAdressQuantity <= mintMaxAmount);
        mintList[totalAdressQuantity] = to;
        totalAdressQuantity ++;
    }

    function getAddress(uint256 key) public view returns (address) {
        return mintList[key];
    }

    function getQuantity() public view returns(uint256) {
        return totalAdressQuantity;
    }
}


// File operator-filter-registry/src/[email protected]


pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}


// File operator-filter-registry/src/[email protected]


pragma solidity ^0.8.13;

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}


// File operator-filter-registry/src/[email protected]


pragma solidity ^0.8.13;

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}


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


// 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/introspection/[email protected]


// 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/[email protected]


// 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/[email protected]


// 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/utils/[email protected]


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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


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

pragma solidity ^0.8.0;

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


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


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

pragma solidity ^0.8.0;

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

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

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


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


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

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

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

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

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


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


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}


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


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}


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


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

pragma solidity ^0.8.0;



/**
 * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment
 * information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC721Royalty is ERC2981, ERC721 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);
        _resetTokenRoyalty(tokenId);
    }
}


// File contracts/passfinal.sol


pragma solidity ^0.8.0;





contract ZONMUSPASS is ERC721Royalty, AccessControl, DefaultOperatorFilterer {
    using Strings for uint256;

    bytes32 FREEZE_ROLE = keccak256('FREEZE_ROLE');
    string baseURI = 'https://ousiass.com/zmp/';

    mapping(address => bool) isFreezed;

    uint256 nightStartTime = 9;
    uint256 nightEndTime = 21;
    address feereceiver = 0x110891d31cAc4498F97FFDeD3aE191BeA5252BEf;
    uint16 mintMaxAmount = 100;
    uint16 tokenIdCounter;
    address passEnableAddressList;

    constructor(address passAddress) ERC721('ZONMUSPASS', 'ZMP') {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setRoleAdmin(FREEZE_ROLE, DEFAULT_ADMIN_ROLE);
        _setDefaultRoyalty(feereceiver, 1000);
        passEnableAddressList = passAddress;
    }

    function setUri(string memory uri) public onlyRole(DEFAULT_ADMIN_ROLE) {
        baseURI = uri;
    }

    function firstMint(uint256 endid) public onlyRole(DEFAULT_ADMIN_ROLE) {
        require(endid < mintMaxAmount);
        require(endid >= tokenIdCounter);
        for (uint256 i = tokenIdCounter; i <= endid; i++) {
            _safeMint(passaddresslist(passEnableAddressList).getAddress(i), tokenIdCounter++);
        }
    }

    function changeRoyalty(address feeaddress, uint16 feeprice) public onlyRole(DEFAULT_ADMIN_ROLE) {
        _setDefaultRoyalty(feeaddress, feeprice);
    }

    function freezeToken(address holder) public onlyRole(FREEZE_ROLE) {
        isFreezed[holder] = true;
    }

    function checkFreeze(address holder) public view returns(bool) {
        return isFreezed[holder];
    }

    function checkPassEnableAddressList() public view onlyRole(DEFAULT_ADMIN_ROLE) returns(address){
        return passEnableAddressList;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override {
        require(!isFreezed[from], 'token is freezed');
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override onlyAllowedOperator(from){
        require(balanceOf(to) == 0);
        ERC721.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public override onlyAllowedOperator(from){
        require(balanceOf(to) == 0);
        ERC721.safeTransferFrom(from, to, tokenId, data);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721Royalty, AccessControl)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(AccessControl).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function setApprovalForAll(address operator, bool approved) 
        public 
        override
        onlyAllowedOperatorApproval(operator) 
    {
        super.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId)
        public
        override
        onlyAllowedOperatorApproval(operator)
    {
        super.approve(operator, tokenId);
    }

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

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns(string memory)
    {
        return getURI(tokenId, block.timestamp);
    }

    function getURI(uint256 tokenId, uint256 timestamp)
        public
        view
        returns(string memory)
    {
        uint256 hour = ((timestamp % (60 * 60 * 24)) / (60 * 60));
        if(balanceOf((ownerOf(tokenId))) > 1) {
            return string(abi.encodePacked(baseURI, "x.json"));
        } else if (isFreezed[ownerOf(tokenId)] == true) {
            return string(abi.encodePacked(baseURI, tokenId.toString(), "s.json"));
        } else if(isFreezed[ownerOf(tokenId)] == false && hour < nightStartTime) {
            return string(abi.encodePacked(baseURI, tokenId.toString(), "d.json"));
        } else if(isFreezed[ownerOf(tokenId)] == false && hour >= nightEndTime) {
            return string(abi.encodePacked(baseURI, tokenId.toString(), "d.json"));
        } else if(isFreezed[ownerOf(tokenId)] == false) {
            return string(abi.encodePacked(baseURI, tokenId.toString(), "n.json"));
        } else {
            revert('invalid version');
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"passAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"feeaddress","type":"address"},{"internalType":"uint16","name":"feeprice","type":"uint16"}],"name":"changeRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"checkFreeze","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkPassEnableAddressList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"endid","type":"uint256"}],"name":"firstMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"freezeToken","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"getURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040527f5789b43a60de35bcedee40618ae90979bab7d1315fd4b079234241bdab19936d6009556040518060400160405280601881526020017f68747470733a2f2f6f7573696173732e636f6d2f7a6d702f0000000000000000815250600a90805190602001906200007592919062000829565b506009600c556015600d5573110891d31cac4498f97ffded3ae191bea5252bef600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506064600e60146101000a81548161ffff021916908361ffff1602179055503480156200010057600080fd5b506040516200517938038062005179833981810160405281019062000126919062000943565b733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600a81526020017f5a4f4e4d555350415353000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f5a4d5000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001c192919062000829565b508060039080519060200190620001da92919062000829565b50505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003d257801562000298576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200025e92919062000986565b600060405180830381600087803b1580156200027957600080fd5b505af11580156200028e573d6000803e3d6000fd5b50505050620003d1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000352576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200031892919062000986565b600060405180830381600087803b1580156200033357600080fd5b505af115801562000348573d6000803e3d6000fd5b50505050620003d0565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200039b9190620009b3565b600060405180830381600087803b158015620003b657600080fd5b505af1158015620003cb573d6000803e3d6000fd5b505050505b5b5b5050620003e96000801b336200047e60201b60201c565b620004006009546000801b6200049460201b60201c565b62000436600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166103e8620004f860201b60201c565b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000b4f565b6200049082826200069a60201b60201c565b5050565b6000620004a7836200078c60201b60201c565b90508160086000858152602001908152602001600020600101819055508181847fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff60405160405180910390a4505050565b62000508620007ac60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000569576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005609062000a57565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620005db576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005d29062000ac9565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b620006ac8282620007b660201b60201c565b620007885760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200072d6200082160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600060086000838152602001908152602001600020600101549050919050565b6000612710905090565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b828054620008379062000b1a565b90600052602060002090601f0160209004810192826200085b5760008555620008a7565b82601f106200087657805160ff1916838001178555620008a7565b82800160010185558215620008a7579182015b82811115620008a657825182559160200191906001019062000889565b5b509050620008b69190620008ba565b5090565b5b80821115620008d5576000816000905550600101620008bb565b5090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200090b82620008de565b9050919050565b6200091d81620008fe565b81146200092957600080fd5b50565b6000815190506200093d8162000912565b92915050565b6000602082840312156200095c576200095b620008d9565b5b60006200096c848285016200092c565b91505092915050565b6200098081620008fe565b82525050565b60006040820190506200099d600083018562000975565b620009ac602083018462000975565b9392505050565b6000602082019050620009ca600083018462000975565b92915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000a3f602a83620009d0565b915062000a4c82620009e1565b604082019050919050565b6000602082019050818103600083015262000a728162000a30565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000ab1601983620009d0565b915062000abe8262000a79565b602082019050919050565b6000602082019050818103600083015262000ae48162000aa2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b3357607f821691505b60208210810362000b495762000b4862000aeb565b5b50919050565b61461a8062000b5f6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a217fddf11610097578063b88d4fde11610071578063b88d4fde14610528578063c87b56dd14610544578063d547741f14610574578063e985e9c514610590576101c4565b8063a217fddf146104d0578063a22cb465146104ee578063a89c45b31461050a576101c4565b80637c93c87e116100d35780637c93c87e1461044a57806391d148541461046657806395d89b41146104965780639b642de1146104b4576101c4565b806370a08231146103ce578063721a1db4146103fe57806372e2f8f51461041a576101c4565b80632f2ff15d1161016657806342842e0e1161014057806342842e0e146103365780636352211e1461035257806369ae9bb1146103825780636b1afa20146103b2576101c4565b80632f2ff15d146102e057806336568abe146102fc57806341f4343414610318576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806323b872dd14610263578063248a9ca31461027f5780632a55205a146102af576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de9190612d18565b6105c0565b6040516101f09190612d60565b60405180910390f35b6102016106a2565b60405161020e9190612e14565b60405180910390f35b610231600480360381019061022c9190612e6c565b610734565b60405161023e9190612eda565b60405180910390f35b610261600480360381019061025c9190612f21565b61077a565b005b61027d60048036038101906102789190612f61565b610793565b005b61029960048036038101906102949190612fea565b6107f7565b6040516102a69190613026565b60405180910390f35b6102c960048036038101906102c49190613041565b610817565b6040516102d7929190613090565b60405180910390f35b6102fa60048036038101906102f591906130b9565b610a01565b005b610316600480360381019061031191906130b9565b610a22565b005b610320610aa5565b60405161032d9190613158565b60405180910390f35b610350600480360381019061034b9190612f61565b610ab7565b005b61036c60048036038101906103679190612e6c565b610ad7565b6040516103799190612eda565b60405180910390f35b61039c60048036038101906103979190613041565b610b88565b6040516103a99190612e14565b60405180910390f35b6103cc60048036038101906103c791906131ad565b610e96565b005b6103e860048036038101906103e391906131ed565b610eb6565b6040516103f5919061321a565b60405180910390f35b61041860048036038101906104139190612e6c565b610f6d565b005b610434600480360381019061042f91906131ed565b6110d6565b6040516104419190612d60565b60405180910390f35b610464600480360381019061045f91906131ed565b61112c565b005b610480600480360381019061047b91906130b9565b611194565b60405161048d9190612d60565b60405180910390f35b61049e6111ff565b6040516104ab9190612e14565b60405180910390f35b6104ce60048036038101906104c9919061336a565b611291565b005b6104d86112b9565b6040516104e59190613026565b60405180910390f35b610508600480360381019061050391906133df565b6112c0565b005b6105126112d9565b60405161051f9190612eda565b60405180910390f35b610542600480360381019061053d91906134c0565b611311565b005b61055e60048036038101906105599190612e6c565b611377565b60405161056b9190612e14565b60405180910390f35b61058e600480360381019061058991906130b9565b61138a565b005b6105aa60048036038101906105a59190613543565b6113ab565b6040516105b79190612d60565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061068b57507fda8def73000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061069b575061069a8261143f565b5b9050919050565b6060600280546106b1906135b2565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd906135b2565b801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b5050505050905090565b600061073f826114b9565b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8161078481611504565b61078e8383611601565b505050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107d1576107d033611504565b5b60006107dc84610eb6565b146107e657600080fd5b6107f1848484611718565b50505050565b600060086000838152602001908152602001600020600101549050919050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036109ac5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006109b6611778565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866109e29190613612565b6109ec919061369b565b90508160000151819350935050509250929050565b610a0a826107f7565b610a1381611782565b610a1d8383611796565b505050565b610a2a611877565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e9061373e565b60405180910390fd5b610aa1828261187f565b5050565b6daaeb6d7670e522a718067333cd4e81565b610ad283838360405180602001604052806000815250611311565b505050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b76906137aa565b60405180910390fd5b80915050919050565b60606000610e106201518084610b9e91906137ca565b610ba8919061369b565b90506001610bbd610bb886610ad7565b610eb6565b1115610bec57600a604051602001610bd591906138e6565b604051602081830303815290604052915050610e90565b60011515600b6000610bfd87610ad7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503610c7f57600a610c5785611961565b604051602001610c68929190613985565b604051602081830303815290604052915050610e90565b60001515600b6000610c9087610ad7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148015610ce85750600c5481105b15610d2057600a610cf885611961565b604051602001610d09929190613a00565b604051602081830303815290604052915050610e90565b60001515600b6000610d3187610ad7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148015610d8a5750600d548110155b15610dc257600a610d9a85611961565b604051602001610dab929190613a00565b604051602081830303815290604052915050610e90565b60001515600b6000610dd387610ad7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503610e5557600a610e2d85611961565b604051602001610e3e929190613a7b565b604051602081830303815290604052915050610e90565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8790613af6565b60405180910390fd5b92915050565b6000801b610ea381611782565b610eb1838361ffff16611ac1565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90613b88565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000801b610f7a81611782565b600e60149054906101000a900461ffff1661ffff168210610f9a57600080fd5b600e60169054906101000a900461ffff1661ffff16821015610fbb57600080fd5b6000600e60169054906101000a900461ffff1661ffff1690505b8281116110d1576110be600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b93f9b0a836040518263ffffffff1660e01b815260040161103a919061321a565b602060405180830381865afa158015611057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107b9190613bbd565b600e601681819054906101000a900461ffff168092919061109b90613bea565b91906101000a81548161ffff021916908361ffff16021790555061ffff16611c55565b80806110c990613c14565b915050610fd5565b505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60095461113881611782565b6001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606003805461120e906135b2565b80601f016020809104026020016040519081016040528092919081815260200182805461123a906135b2565b80156112875780601f1061125c57610100808354040283529160200191611287565b820191906000526020600020905b81548152906001019060200180831161126a57829003601f168201915b5050505050905090565b6000801b61129e81611782565b81600a90805190602001906112b4929190612c09565b505050565b6000801b81565b816112ca81611504565b6112d48383611c73565b505050565b60008060001b6112e881611782565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461134f5761134e33611504565b5b600061135a85610eb6565b1461136457600080fd5b61137085858585611c89565b5050505050565b60606113838242610b88565b9050919050565b611393826107f7565b61139c81611782565b6113a6838361187f565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806114b257506114b182611ceb565b5b9050919050565b6114c281611cfd565b611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f8906137aa565b60405180910390fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156115fe576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161157b929190613c5c565b602060405180830381865afa158015611598573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bc9190613c9a565b6115fd57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016115f49190612eda565b60405180910390fd5b5b50565b600061160c82610ad7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167390613d39565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661169b611877565b73ffffffffffffffffffffffffffffffffffffffff1614806116ca57506116c9816116c4611877565b6113ab565b5b611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090613dcb565b60405180910390fd5b6117138383611d69565b505050565b611729611723611877565b82611e22565b611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175f90613e5d565b60405180910390fd5b611773838383611eb7565b505050565b6000612710905090565b6117938161178e611877565b61211d565b50565b6117a08282611194565b6118735760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611818611877565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b6118898282611194565b1561195d5760006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611902611877565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6060600082036119a8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611abc565b600082905060005b600082146119da5780806119c390613c14565b915050600a826119d3919061369b565b91506119b0565b60008167ffffffffffffffff8111156119f6576119f561323f565b5b6040519080825280601f01601f191660200182016040528015611a285781602001600182028036833780820191505090505b5090505b60008514611ab557600182611a419190613e7d565b9150600a85611a5091906137ca565b6030611a5c9190613eb1565b60f81b818381518110611a7257611a71613f07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611aae919061369b565b9450611a2c565b8093505050505b919050565b611ac9611778565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1e90613fa8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8d90614014565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b611c6f8282604051806020016040528060008152506121ba565b5050565b611c85611c7e611877565b8383612215565b5050565b611c9a611c94611877565b83611e22565b611cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd090613e5d565b60405180910390fd5b611ce584848484612381565b50505050565b6000611cf6826123dd565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ddc83610ad7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611e2e83610ad7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e705750611e6f81856113ab565b5b80611eae57508373ffffffffffffffffffffffffffffffffffffffff16611e9684610734565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ed782610ad7565b73ffffffffffffffffffffffffffffffffffffffff1614611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f24906140a6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9390614138565b60405180910390fd5b611fa78383836124bf565b611fb2600082611d69565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120029190613e7d565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120599190613eb1565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461211883838361255c565b505050565b6121278282611194565b6121b65761214c8173ffffffffffffffffffffffffffffffffffffffff166014612561565b61215a8360001c6020612561565b60405160200161216b9291906141f0565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ad9190612e14565b60405180910390fd5b5050565b6121c4838361279d565b6121d16000848484612976565b612210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122079061429c565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227a90614308565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123749190612d60565b60405180910390a3505050565b61238c848484611eb7565b61239884848484612976565b6123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce9061429c565b60405180910390fd5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124a857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124b857506124b782612afd565b5b9050919050565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561254c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254390614374565b60405180910390fd5b612557838383612b77565b505050565b505050565b6060600060028360026125749190613612565b61257e9190613eb1565b67ffffffffffffffff8111156125975761259661323f565b5b6040519080825280601f01601f1916602001820160405280156125c95781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061260157612600613f07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061266557612664613f07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026126a59190613612565b6126af9190613eb1565b90505b600181111561274f577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106126f1576126f0613f07565b5b1a60f81b82828151811061270857612707613f07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061274890614394565b90506126b2565b5060008414612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a90614409565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361280c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280390614475565b60405180910390fd5b61281581611cfd565b15612855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284c906144e1565b60405180910390fd5b612861600083836124bf565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128b19190613eb1565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129726000838361255c565b5050565b60006129978473ffffffffffffffffffffffffffffffffffffffff16612b7c565b15612af0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129c0611877565b8786866040518563ffffffff1660e01b81526004016129e29493929190614556565b6020604051808303816000875af1925050508015612a1e57506040513d601f19601f82011682018060405250810190612a1b91906145b7565b60015b612aa0573d8060008114612a4e576040519150601f19603f3d011682016040523d82523d6000602084013e612a53565b606091505b506000815103612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f9061429c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612af5565b600190505b949350505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b705750612b6f82612b9f565b5b9050919050565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054612c15906135b2565b90600052602060002090601f016020900481019282612c375760008555612c7e565b82601f10612c5057805160ff1916838001178555612c7e565b82800160010185558215612c7e579182015b82811115612c7d578251825591602001919060010190612c62565b5b509050612c8b9190612c8f565b5090565b5b80821115612ca8576000816000905550600101612c90565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cf581612cc0565b8114612d0057600080fd5b50565b600081359050612d1281612cec565b92915050565b600060208284031215612d2e57612d2d612cb6565b5b6000612d3c84828501612d03565b91505092915050565b60008115159050919050565b612d5a81612d45565b82525050565b6000602082019050612d756000830184612d51565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612db5578082015181840152602081019050612d9a565b83811115612dc4576000848401525b50505050565b6000601f19601f8301169050919050565b6000612de682612d7b565b612df08185612d86565b9350612e00818560208601612d97565b612e0981612dca565b840191505092915050565b60006020820190508181036000830152612e2e8184612ddb565b905092915050565b6000819050919050565b612e4981612e36565b8114612e5457600080fd5b50565b600081359050612e6681612e40565b92915050565b600060208284031215612e8257612e81612cb6565b5b6000612e9084828501612e57565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ec482612e99565b9050919050565b612ed481612eb9565b82525050565b6000602082019050612eef6000830184612ecb565b92915050565b612efe81612eb9565b8114612f0957600080fd5b50565b600081359050612f1b81612ef5565b92915050565b60008060408385031215612f3857612f37612cb6565b5b6000612f4685828601612f0c565b9250506020612f5785828601612e57565b9150509250929050565b600080600060608486031215612f7a57612f79612cb6565b5b6000612f8886828701612f0c565b9350506020612f9986828701612f0c565b9250506040612faa86828701612e57565b9150509250925092565b6000819050919050565b612fc781612fb4565b8114612fd257600080fd5b50565b600081359050612fe481612fbe565b92915050565b60006020828403121561300057612fff612cb6565b5b600061300e84828501612fd5565b91505092915050565b61302081612fb4565b82525050565b600060208201905061303b6000830184613017565b92915050565b6000806040838503121561305857613057612cb6565b5b600061306685828601612e57565b925050602061307785828601612e57565b9150509250929050565b61308a81612e36565b82525050565b60006040820190506130a56000830185612ecb565b6130b26020830184613081565b9392505050565b600080604083850312156130d0576130cf612cb6565b5b60006130de85828601612fd5565b92505060206130ef85828601612f0c565b9150509250929050565b6000819050919050565b600061311e61311961311484612e99565b6130f9565b612e99565b9050919050565b600061313082613103565b9050919050565b600061314282613125565b9050919050565b61315281613137565b82525050565b600060208201905061316d6000830184613149565b92915050565b600061ffff82169050919050565b61318a81613173565b811461319557600080fd5b50565b6000813590506131a781613181565b92915050565b600080604083850312156131c4576131c3612cb6565b5b60006131d285828601612f0c565b92505060206131e385828601613198565b9150509250929050565b60006020828403121561320357613202612cb6565b5b600061321184828501612f0c565b91505092915050565b600060208201905061322f6000830184613081565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61327782612dca565b810181811067ffffffffffffffff821117156132965761329561323f565b5b80604052505050565b60006132a9612cac565b90506132b5828261326e565b919050565b600067ffffffffffffffff8211156132d5576132d461323f565b5b6132de82612dca565b9050602081019050919050565b82818337600083830152505050565b600061330d613308846132ba565b61329f565b9050828152602081018484840111156133295761332861323a565b5b6133348482856132eb565b509392505050565b600082601f83011261335157613350613235565b5b81356133618482602086016132fa565b91505092915050565b6000602082840312156133805761337f612cb6565b5b600082013567ffffffffffffffff81111561339e5761339d612cbb565b5b6133aa8482850161333c565b91505092915050565b6133bc81612d45565b81146133c757600080fd5b50565b6000813590506133d9816133b3565b92915050565b600080604083850312156133f6576133f5612cb6565b5b600061340485828601612f0c565b9250506020613415858286016133ca565b9150509250929050565b600067ffffffffffffffff82111561343a5761343961323f565b5b61344382612dca565b9050602081019050919050565b600061346361345e8461341f565b61329f565b90508281526020810184848401111561347f5761347e61323a565b5b61348a8482856132eb565b509392505050565b600082601f8301126134a7576134a6613235565b5b81356134b7848260208601613450565b91505092915050565b600080600080608085870312156134da576134d9612cb6565b5b60006134e887828801612f0c565b94505060206134f987828801612f0c565b935050604061350a87828801612e57565b925050606085013567ffffffffffffffff81111561352b5761352a612cbb565b5b61353787828801613492565b91505092959194509250565b6000806040838503121561355a57613559612cb6565b5b600061356885828601612f0c565b925050602061357985828601612f0c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135ca57607f821691505b6020821081036135dd576135dc613583565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061361d82612e36565b915061362883612e36565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613661576136606135e3565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006136a682612e36565b91506136b183612e36565b9250826136c1576136c061366c565b5b828204905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613728602f83612d86565b9150613733826136cc565b604082019050919050565b600060208201905081810360008301526137578161371b565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613794601883612d86565b915061379f8261375e565b602082019050919050565b600060208201905081810360008301526137c381613787565b9050919050565b60006137d582612e36565b91506137e083612e36565b9250826137f0576137ef61366c565b5b828206905092915050565b600081905092915050565b60008190508160005260206000209050919050565b60008154613828816135b2565b61383281866137fb565b9450600182166000811461384d576001811461385e57613891565b60ff19831686528186019350613891565b61386785613806565b60005b838110156138895781548189015260018201915060208101905061386a565b838801955050505b50505092915050565b7f782e6a736f6e0000000000000000000000000000000000000000000000000000600082015250565b60006138d06006836137fb565b91506138db8261389a565b600682019050919050565b60006138f2828461381b565b91506138fd826138c3565b915081905092915050565b600061391382612d7b565b61391d81856137fb565b935061392d818560208601612d97565b80840191505092915050565b7f732e6a736f6e0000000000000000000000000000000000000000000000000000600082015250565b600061396f6006836137fb565b915061397a82613939565b600682019050919050565b6000613991828561381b565b915061399d8284613908565b91506139a882613962565b91508190509392505050565b7f642e6a736f6e0000000000000000000000000000000000000000000000000000600082015250565b60006139ea6006836137fb565b91506139f5826139b4565b600682019050919050565b6000613a0c828561381b565b9150613a188284613908565b9150613a23826139dd565b91508190509392505050565b7f6e2e6a736f6e0000000000000000000000000000000000000000000000000000600082015250565b6000613a656006836137fb565b9150613a7082613a2f565b600682019050919050565b6000613a87828561381b565b9150613a938284613908565b9150613a9e82613a58565b91508190509392505050565b7f696e76616c69642076657273696f6e0000000000000000000000000000000000600082015250565b6000613ae0600f83612d86565b9150613aeb82613aaa565b602082019050919050565b60006020820190508181036000830152613b0f81613ad3565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613b72602983612d86565b9150613b7d82613b16565b604082019050919050565b60006020820190508181036000830152613ba181613b65565b9050919050565b600081519050613bb781612ef5565b92915050565b600060208284031215613bd357613bd2612cb6565b5b6000613be184828501613ba8565b91505092915050565b6000613bf582613173565b915061ffff8203613c0957613c086135e3565b5b600182019050919050565b6000613c1f82612e36565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c5157613c506135e3565b5b600182019050919050565b6000604082019050613c716000830185612ecb565b613c7e6020830184612ecb565b9392505050565b600081519050613c94816133b3565b92915050565b600060208284031215613cb057613caf612cb6565b5b6000613cbe84828501613c85565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d23602183612d86565b9150613d2e82613cc7565b604082019050919050565b60006020820190508181036000830152613d5281613d16565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613db5603e83612d86565b9150613dc082613d59565b604082019050919050565b60006020820190508181036000830152613de481613da8565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613e47602e83612d86565b9150613e5282613deb565b604082019050919050565b60006020820190508181036000830152613e7681613e3a565b9050919050565b6000613e8882612e36565b9150613e9383612e36565b925082821015613ea657613ea56135e3565b5b828203905092915050565b6000613ebc82612e36565b9150613ec783612e36565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613efc57613efb6135e3565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000613f92602a83612d86565b9150613f9d82613f36565b604082019050919050565b60006020820190508181036000830152613fc181613f85565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000613ffe601983612d86565b915061400982613fc8565b602082019050919050565b6000602082019050818103600083015261402d81613ff1565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614090602583612d86565b915061409b82614034565b604082019050919050565b600060208201905081810360008301526140bf81614083565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614122602483612d86565b915061412d826140c6565b604082019050919050565b6000602082019050818103600083015261415181614115565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061418e6017836137fb565b915061419982614158565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006141da6011836137fb565b91506141e5826141a4565b601182019050919050565b60006141fb82614181565b91506142078285613908565b9150614212826141cd565b915061421e8284613908565b91508190509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614286603283612d86565b91506142918261422a565b604082019050919050565b600060208201905081810360008301526142b581614279565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006142f2601983612d86565b91506142fd826142bc565b602082019050919050565b60006020820190508181036000830152614321816142e5565b9050919050565b7f746f6b656e20697320667265657a656400000000000000000000000000000000600082015250565b600061435e601083612d86565b915061436982614328565b602082019050919050565b6000602082019050818103600083015261438d81614351565b9050919050565b600061439f82612e36565b9150600082036143b2576143b16135e3565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006143f3602083612d86565b91506143fe826143bd565b602082019050919050565b60006020820190508181036000830152614422816143e6565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061445f602083612d86565b915061446a82614429565b602082019050919050565b6000602082019050818103600083015261448e81614452565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006144cb601c83612d86565b91506144d682614495565b602082019050919050565b600060208201905081810360008301526144fa816144be565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061452882614501565b614532818561450c565b9350614542818560208601612d97565b61454b81612dca565b840191505092915050565b600060808201905061456b6000830187612ecb565b6145786020830186612ecb565b6145856040830185613081565b8181036060830152614597818461451d565b905095945050505050565b6000815190506145b181612cec565b92915050565b6000602082840312156145cd576145cc612cb6565b5b60006145db848285016145a2565b9150509291505056fea26469706673582212207ed4bfcc3db54a56fd069a60367eb9574d599e94e37bbd87494140024b9951d164736f6c634300080d0033000000000000000000000000dbea9f0ea43c16e5caa4685a4faf7bdf9fe77c55

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806370a08231116100f9578063a217fddf11610097578063b88d4fde11610071578063b88d4fde14610528578063c87b56dd14610544578063d547741f14610574578063e985e9c514610590576101c4565b8063a217fddf146104d0578063a22cb465146104ee578063a89c45b31461050a576101c4565b80637c93c87e116100d35780637c93c87e1461044a57806391d148541461046657806395d89b41146104965780639b642de1146104b4576101c4565b806370a08231146103ce578063721a1db4146103fe57806372e2f8f51461041a576101c4565b80632f2ff15d1161016657806342842e0e1161014057806342842e0e146103365780636352211e1461035257806369ae9bb1146103825780636b1afa20146103b2576101c4565b80632f2ff15d146102e057806336568abe146102fc57806341f4343414610318576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806323b872dd14610263578063248a9ca31461027f5780632a55205a146102af576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de9190612d18565b6105c0565b6040516101f09190612d60565b60405180910390f35b6102016106a2565b60405161020e9190612e14565b60405180910390f35b610231600480360381019061022c9190612e6c565b610734565b60405161023e9190612eda565b60405180910390f35b610261600480360381019061025c9190612f21565b61077a565b005b61027d60048036038101906102789190612f61565b610793565b005b61029960048036038101906102949190612fea565b6107f7565b6040516102a69190613026565b60405180910390f35b6102c960048036038101906102c49190613041565b610817565b6040516102d7929190613090565b60405180910390f35b6102fa60048036038101906102f591906130b9565b610a01565b005b610316600480360381019061031191906130b9565b610a22565b005b610320610aa5565b60405161032d9190613158565b60405180910390f35b610350600480360381019061034b9190612f61565b610ab7565b005b61036c60048036038101906103679190612e6c565b610ad7565b6040516103799190612eda565b60405180910390f35b61039c60048036038101906103979190613041565b610b88565b6040516103a99190612e14565b60405180910390f35b6103cc60048036038101906103c791906131ad565b610e96565b005b6103e860048036038101906103e391906131ed565b610eb6565b6040516103f5919061321a565b60405180910390f35b61041860048036038101906104139190612e6c565b610f6d565b005b610434600480360381019061042f91906131ed565b6110d6565b6040516104419190612d60565b60405180910390f35b610464600480360381019061045f91906131ed565b61112c565b005b610480600480360381019061047b91906130b9565b611194565b60405161048d9190612d60565b60405180910390f35b61049e6111ff565b6040516104ab9190612e14565b60405180910390f35b6104ce60048036038101906104c9919061336a565b611291565b005b6104d86112b9565b6040516104e59190613026565b60405180910390f35b610508600480360381019061050391906133df565b6112c0565b005b6105126112d9565b60405161051f9190612eda565b60405180910390f35b610542600480360381019061053d91906134c0565b611311565b005b61055e60048036038101906105599190612e6c565b611377565b60405161056b9190612e14565b60405180910390f35b61058e600480360381019061058991906130b9565b61138a565b005b6105aa60048036038101906105a59190613543565b6113ab565b6040516105b79190612d60565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061068b57507fda8def73000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061069b575061069a8261143f565b5b9050919050565b6060600280546106b1906135b2565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd906135b2565b801561072a5780601f106106ff5761010080835404028352916020019161072a565b820191906000526020600020905b81548152906001019060200180831161070d57829003601f168201915b5050505050905090565b600061073f826114b9565b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8161078481611504565b61078e8383611601565b505050565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146107d1576107d033611504565b5b60006107dc84610eb6565b146107e657600080fd5b6107f1848484611718565b50505050565b600060086000838152602001908152602001600020600101549050919050565b6000806000600160008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036109ac5760006040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b60006109b6611778565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff16866109e29190613612565b6109ec919061369b565b90508160000151819350935050509250929050565b610a0a826107f7565b610a1381611782565b610a1d8383611796565b505050565b610a2a611877565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8e9061373e565b60405180910390fd5b610aa1828261187f565b5050565b6daaeb6d7670e522a718067333cd4e81565b610ad283838360405180602001604052806000815250611311565b505050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b76906137aa565b60405180910390fd5b80915050919050565b60606000610e106201518084610b9e91906137ca565b610ba8919061369b565b90506001610bbd610bb886610ad7565b610eb6565b1115610bec57600a604051602001610bd591906138e6565b604051602081830303815290604052915050610e90565b60011515600b6000610bfd87610ad7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503610c7f57600a610c5785611961565b604051602001610c68929190613985565b604051602081830303815290604052915050610e90565b60001515600b6000610c9087610ad7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148015610ce85750600c5481105b15610d2057600a610cf885611961565b604051602001610d09929190613a00565b604051602081830303815290604052915050610e90565b60001515600b6000610d3187610ad7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148015610d8a5750600d548110155b15610dc257600a610d9a85611961565b604051602001610dab929190613a00565b604051602081830303815290604052915050610e90565b60001515600b6000610dd387610ad7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151503610e5557600a610e2d85611961565b604051602001610e3e929190613a7b565b604051602081830303815290604052915050610e90565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8790613af6565b60405180910390fd5b92915050565b6000801b610ea381611782565b610eb1838361ffff16611ac1565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90613b88565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000801b610f7a81611782565b600e60149054906101000a900461ffff1661ffff168210610f9a57600080fd5b600e60169054906101000a900461ffff1661ffff16821015610fbb57600080fd5b6000600e60169054906101000a900461ffff1661ffff1690505b8281116110d1576110be600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b93f9b0a836040518263ffffffff1660e01b815260040161103a919061321a565b602060405180830381865afa158015611057573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107b9190613bbd565b600e601681819054906101000a900461ffff168092919061109b90613bea565b91906101000a81548161ffff021916908361ffff16021790555061ffff16611c55565b80806110c990613c14565b915050610fd5565b505050565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60095461113881611782565b6001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60606003805461120e906135b2565b80601f016020809104026020016040519081016040528092919081815260200182805461123a906135b2565b80156112875780601f1061125c57610100808354040283529160200191611287565b820191906000526020600020905b81548152906001019060200180831161126a57829003601f168201915b5050505050905090565b6000801b61129e81611782565b81600a90805190602001906112b4929190612c09565b505050565b6000801b81565b816112ca81611504565b6112d48383611c73565b505050565b60008060001b6112e881611782565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691505090565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461134f5761134e33611504565b5b600061135a85610eb6565b1461136457600080fd5b61137085858585611c89565b5050505050565b60606113838242610b88565b9050919050565b611393826107f7565b61139c81611782565b6113a6838361187f565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806114b257506114b182611ceb565b5b9050919050565b6114c281611cfd565b611501576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f8906137aa565b60405180910390fd5b50565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156115fe576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161157b929190613c5c565b602060405180830381865afa158015611598573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bc9190613c9a565b6115fd57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016115f49190612eda565b60405180910390fd5b5b50565b600061160c82610ad7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361167c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167390613d39565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661169b611877565b73ffffffffffffffffffffffffffffffffffffffff1614806116ca57506116c9816116c4611877565b6113ab565b5b611709576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170090613dcb565b60405180910390fd5b6117138383611d69565b505050565b611729611723611877565b82611e22565b611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175f90613e5d565b60405180910390fd5b611773838383611eb7565b505050565b6000612710905090565b6117938161178e611877565b61211d565b50565b6117a08282611194565b6118735760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611818611877565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600033905090565b6118898282611194565b1561195d5760006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611902611877565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6060600082036119a8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611abc565b600082905060005b600082146119da5780806119c390613c14565b915050600a826119d3919061369b565b91506119b0565b60008167ffffffffffffffff8111156119f6576119f561323f565b5b6040519080825280601f01601f191660200182016040528015611a285781602001600182028036833780820191505090505b5090505b60008514611ab557600182611a419190613e7d565b9150600a85611a5091906137ca565b6030611a5c9190613eb1565b60f81b818381518110611a7257611a71613f07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611aae919061369b565b9450611a2c565b8093505050505b919050565b611ac9611778565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1e90613fa8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8d90614014565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506000808201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b611c6f8282604051806020016040528060008152506121ba565b5050565b611c85611c7e611877565b8383612215565b5050565b611c9a611c94611877565b83611e22565b611cd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd090613e5d565b60405180910390fd5b611ce584848484612381565b50505050565b6000611cf6826123dd565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ddc83610ad7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611e2e83610ad7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e705750611e6f81856113ab565b5b80611eae57508373ffffffffffffffffffffffffffffffffffffffff16611e9684610734565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ed782610ad7565b73ffffffffffffffffffffffffffffffffffffffff1614611f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f24906140a6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611f9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9390614138565b60405180910390fd5b611fa78383836124bf565b611fb2600082611d69565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120029190613e7d565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120599190613eb1565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461211883838361255c565b505050565b6121278282611194565b6121b65761214c8173ffffffffffffffffffffffffffffffffffffffff166014612561565b61215a8360001c6020612561565b60405160200161216b9291906141f0565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ad9190612e14565b60405180910390fd5b5050565b6121c4838361279d565b6121d16000848484612976565b612210576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122079061429c565b60405180910390fd5b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612283576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227a90614308565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123749190612d60565b60405180910390a3505050565b61238c848484611eb7565b61239884848484612976565b6123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce9061429c565b60405180910390fd5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124a857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124b857506124b782612afd565b5b9050919050565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561254c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254390614374565b60405180910390fd5b612557838383612b77565b505050565b505050565b6060600060028360026125749190613612565b61257e9190613eb1565b67ffffffffffffffff8111156125975761259661323f565b5b6040519080825280601f01601f1916602001820160405280156125c95781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061260157612600613f07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061266557612664613f07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026126a59190613612565b6126af9190613eb1565b90505b600181111561274f577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106126f1576126f0613f07565b5b1a60f81b82828151811061270857612707613f07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061274890614394565b90506126b2565b5060008414612793576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278a90614409565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361280c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280390614475565b60405180910390fd5b61281581611cfd565b15612855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284c906144e1565b60405180910390fd5b612861600083836124bf565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128b19190613eb1565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129726000838361255c565b5050565b60006129978473ffffffffffffffffffffffffffffffffffffffff16612b7c565b15612af0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129c0611877565b8786866040518563ffffffff1660e01b81526004016129e29493929190614556565b6020604051808303816000875af1925050508015612a1e57506040513d601f19601f82011682018060405250810190612a1b91906145b7565b60015b612aa0573d8060008114612a4e576040519150601f19603f3d011682016040523d82523d6000602084013e612a53565b606091505b506000815103612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f9061429c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612af5565b600190505b949350505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b705750612b6f82612b9f565b5b9050919050565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b828054612c15906135b2565b90600052602060002090601f016020900481019282612c375760008555612c7e565b82601f10612c5057805160ff1916838001178555612c7e565b82800160010185558215612c7e579182015b82811115612c7d578251825591602001919060010190612c62565b5b509050612c8b9190612c8f565b5090565b5b80821115612ca8576000816000905550600101612c90565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cf581612cc0565b8114612d0057600080fd5b50565b600081359050612d1281612cec565b92915050565b600060208284031215612d2e57612d2d612cb6565b5b6000612d3c84828501612d03565b91505092915050565b60008115159050919050565b612d5a81612d45565b82525050565b6000602082019050612d756000830184612d51565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612db5578082015181840152602081019050612d9a565b83811115612dc4576000848401525b50505050565b6000601f19601f8301169050919050565b6000612de682612d7b565b612df08185612d86565b9350612e00818560208601612d97565b612e0981612dca565b840191505092915050565b60006020820190508181036000830152612e2e8184612ddb565b905092915050565b6000819050919050565b612e4981612e36565b8114612e5457600080fd5b50565b600081359050612e6681612e40565b92915050565b600060208284031215612e8257612e81612cb6565b5b6000612e9084828501612e57565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ec482612e99565b9050919050565b612ed481612eb9565b82525050565b6000602082019050612eef6000830184612ecb565b92915050565b612efe81612eb9565b8114612f0957600080fd5b50565b600081359050612f1b81612ef5565b92915050565b60008060408385031215612f3857612f37612cb6565b5b6000612f4685828601612f0c565b9250506020612f5785828601612e57565b9150509250929050565b600080600060608486031215612f7a57612f79612cb6565b5b6000612f8886828701612f0c565b9350506020612f9986828701612f0c565b9250506040612faa86828701612e57565b9150509250925092565b6000819050919050565b612fc781612fb4565b8114612fd257600080fd5b50565b600081359050612fe481612fbe565b92915050565b60006020828403121561300057612fff612cb6565b5b600061300e84828501612fd5565b91505092915050565b61302081612fb4565b82525050565b600060208201905061303b6000830184613017565b92915050565b6000806040838503121561305857613057612cb6565b5b600061306685828601612e57565b925050602061307785828601612e57565b9150509250929050565b61308a81612e36565b82525050565b60006040820190506130a56000830185612ecb565b6130b26020830184613081565b9392505050565b600080604083850312156130d0576130cf612cb6565b5b60006130de85828601612fd5565b92505060206130ef85828601612f0c565b9150509250929050565b6000819050919050565b600061311e61311961311484612e99565b6130f9565b612e99565b9050919050565b600061313082613103565b9050919050565b600061314282613125565b9050919050565b61315281613137565b82525050565b600060208201905061316d6000830184613149565b92915050565b600061ffff82169050919050565b61318a81613173565b811461319557600080fd5b50565b6000813590506131a781613181565b92915050565b600080604083850312156131c4576131c3612cb6565b5b60006131d285828601612f0c565b92505060206131e385828601613198565b9150509250929050565b60006020828403121561320357613202612cb6565b5b600061321184828501612f0c565b91505092915050565b600060208201905061322f6000830184613081565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61327782612dca565b810181811067ffffffffffffffff821117156132965761329561323f565b5b80604052505050565b60006132a9612cac565b90506132b5828261326e565b919050565b600067ffffffffffffffff8211156132d5576132d461323f565b5b6132de82612dca565b9050602081019050919050565b82818337600083830152505050565b600061330d613308846132ba565b61329f565b9050828152602081018484840111156133295761332861323a565b5b6133348482856132eb565b509392505050565b600082601f83011261335157613350613235565b5b81356133618482602086016132fa565b91505092915050565b6000602082840312156133805761337f612cb6565b5b600082013567ffffffffffffffff81111561339e5761339d612cbb565b5b6133aa8482850161333c565b91505092915050565b6133bc81612d45565b81146133c757600080fd5b50565b6000813590506133d9816133b3565b92915050565b600080604083850312156133f6576133f5612cb6565b5b600061340485828601612f0c565b9250506020613415858286016133ca565b9150509250929050565b600067ffffffffffffffff82111561343a5761343961323f565b5b61344382612dca565b9050602081019050919050565b600061346361345e8461341f565b61329f565b90508281526020810184848401111561347f5761347e61323a565b5b61348a8482856132eb565b509392505050565b600082601f8301126134a7576134a6613235565b5b81356134b7848260208601613450565b91505092915050565b600080600080608085870312156134da576134d9612cb6565b5b60006134e887828801612f0c565b94505060206134f987828801612f0c565b935050604061350a87828801612e57565b925050606085013567ffffffffffffffff81111561352b5761352a612cbb565b5b61353787828801613492565b91505092959194509250565b6000806040838503121561355a57613559612cb6565b5b600061356885828601612f0c565b925050602061357985828601612f0c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135ca57607f821691505b6020821081036135dd576135dc613583565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061361d82612e36565b915061362883612e36565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613661576136606135e3565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006136a682612e36565b91506136b183612e36565b9250826136c1576136c061366c565b5b828204905092915050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613728602f83612d86565b9150613733826136cc565b604082019050919050565b600060208201905081810360008301526137578161371b565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613794601883612d86565b915061379f8261375e565b602082019050919050565b600060208201905081810360008301526137c381613787565b9050919050565b60006137d582612e36565b91506137e083612e36565b9250826137f0576137ef61366c565b5b828206905092915050565b600081905092915050565b60008190508160005260206000209050919050565b60008154613828816135b2565b61383281866137fb565b9450600182166000811461384d576001811461385e57613891565b60ff19831686528186019350613891565b61386785613806565b60005b838110156138895781548189015260018201915060208101905061386a565b838801955050505b50505092915050565b7f782e6a736f6e0000000000000000000000000000000000000000000000000000600082015250565b60006138d06006836137fb565b91506138db8261389a565b600682019050919050565b60006138f2828461381b565b91506138fd826138c3565b915081905092915050565b600061391382612d7b565b61391d81856137fb565b935061392d818560208601612d97565b80840191505092915050565b7f732e6a736f6e0000000000000000000000000000000000000000000000000000600082015250565b600061396f6006836137fb565b915061397a82613939565b600682019050919050565b6000613991828561381b565b915061399d8284613908565b91506139a882613962565b91508190509392505050565b7f642e6a736f6e0000000000000000000000000000000000000000000000000000600082015250565b60006139ea6006836137fb565b91506139f5826139b4565b600682019050919050565b6000613a0c828561381b565b9150613a188284613908565b9150613a23826139dd565b91508190509392505050565b7f6e2e6a736f6e0000000000000000000000000000000000000000000000000000600082015250565b6000613a656006836137fb565b9150613a7082613a2f565b600682019050919050565b6000613a87828561381b565b9150613a938284613908565b9150613a9e82613a58565b91508190509392505050565b7f696e76616c69642076657273696f6e0000000000000000000000000000000000600082015250565b6000613ae0600f83612d86565b9150613aeb82613aaa565b602082019050919050565b60006020820190508181036000830152613b0f81613ad3565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000613b72602983612d86565b9150613b7d82613b16565b604082019050919050565b60006020820190508181036000830152613ba181613b65565b9050919050565b600081519050613bb781612ef5565b92915050565b600060208284031215613bd357613bd2612cb6565b5b6000613be184828501613ba8565b91505092915050565b6000613bf582613173565b915061ffff8203613c0957613c086135e3565b5b600182019050919050565b6000613c1f82612e36565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c5157613c506135e3565b5b600182019050919050565b6000604082019050613c716000830185612ecb565b613c7e6020830184612ecb565b9392505050565b600081519050613c94816133b3565b92915050565b600060208284031215613cb057613caf612cb6565b5b6000613cbe84828501613c85565b91505092915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613d23602183612d86565b9150613d2e82613cc7565b604082019050919050565b60006020820190508181036000830152613d5281613d16565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b6000613db5603e83612d86565b9150613dc082613d59565b604082019050919050565b60006020820190508181036000830152613de481613da8565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6000613e47602e83612d86565b9150613e5282613deb565b604082019050919050565b60006020820190508181036000830152613e7681613e3a565b9050919050565b6000613e8882612e36565b9150613e9383612e36565b925082821015613ea657613ea56135e3565b5b828203905092915050565b6000613ebc82612e36565b9150613ec783612e36565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613efc57613efb6135e3565b5b828201905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000613f92602a83612d86565b9150613f9d82613f36565b604082019050919050565b60006020820190508181036000830152613fc181613f85565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b6000613ffe601983612d86565b915061400982613fc8565b602082019050919050565b6000602082019050818103600083015261402d81613ff1565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614090602583612d86565b915061409b82614034565b604082019050919050565b600060208201905081810360008301526140bf81614083565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614122602483612d86565b915061412d826140c6565b604082019050919050565b6000602082019050818103600083015261415181614115565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061418e6017836137fb565b915061419982614158565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006141da6011836137fb565b91506141e5826141a4565b601182019050919050565b60006141fb82614181565b91506142078285613908565b9150614212826141cd565b915061421e8284613908565b91508190509392505050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614286603283612d86565b91506142918261422a565b604082019050919050565b600060208201905081810360008301526142b581614279565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006142f2601983612d86565b91506142fd826142bc565b602082019050919050565b60006020820190508181036000830152614321816142e5565b9050919050565b7f746f6b656e20697320667265657a656400000000000000000000000000000000600082015250565b600061435e601083612d86565b915061436982614328565b602082019050919050565b6000602082019050818103600083015261438d81614351565b9050919050565b600061439f82612e36565b9150600082036143b2576143b16135e3565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006143f3602083612d86565b91506143fe826143bd565b602082019050919050565b60006020820190508181036000830152614422816143e6565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061445f602083612d86565b915061446a82614429565b602082019050919050565b6000602082019050818103600083015261448e81614452565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006144cb601c83612d86565b91506144d682614495565b602082019050919050565b600060208201905081810360008301526144fa816144be565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061452882614501565b614532818561450c565b9350614542818560208601612d97565b61454b81612dca565b840191505092915050565b600060808201905061456b6000830187612ecb565b6145786020830186612ecb565b6145856040830185613081565b8181036060830152614597818461451d565b905095945050505050565b6000815190506145b181612cec565b92915050565b6000602082840312156145cd576145cc612cb6565b5b60006145db848285016145a2565b9150509291505056fea26469706673582212207ed4bfcc3db54a56fd069a60367eb9574d599e94e37bbd87494140024b9951d164736f6c634300080d0033

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

000000000000000000000000dbea9f0ea43c16e5caa4685a4faf7bdf9fe77c55

-----Decoded View---------------
Arg [0] : passAddress (address): 0xDbEA9F0Ea43c16e5cAA4685A4FaF7BDf9FE77c55

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


Deployed Bytecode Sourcemap

62120:4641:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64676:349;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43214:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44727:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65252:189;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64148:235;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21706:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58035:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;22147:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23291:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7269:143;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45834:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42925:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65755:1003;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63351:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42656:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63013:330;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63631:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63514:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20166:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43383:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62902:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19271:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65033:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63745:142;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64391:277;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65569:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22587:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45196:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64676:349;64819:4;64876:25;64861:40;;;:11;:40;;;;:103;;;;64933:31;64918:46;;;:11;:46;;;;64861:103;:156;;;;64981:36;65005:11;64981:23;:36::i;:::-;64861:156;64841:176;;64676:349;;;:::o;43214:100::-;43268:13;43301:5;43294:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43214:100;:::o;44727:171::-;44803:7;44823:23;44838:7;44823:14;:23::i;:::-;44866:15;:24;44882:7;44866:24;;;;;;;;;;;;;;;;;;;;;44859:31;;44727:171;;;:::o;65252:189::-;65375:8;8790:30;8811:8;8790:20;:30::i;:::-;65401:32:::1;65415:8;65425:7;65401:13;:32::i;:::-;65252:189:::0;;;:::o;64148:235::-;64283:4;8618:10;8610:18;;:4;:18;;;8606:83;;8645:32;8666:10;8645:20;:32::i;:::-;8606:83;64324:1:::1;64307:13;64317:2;64307:9;:13::i;:::-;:18;64299:27;;;::::0;::::1;;64337:38;64357:4;64363:2;64367:7;64337:19;:38::i;:::-;64148:235:::0;;;;:::o;21706:131::-;21780:7;21807:6;:12;21814:4;21807:12;;;;;;;;;;;:22;;;21800:29;;21706:131;;;:::o;58035:442::-;58132:7;58141;58161:26;58190:17;:27;58208:8;58190:27;;;;;;;;;;;58161:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58262:1;58234:30;;:7;:16;;;:30;;;58230:92;;58291:19;58281:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58230:92;58334:21;58399:17;:15;:17::i;:::-;58358:58;;58372:7;:23;;;58359:36;;:10;:36;;;;:::i;:::-;58358:58;;;;:::i;:::-;58334:82;;58437:7;:16;;;58455:13;58429:40;;;;;;58035:442;;;;;:::o;22147:147::-;22230:18;22243:4;22230:12;:18::i;:::-;19762:16;19773:4;19762:10;:16::i;:::-;22261:25:::1;22272:4;22278:7;22261:10;:25::i;:::-;22147:147:::0;;;:::o;23291:218::-;23398:12;:10;:12::i;:::-;23387:23;;:7;:23;;;23379:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;23475:26;23487:4;23493:7;23475:11;:26::i;:::-;23291:218;;:::o;7269:143::-;7369:42;7269:143;:::o;45834:185::-;45972:39;45989:4;45995:2;45999:7;45972:39;;;;;;;;;;;;:16;:39::i;:::-;45834:185;;;:::o;42925:222::-;42997:7;43017:13;43033:7;:16;43041:7;43033:16;;;;;;;;;;;;;;;;;;;;;43017:32;;43085:1;43068:19;;:5;:19;;;43060:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;43134:5;43127:12;;;42925:222;;;:::o;65755:1003::-;65854:13;65885:12;65933:7;65915:12;65902:9;:26;;;;:::i;:::-;65901:40;;;;:::i;:::-;65885:57;;65988:1;65956:29;65967:16;65975:7;65967;:16::i;:::-;65956:9;:29::i;:::-;:33;65953:798;;;66037:7;66020:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;66006:50;;;;;65953:798;66109:4;66078:35;;:9;:27;66088:16;66096:7;66088;:16::i;:::-;66078:27;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;66074:677;;66161:7;66170:18;:7;:16;:18::i;:::-;66144:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66130:70;;;;;66074:677;66252:5;66221:36;;:9;:27;66231:16;66239:7;66231;:16::i;:::-;66221:27;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;:61;;;;;66268:14;;66261:4;:21;66221:61;66218:533;;;66330:7;66339:18;:7;:16;:18::i;:::-;66313:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66299:70;;;;;66218:533;66421:5;66390:36;;:9;:27;66400:16;66408:7;66400;:16::i;:::-;66390:27;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;:60;;;;;66438:12;;66430:4;:20;;66390:60;66387:364;;;66498:7;66507:18;:7;:16;:18::i;:::-;66481:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66467:70;;;;;66387:364;66589:5;66558:36;;:9;:27;66568:16;66576:7;66568;:16::i;:::-;66558:27;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;66555:196;;66642:7;66651:18;:7;:16;:18::i;:::-;66625:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66611:70;;;;;66555:196;66714:25;;;;;;;;;;:::i;:::-;;;;;;;;65755:1003;;;;;:::o;63351:155::-;19316:4;63427:18;;19762:16;19773:4;19762:10;:16::i;:::-;63458:40:::1;63477:10;63489:8;63458:40;;:18;:40::i;:::-;63351:155:::0;;;:::o;42656:207::-;42728:7;42773:1;42756:19;;:5;:19;;;42748:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42839:9;:16;42849:5;42839:16;;;;;;;;;;;;;;;;42832:23;;42656:207;;;:::o;63013:330::-;19316:4;63063:18;;19762:16;19773:4;19762:10;:16::i;:::-;63110:13:::1;;;;;;;;;;;63102:21;;:5;:21;63094:30;;;::::0;::::1;;63152:14;;;;;;;;;;;63143:23;;:5;:23;;63135:32;;;::::0;::::1;;63183:9;63195:14;;;;;;;;;;;63183:26;;;;63178:158;63216:5;63211:1;:10;63178:158;;63243:81;63269:21;;;;;;;;;;;63253:49;;;63303:1;63253:52;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63307:14;;:16;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;63243:81;;:9;:81::i;:::-;63223:3;;;;;:::i;:::-;;;;63178:158;;;;63013:330:::0;;:::o;63631:106::-;63688:4;63712:9;:17;63722:6;63712:17;;;;;;;;;;;;;;;;;;;;;;;;;63705:24;;63631:106;;;:::o;63514:109::-;63567:11;;19762:16;19773:4;19762:10;:16::i;:::-;63611:4:::1;63591:9;:17;63601:6;63591:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;63514:109:::0;;:::o;20166:147::-;20252:4;20276:6;:12;20283:4;20276:12;;;;;;;;;;;:20;;:29;20297:7;20276:29;;;;;;;;;;;;;;;;;;;;;;;;;20269:36;;20166:147;;;;:::o;43383:104::-;43439:13;43472:7;43465:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43383:104;:::o;62902:103::-;19316:4;62953:18;;19762:16;19773:4;19762:10;:16::i;:::-;62994:3:::1;62984:7;:13;;;;;;;;;;;;:::i;:::-;;62902:103:::0;;:::o;19271:49::-;19316:4;19271:49;;;:::o;65033:211::-;65166:8;8790:30;8811:8;8790:20;:30::i;:::-;65193:43:::1;65217:8;65227;65193:23;:43::i;:::-;65033:211:::0;;;:::o;63745:142::-;63832:7;19316:4;63804:18;;19762:16;19773:4;19762:10;:16::i;:::-;63858:21:::1;;;;;;;;;;;63851:28;;63745:142:::0;;:::o;64391:277::-;64558:4;8618:10;8610:18;;:4;:18;;;8606:83;;8645:32;8666:10;8645:20;:32::i;:::-;8606:83;64599:1:::1;64582:13;64592:2;64582:9;:13::i;:::-;:18;64574:27;;;::::0;::::1;;64612:48;64636:4;64642:2;64646:7;64655:4;64612:23;:48::i;:::-;64391:277:::0;;;;;:::o;65569:178::-;65669:13;65707:32;65714:7;65723:15;65707:6;:32::i;:::-;65700:39;;65569:178;;;:::o;22587:149::-;22671:18;22684:4;22671:12;:18::i;:::-;19762:16;19773:4;19762:10;:16::i;:::-;22702:26:::1;22714:4;22720:7;22702:11;:26::i;:::-;22587:149:::0;;;:::o;45196:164::-;45293:4;45317:18;:25;45336:5;45317:25;;;;;;;;;;;;;;;:35;45343:8;45317:35;;;;;;;;;;;;;;;;;;;;;;;;;45310:42;;45196:164;;;;:::o;19870:204::-;19955:4;19994:32;19979:47;;;:11;:47;;;;:87;;;;20030:36;20054:11;20030:23;:36::i;:::-;19979:87;19972:94;;19870:204;;;:::o;52702:135::-;52784:16;52792:7;52784;:16::i;:::-;52776:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52702:135;:::o;8848:419::-;9087:1;7369:42;9039:45;;;:49;9035:225;;;7369:42;9110;;;9161:4;9168:8;9110:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9105:144;;9224:8;9205:28;;;;;;;;;;;:::i;:::-;;;;;;;;9105:144;9035:225;8848:419;:::o;44244:417::-;44325:13;44341:23;44356:7;44341:14;:23::i;:::-;44325:39;;44389:5;44383:11;;:2;:11;;;44375:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;44483:5;44467:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;44492:37;44509:5;44516:12;:10;:12::i;:::-;44492:16;:37::i;:::-;44467:62;44445:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;44632:21;44641:2;44645:7;44632:8;:21::i;:::-;44314:347;44244:417;;:::o;45427:336::-;45622:41;45641:12;:10;:12::i;:::-;45655:7;45622:18;:41::i;:::-;45614:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;45727:28;45737:4;45743:2;45747:7;45727:9;:28::i;:::-;45427:336;;;:::o;58759:97::-;58817:6;58843:5;58836:12;;58759:97;:::o;20617:105::-;20684:30;20695:4;20701:12;:10;:12::i;:::-;20684:10;:30::i;:::-;20617:105;:::o;24888:238::-;24972:22;24980:4;24986:7;24972;:22::i;:::-;24967:152;;25043:4;25011:6;:12;25018:4;25011:12;;;;;;;;;;;:20;;:29;25032:7;25011:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;25094:12;:10;:12::i;:::-;25067:40;;25085:7;25067:40;;25079:4;25067:40;;;;;;;;;;24967:152;24888:238;;:::o;718:98::-;771:7;798:10;791:17;;718:98;:::o;25306:239::-;25390:22;25398:4;25404:7;25390;:22::i;:::-;25386:152;;;25461:5;25429:6;:12;25436:4;25429:12;;;;;;;;;;;:20;;:29;25450:7;25429:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;25513:12;:10;:12::i;:::-;25486:40;;25504:7;25486:40;;25498:4;25486:40;;;;;;;;;;25386:152;25306:239;;:::o;10211:723::-;10267:13;10497:1;10488:5;:10;10484:53;;10515:10;;;;;;;;;;;;;;;;;;;;;10484:53;10547:12;10562:5;10547:20;;10578:14;10603:78;10618:1;10610:4;:9;10603:78;;10636:8;;;;;:::i;:::-;;;;10667:2;10659:10;;;;;:::i;:::-;;;10603:78;;;10691:19;10723:6;10713:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10691:39;;10741:154;10757:1;10748:5;:10;10741:154;;10785:1;10775:11;;;;;:::i;:::-;;;10852:2;10844:5;:10;;;;:::i;:::-;10831:2;:24;;;;:::i;:::-;10818:39;;10801:6;10808;10801:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;10881:2;10872:11;;;;;:::i;:::-;;;10741:154;;;10919:6;10905:21;;;;;10211:723;;;;:::o;59127:332::-;59246:17;:15;:17::i;:::-;59230:33;;:12;:33;;;;59222:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;59349:1;59329:22;;:8;:22;;;59321:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59416:35;;;;;;;;59428:8;59416:35;;;;;;59438:12;59416:35;;;;;59394:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59127:332;;:::o;48820:110::-;48896:26;48906:2;48910:7;48896:26;;;;;;;;;;;;:9;:26::i;:::-;48820:110;;:::o;44970:155::-;45065:52;45084:12;:10;:12::i;:::-;45098:8;45108;45065:18;:52::i;:::-;44970:155;;:::o;46090:323::-;46264:41;46283:12;:10;:12::i;:::-;46297:7;46264:18;:41::i;:::-;46256:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;46367:38;46381:4;46387:2;46391:7;46400:4;46367:13;:38::i;:::-;46090:323;;;;:::o;61602:170::-;61704:4;61728:36;61752:11;61728:23;:36::i;:::-;61721:43;;61602:170;;;:::o;47920:127::-;47985:4;48037:1;48009:30;;:7;:16;48017:7;48009:16;;;;;;;;;;;;;;;;;;;;;:30;;;;48002:37;;47920:127;;;:::o;51981:174::-;52083:2;52056:15;:24;52072:7;52056:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52139:7;52135:2;52101:46;;52110:23;52125:7;52110:14;:23::i;:::-;52101:46;;;;;;;;;;;;51981:174;;:::o;48214:264::-;48307:4;48324:13;48340:23;48355:7;48340:14;:23::i;:::-;48324:39;;48393:5;48382:16;;:7;:16;;;:52;;;;48402:32;48419:5;48426:7;48402:16;:32::i;:::-;48382:52;:87;;;;48462:7;48438:31;;:20;48450:7;48438:11;:20::i;:::-;:31;;;48382:87;48374:96;;;48214:264;;;;:::o;51237:625::-;51396:4;51369:31;;:23;51384:7;51369:14;:23::i;:::-;:31;;;51361:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51475:1;51461:16;;:2;:16;;;51453:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;51531:39;51552:4;51558:2;51562:7;51531:20;:39::i;:::-;51635:29;51652:1;51656:7;51635:8;:29::i;:::-;51696:1;51677:9;:15;51687:4;51677:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;51725:1;51708:9;:13;51718:2;51708:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;51756:2;51737:7;:16;51745:7;51737:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;51795:7;51791:2;51776:27;;51785:4;51776:27;;;;;;;;;;;;51816:38;51836:4;51842:2;51846:7;51816:19;:38::i;:::-;51237:625;;;:::o;21012:505::-;21101:22;21109:4;21115:7;21101;:22::i;:::-;21096:414;;21289:41;21317:7;21289:41;;21327:2;21289:19;:41::i;:::-;21403:38;21431:4;21423:13;;21438:2;21403:19;:38::i;:::-;21194:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21140:358;;;;;;;;;;;:::i;:::-;;;;;;;;21096:414;21012:505;;:::o;49157:319::-;49286:18;49292:2;49296:7;49286:5;:18::i;:::-;49337:53;49368:1;49372:2;49376:7;49385:4;49337:22;:53::i;:::-;49315:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;49157:319;;;:::o;52298:315::-;52453:8;52444:17;;:5;:17;;;52436:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;52540:8;52502:18;:25;52521:5;52502:25;;;;;;;;;;;;;;;:35;52528:8;52502:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52586:8;52564:41;;52579:5;52564:41;;;52596:8;52564:41;;;;;;:::i;:::-;;;;;;;;52298:315;;;:::o;47294:313::-;47450:28;47460:4;47466:2;47470:7;47450:9;:28::i;:::-;47497:47;47520:4;47526:2;47530:7;47539:4;47497:22;:47::i;:::-;47489:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;47294:313;;;;:::o;42287:305::-;42389:4;42441:25;42426:40;;;:11;:40;;;;:105;;;;42498:33;42483:48;;;:11;:48;;;;42426:105;:158;;;;42548:36;42572:11;42548:23;:36::i;:::-;42426:158;42406:178;;42287:305;;;:::o;63895:245::-;64040:9;:15;64050:4;64040:15;;;;;;;;;;;;;;;;;;;;;;;;;64039:16;64031:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;64087;64114:4;64120:2;64124:7;64087:26;:45::i;:::-;63895:245;;;:::o;55337:125::-;;;;:::o;11512:451::-;11587:13;11613:19;11658:1;11649:6;11645:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;11635:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11613:47;;11671:15;:6;11678:1;11671:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;11697;:6;11704:1;11697:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;11728:9;11753:1;11744:6;11740:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;11728:26;;11723:135;11760:1;11756;:5;11723:135;;;11795:12;11816:3;11808:5;:11;11795:25;;;;;;;:::i;:::-;;;;;11783:6;11790:1;11783:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;11845:1;11835:11;;;;;11763:3;;;;:::i;:::-;;;11723:135;;;;11885:1;11876:5;:10;11868:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11948:6;11934:21;;;11512:451;;;;:::o;49812:439::-;49906:1;49892:16;;:2;:16;;;49884:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;49965:16;49973:7;49965;:16::i;:::-;49964:17;49956:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50027:45;50056:1;50060:2;50064:7;50027:20;:45::i;:::-;50102:1;50085:9;:13;50095:2;50085:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;50133:2;50114:7;:16;50122:7;50114:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;50178:7;50174:2;50153:33;;50170:1;50153:33;;;;;;;;;;;;50199:44;50227:1;50231:2;50235:7;50199:19;:44::i;:::-;49812:439;;:::o;53401:853::-;53555:4;53576:15;:2;:13;;;:15::i;:::-;53572:675;;;53628:2;53612:36;;;53649:12;:10;:12::i;:::-;53663:4;53669:7;53678:4;53612:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53608:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53870:1;53853:6;:13;:18;53849:328;;53896:60;;;;;;;;;;:::i;:::-;;;;;;;;53849:328;54127:6;54121:13;54112:6;54108:2;54104:15;54097:38;53608:584;53744:41;;;53734:51;;;:6;:51;;;;53727:58;;;;;53572:675;54231:4;54224:11;;53401:853;;;;;;;:::o;57765:215::-;57867:4;57906:26;57891:41;;;:11;:41;;;;:81;;;;57936:36;57960:11;57936:23;:36::i;:::-;57891:81;57884:88;;57765:215;;;:::o;54826:126::-;;;;:::o;26793:326::-;26853:4;27110:1;27088:7;:19;;;:23;27081:30;;26793:326;;;:::o;17123:157::-;17208:4;17247:25;17232:40;;;:11;:40;;;;17225:47;;17123:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:619::-;5015:6;5023;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:53;5404:7;5395:6;5384:9;5380:22;5359:53;:::i;:::-;5349:63;;5304:118;5461:2;5487:53;5532:7;5523:6;5512:9;5508:22;5487:53;:::i;:::-;5477:63;;5432:118;4938:619;;;;;:::o;5563:77::-;5600:7;5629:5;5618:16;;5563:77;;;:::o;5646:122::-;5719:24;5737:5;5719:24;:::i;:::-;5712:5;5709:35;5699:63;;5758:1;5755;5748:12;5699:63;5646:122;:::o;5774:139::-;5820:5;5858:6;5845:20;5836:29;;5874:33;5901:5;5874:33;:::i;:::-;5774:139;;;;:::o;5919:329::-;5978:6;6027:2;6015:9;6006:7;6002:23;5998:32;5995:119;;;6033:79;;:::i;:::-;5995:119;6153:1;6178:53;6223:7;6214:6;6203:9;6199:22;6178:53;:::i;:::-;6168:63;;6124:117;5919:329;;;;:::o;6254:118::-;6341:24;6359:5;6341:24;:::i;:::-;6336:3;6329:37;6254:118;;:::o;6378:222::-;6471:4;6509:2;6498:9;6494:18;6486:26;;6522:71;6590:1;6579:9;6575:17;6566:6;6522:71;:::i;:::-;6378:222;;;;:::o;6606:474::-;6674:6;6682;6731:2;6719:9;6710:7;6706:23;6702:32;6699:119;;;6737:79;;:::i;:::-;6699:119;6857:1;6882:53;6927:7;6918:6;6907:9;6903:22;6882:53;:::i;:::-;6872:63;;6828:117;6984:2;7010:53;7055:7;7046:6;7035:9;7031:22;7010:53;:::i;:::-;7000:63;;6955:118;6606:474;;;;;:::o;7086:118::-;7173:24;7191:5;7173:24;:::i;:::-;7168:3;7161:37;7086:118;;:::o;7210:332::-;7331:4;7369:2;7358:9;7354:18;7346:26;;7382:71;7450:1;7439:9;7435:17;7426:6;7382:71;:::i;:::-;7463:72;7531:2;7520:9;7516:18;7507:6;7463:72;:::i;:::-;7210:332;;;;;:::o;7548:474::-;7616:6;7624;7673:2;7661:9;7652:7;7648:23;7644:32;7641:119;;;7679:79;;:::i;:::-;7641:119;7799:1;7824:53;7869:7;7860:6;7849:9;7845:22;7824:53;:::i;:::-;7814:63;;7770:117;7926:2;7952:53;7997:7;7988:6;7977:9;7973:22;7952:53;:::i;:::-;7942:63;;7897:118;7548:474;;;;;:::o;8028:60::-;8056:3;8077:5;8070:12;;8028:60;;;:::o;8094:142::-;8144:9;8177:53;8195:34;8204:24;8222:5;8204:24;:::i;:::-;8195:34;:::i;:::-;8177:53;:::i;:::-;8164:66;;8094:142;;;:::o;8242:126::-;8292:9;8325:37;8356:5;8325:37;:::i;:::-;8312:50;;8242:126;;;:::o;8374:157::-;8455:9;8488:37;8519:5;8488:37;:::i;:::-;8475:50;;8374:157;;;:::o;8537:193::-;8655:68;8717:5;8655:68;:::i;:::-;8650:3;8643:81;8537:193;;:::o;8736:284::-;8860:4;8898:2;8887:9;8883:18;8875:26;;8911:102;9010:1;8999:9;8995:17;8986:6;8911:102;:::i;:::-;8736:284;;;;:::o;9026:89::-;9062:7;9102:6;9095:5;9091:18;9080:29;;9026:89;;;:::o;9121:120::-;9193:23;9210:5;9193:23;:::i;:::-;9186:5;9183:34;9173:62;;9231:1;9228;9221:12;9173:62;9121:120;:::o;9247:137::-;9292:5;9330:6;9317:20;9308:29;;9346:32;9372:5;9346:32;:::i;:::-;9247:137;;;;:::o;9390:472::-;9457:6;9465;9514:2;9502:9;9493:7;9489:23;9485:32;9482:119;;;9520:79;;:::i;:::-;9482:119;9640:1;9665:53;9710:7;9701:6;9690:9;9686:22;9665:53;:::i;:::-;9655:63;;9611:117;9767:2;9793:52;9837:7;9828:6;9817:9;9813:22;9793:52;:::i;:::-;9783:62;;9738:117;9390:472;;;;;:::o;9868:329::-;9927:6;9976:2;9964:9;9955:7;9951:23;9947:32;9944:119;;;9982:79;;:::i;:::-;9944:119;10102:1;10127:53;10172:7;10163:6;10152:9;10148:22;10127:53;:::i;:::-;10117:63;;10073:117;9868:329;;;;:::o;10203:222::-;10296:4;10334:2;10323:9;10319:18;10311:26;;10347:71;10415:1;10404:9;10400:17;10391:6;10347:71;:::i;:::-;10203:222;;;;:::o;10431:117::-;10540:1;10537;10530:12;10554:117;10663:1;10660;10653:12;10677:180;10725:77;10722:1;10715:88;10822:4;10819:1;10812:15;10846:4;10843:1;10836:15;10863:281;10946:27;10968:4;10946:27;:::i;:::-;10938:6;10934:40;11076:6;11064:10;11061:22;11040:18;11028:10;11025:34;11022:62;11019:88;;;11087:18;;:::i;:::-;11019:88;11127:10;11123:2;11116:22;10906:238;10863:281;;:::o;11150:129::-;11184:6;11211:20;;:::i;:::-;11201:30;;11240:33;11268:4;11260:6;11240:33;:::i;:::-;11150:129;;;:::o;11285:308::-;11347:4;11437:18;11429:6;11426:30;11423:56;;;11459:18;;:::i;:::-;11423:56;11497:29;11519:6;11497:29;:::i;:::-;11489:37;;11581:4;11575;11571:15;11563:23;;11285:308;;;:::o;11599:154::-;11683:6;11678:3;11673;11660:30;11745:1;11736:6;11731:3;11727:16;11720:27;11599:154;;;:::o;11759:412::-;11837:5;11862:66;11878:49;11920:6;11878:49;:::i;:::-;11862:66;:::i;:::-;11853:75;;11951:6;11944:5;11937:21;11989:4;11982:5;11978:16;12027:3;12018:6;12013:3;12009:16;12006:25;12003:112;;;12034:79;;:::i;:::-;12003:112;12124:41;12158:6;12153:3;12148;12124:41;:::i;:::-;11843:328;11759:412;;;;;:::o;12191:340::-;12247:5;12296:3;12289:4;12281:6;12277:17;12273:27;12263:122;;12304:79;;:::i;:::-;12263:122;12421:6;12408:20;12446:79;12521:3;12513:6;12506:4;12498:6;12494:17;12446:79;:::i;:::-;12437:88;;12253:278;12191:340;;;;:::o;12537:509::-;12606:6;12655:2;12643:9;12634:7;12630:23;12626:32;12623:119;;;12661:79;;:::i;:::-;12623:119;12809:1;12798:9;12794:17;12781:31;12839:18;12831:6;12828:30;12825:117;;;12861:79;;:::i;:::-;12825:117;12966:63;13021:7;13012:6;13001:9;12997:22;12966:63;:::i;:::-;12956:73;;12752:287;12537:509;;;;:::o;13052:116::-;13122:21;13137:5;13122:21;:::i;:::-;13115:5;13112:32;13102:60;;13158:1;13155;13148:12;13102:60;13052:116;:::o;13174:133::-;13217:5;13255:6;13242:20;13233:29;;13271:30;13295:5;13271:30;:::i;:::-;13174:133;;;;:::o;13313:468::-;13378:6;13386;13435:2;13423:9;13414:7;13410:23;13406:32;13403:119;;;13441:79;;:::i;:::-;13403:119;13561:1;13586:53;13631:7;13622:6;13611:9;13607:22;13586:53;:::i;:::-;13576:63;;13532:117;13688:2;13714:50;13756:7;13747:6;13736:9;13732:22;13714:50;:::i;:::-;13704:60;;13659:115;13313:468;;;;;:::o;13787:307::-;13848:4;13938:18;13930:6;13927:30;13924:56;;;13960:18;;:::i;:::-;13924:56;13998:29;14020:6;13998:29;:::i;:::-;13990:37;;14082:4;14076;14072:15;14064:23;;13787:307;;;:::o;14100:410::-;14177:5;14202:65;14218:48;14259:6;14218:48;:::i;:::-;14202:65;:::i;:::-;14193:74;;14290:6;14283:5;14276:21;14328:4;14321:5;14317:16;14366:3;14357:6;14352:3;14348:16;14345:25;14342:112;;;14373:79;;:::i;:::-;14342:112;14463:41;14497:6;14492:3;14487;14463:41;:::i;:::-;14183:327;14100:410;;;;;:::o;14529:338::-;14584:5;14633:3;14626:4;14618:6;14614:17;14610:27;14600:122;;14641:79;;:::i;:::-;14600:122;14758:6;14745:20;14783:78;14857:3;14849:6;14842:4;14834:6;14830:17;14783:78;:::i;:::-;14774:87;;14590:277;14529:338;;;;:::o;14873:943::-;14968:6;14976;14984;14992;15041:3;15029:9;15020:7;15016:23;15012:33;15009:120;;;15048:79;;:::i;:::-;15009:120;15168:1;15193:53;15238:7;15229:6;15218:9;15214:22;15193:53;:::i;:::-;15183:63;;15139:117;15295:2;15321:53;15366:7;15357:6;15346:9;15342:22;15321:53;:::i;:::-;15311:63;;15266:118;15423:2;15449:53;15494:7;15485:6;15474:9;15470:22;15449:53;:::i;:::-;15439:63;;15394:118;15579:2;15568:9;15564:18;15551:32;15610:18;15602:6;15599:30;15596:117;;;15632:79;;:::i;:::-;15596:117;15737:62;15791:7;15782:6;15771:9;15767:22;15737:62;:::i;:::-;15727:72;;15522:287;14873:943;;;;;;;:::o;15822:474::-;15890:6;15898;15947:2;15935:9;15926:7;15922:23;15918:32;15915:119;;;15953:79;;:::i;:::-;15915:119;16073:1;16098:53;16143:7;16134:6;16123:9;16119:22;16098:53;:::i;:::-;16088:63;;16044:117;16200:2;16226:53;16271:7;16262:6;16251:9;16247:22;16226:53;:::i;:::-;16216:63;;16171:118;15822:474;;;;;:::o;16302:180::-;16350:77;16347:1;16340:88;16447:4;16444:1;16437:15;16471:4;16468:1;16461:15;16488:320;16532:6;16569:1;16563:4;16559:12;16549:22;;16616:1;16610:4;16606:12;16637:18;16627:81;;16693:4;16685:6;16681:17;16671:27;;16627:81;16755:2;16747:6;16744:14;16724:18;16721:38;16718:84;;16774:18;;:::i;:::-;16718:84;16539:269;16488:320;;;:::o;16814:180::-;16862:77;16859:1;16852:88;16959:4;16956:1;16949:15;16983:4;16980:1;16973:15;17000:348;17040:7;17063:20;17081:1;17063:20;:::i;:::-;17058:25;;17097:20;17115:1;17097:20;:::i;:::-;17092:25;;17285:1;17217:66;17213:74;17210:1;17207:81;17202:1;17195:9;17188:17;17184:105;17181:131;;;17292:18;;:::i;:::-;17181:131;17340:1;17337;17333:9;17322:20;;17000:348;;;;:::o;17354:180::-;17402:77;17399:1;17392:88;17499:4;17496:1;17489:15;17523:4;17520:1;17513:15;17540:185;17580:1;17597:20;17615:1;17597:20;:::i;:::-;17592:25;;17631:20;17649:1;17631:20;:::i;:::-;17626:25;;17670:1;17660:35;;17675:18;;:::i;:::-;17660:35;17717:1;17714;17710:9;17705:14;;17540:185;;;;:::o;17731:234::-;17871:34;17867:1;17859:6;17855:14;17848:58;17940:17;17935:2;17927:6;17923:15;17916:42;17731:234;:::o;17971:366::-;18113:3;18134:67;18198:2;18193:3;18134:67;:::i;:::-;18127:74;;18210:93;18299:3;18210:93;:::i;:::-;18328:2;18323:3;18319:12;18312:19;;17971:366;;;:::o;18343:419::-;18509:4;18547:2;18536:9;18532:18;18524:26;;18596:9;18590:4;18586:20;18582:1;18571:9;18567:17;18560:47;18624:131;18750:4;18624:131;:::i;:::-;18616:139;;18343:419;;;:::o;18768:174::-;18908:26;18904:1;18896:6;18892:14;18885:50;18768:174;:::o;18948:366::-;19090:3;19111:67;19175:2;19170:3;19111:67;:::i;:::-;19104:74;;19187:93;19276:3;19187:93;:::i;:::-;19305:2;19300:3;19296:12;19289:19;;18948:366;;;:::o;19320:419::-;19486:4;19524:2;19513:9;19509:18;19501:26;;19573:9;19567:4;19563:20;19559:1;19548:9;19544:17;19537:47;19601:131;19727:4;19601:131;:::i;:::-;19593:139;;19320:419;;;:::o;19745:176::-;19777:1;19794:20;19812:1;19794:20;:::i;:::-;19789:25;;19828:20;19846:1;19828:20;:::i;:::-;19823:25;;19867:1;19857:35;;19872:18;;:::i;:::-;19857:35;19913:1;19910;19906:9;19901:14;;19745:176;;;;:::o;19927:148::-;20029:11;20066:3;20051:18;;19927:148;;;;:::o;20081:141::-;20130:4;20153:3;20145:11;;20176:3;20173:1;20166:14;20210:4;20207:1;20197:18;20189:26;;20081:141;;;:::o;20252:845::-;20355:3;20392:5;20386:12;20421:36;20447:9;20421:36;:::i;:::-;20473:89;20555:6;20550:3;20473:89;:::i;:::-;20466:96;;20593:1;20582:9;20578:17;20609:1;20604:137;;;;20755:1;20750:341;;;;20571:520;;20604:137;20688:4;20684:9;20673;20669:25;20664:3;20657:38;20724:6;20719:3;20715:16;20708:23;;20604:137;;20750:341;20817:38;20849:5;20817:38;:::i;:::-;20877:1;20891:154;20905:6;20902:1;20899:13;20891:154;;;20979:7;20973:14;20969:1;20964:3;20960:11;20953:35;21029:1;21020:7;21016:15;21005:26;;20927:4;20924:1;20920:12;20915:17;;20891:154;;;21074:6;21069:3;21065:16;21058:23;;20757:334;;20571:520;;20359:738;;20252:845;;;;:::o;21103:156::-;21243:8;21239:1;21231:6;21227:14;21220:32;21103:156;:::o;21265:400::-;21425:3;21446:84;21528:1;21523:3;21446:84;:::i;:::-;21439:91;;21539:93;21628:3;21539:93;:::i;:::-;21657:1;21652:3;21648:11;21641:18;;21265:400;;;:::o;21671:535::-;21901:3;21923:92;22011:3;22002:6;21923:92;:::i;:::-;21916:99;;22032:148;22176:3;22032:148;:::i;:::-;22025:155;;22197:3;22190:10;;21671:535;;;;:::o;22212:377::-;22318:3;22346:39;22379:5;22346:39;:::i;:::-;22401:89;22483:6;22478:3;22401:89;:::i;:::-;22394:96;;22499:52;22544:6;22539:3;22532:4;22525:5;22521:16;22499:52;:::i;:::-;22576:6;22571:3;22567:16;22560:23;;22322:267;22212:377;;;;:::o;22595:156::-;22735:8;22731:1;22723:6;22719:14;22712:32;22595:156;:::o;22757:400::-;22917:3;22938:84;23020:1;23015:3;22938:84;:::i;:::-;22931:91;;23031:93;23120:3;23031:93;:::i;:::-;23149:1;23144:3;23140:11;23133:18;;22757:400;;;:::o;23163:695::-;23441:3;23463:92;23551:3;23542:6;23463:92;:::i;:::-;23456:99;;23572:95;23663:3;23654:6;23572:95;:::i;:::-;23565:102;;23684:148;23828:3;23684:148;:::i;:::-;23677:155;;23849:3;23842:10;;23163:695;;;;;:::o;23864:156::-;24004:8;24000:1;23992:6;23988:14;23981:32;23864:156;:::o;24026:400::-;24186:3;24207:84;24289:1;24284:3;24207:84;:::i;:::-;24200:91;;24300:93;24389:3;24300:93;:::i;:::-;24418:1;24413:3;24409:11;24402:18;;24026:400;;;:::o;24432:695::-;24710:3;24732:92;24820:3;24811:6;24732:92;:::i;:::-;24725:99;;24841:95;24932:3;24923:6;24841:95;:::i;:::-;24834:102;;24953:148;25097:3;24953:148;:::i;:::-;24946:155;;25118:3;25111:10;;24432:695;;;;;:::o;25133:156::-;25273:8;25269:1;25261:6;25257:14;25250:32;25133:156;:::o;25295:400::-;25455:3;25476:84;25558:1;25553:3;25476:84;:::i;:::-;25469:91;;25569:93;25658:3;25569:93;:::i;:::-;25687:1;25682:3;25678:11;25671:18;;25295:400;;;:::o;25701:695::-;25979:3;26001:92;26089:3;26080:6;26001:92;:::i;:::-;25994:99;;26110:95;26201:3;26192:6;26110:95;:::i;:::-;26103:102;;26222:148;26366:3;26222:148;:::i;:::-;26215:155;;26387:3;26380:10;;25701:695;;;;;:::o;26402:165::-;26542:17;26538:1;26530:6;26526:14;26519:41;26402:165;:::o;26573:366::-;26715:3;26736:67;26800:2;26795:3;26736:67;:::i;:::-;26729:74;;26812:93;26901:3;26812:93;:::i;:::-;26930:2;26925:3;26921:12;26914:19;;26573:366;;;:::o;26945:419::-;27111:4;27149:2;27138:9;27134:18;27126:26;;27198:9;27192:4;27188:20;27184:1;27173:9;27169:17;27162:47;27226:131;27352:4;27226:131;:::i;:::-;27218:139;;26945:419;;;:::o;27370:228::-;27510:34;27506:1;27498:6;27494:14;27487:58;27579:11;27574:2;27566:6;27562:15;27555:36;27370:228;:::o;27604:366::-;27746:3;27767:67;27831:2;27826:3;27767:67;:::i;:::-;27760:74;;27843:93;27932:3;27843:93;:::i;:::-;27961:2;27956:3;27952:12;27945:19;;27604:366;;;:::o;27976:419::-;28142:4;28180:2;28169:9;28165:18;28157:26;;28229:9;28223:4;28219:20;28215:1;28204:9;28200:17;28193:47;28257:131;28383:4;28257:131;:::i;:::-;28249:139;;27976:419;;;:::o;28401:143::-;28458:5;28489:6;28483:13;28474:22;;28505:33;28532:5;28505:33;:::i;:::-;28401:143;;;;:::o;28550:351::-;28620:6;28669:2;28657:9;28648:7;28644:23;28640:32;28637:119;;;28675:79;;:::i;:::-;28637:119;28795:1;28820:64;28876:7;28867:6;28856:9;28852:22;28820:64;:::i;:::-;28810:74;;28766:128;28550:351;;;;:::o;28907:171::-;28945:3;28968:23;28985:5;28968:23;:::i;:::-;28959:32;;29013:6;29006:5;29003:17;29000:43;;29023:18;;:::i;:::-;29000:43;29070:1;29063:5;29059:13;29052:20;;28907:171;;;:::o;29084:233::-;29123:3;29146:24;29164:5;29146:24;:::i;:::-;29137:33;;29192:66;29185:5;29182:77;29179:103;;29262:18;;:::i;:::-;29179:103;29309:1;29302:5;29298:13;29291:20;;29084:233;;;:::o;29323:332::-;29444:4;29482:2;29471:9;29467:18;29459:26;;29495:71;29563:1;29552:9;29548:17;29539:6;29495:71;:::i;:::-;29576:72;29644:2;29633:9;29629:18;29620:6;29576:72;:::i;:::-;29323:332;;;;;:::o;29661:137::-;29715:5;29746:6;29740:13;29731:22;;29762:30;29786:5;29762:30;:::i;:::-;29661:137;;;;:::o;29804:345::-;29871:6;29920:2;29908:9;29899:7;29895:23;29891:32;29888:119;;;29926:79;;:::i;:::-;29888:119;30046:1;30071:61;30124:7;30115:6;30104:9;30100:22;30071:61;:::i;:::-;30061:71;;30017:125;29804:345;;;;:::o;30155:220::-;30295:34;30291:1;30283:6;30279:14;30272:58;30364:3;30359:2;30351:6;30347:15;30340:28;30155:220;:::o;30381:366::-;30523:3;30544:67;30608:2;30603:3;30544:67;:::i;:::-;30537:74;;30620:93;30709:3;30620:93;:::i;:::-;30738:2;30733:3;30729:12;30722:19;;30381:366;;;:::o;30753:419::-;30919:4;30957:2;30946:9;30942:18;30934:26;;31006:9;31000:4;30996:20;30992:1;30981:9;30977:17;30970:47;31034:131;31160:4;31034:131;:::i;:::-;31026:139;;30753:419;;;:::o;31178:249::-;31318:34;31314:1;31306:6;31302:14;31295:58;31387:32;31382:2;31374:6;31370:15;31363:57;31178:249;:::o;31433:366::-;31575:3;31596:67;31660:2;31655:3;31596:67;:::i;:::-;31589:74;;31672:93;31761:3;31672:93;:::i;:::-;31790:2;31785:3;31781:12;31774:19;;31433:366;;;:::o;31805:419::-;31971:4;32009:2;31998:9;31994:18;31986:26;;32058:9;32052:4;32048:20;32044:1;32033:9;32029:17;32022:47;32086:131;32212:4;32086:131;:::i;:::-;32078:139;;31805:419;;;:::o;32230:233::-;32370:34;32366:1;32358:6;32354:14;32347:58;32439:16;32434:2;32426:6;32422:15;32415:41;32230:233;:::o;32469:366::-;32611:3;32632:67;32696:2;32691:3;32632:67;:::i;:::-;32625:74;;32708:93;32797:3;32708:93;:::i;:::-;32826:2;32821:3;32817:12;32810:19;;32469:366;;;:::o;32841:419::-;33007:4;33045:2;33034:9;33030:18;33022:26;;33094:9;33088:4;33084:20;33080:1;33069:9;33065:17;33058:47;33122:131;33248:4;33122:131;:::i;:::-;33114:139;;32841:419;;;:::o;33266:191::-;33306:4;33326:20;33344:1;33326:20;:::i;:::-;33321:25;;33360:20;33378:1;33360:20;:::i;:::-;33355:25;;33399:1;33396;33393:8;33390:34;;;33404:18;;:::i;:::-;33390:34;33449:1;33446;33442:9;33434:17;;33266:191;;;;:::o;33463:305::-;33503:3;33522:20;33540:1;33522:20;:::i;:::-;33517:25;;33556:20;33574:1;33556:20;:::i;:::-;33551:25;;33710:1;33642:66;33638:74;33635:1;33632:81;33629:107;;;33716:18;;:::i;:::-;33629:107;33760:1;33757;33753:9;33746:16;;33463:305;;;;:::o;33774:180::-;33822:77;33819:1;33812:88;33919:4;33916:1;33909:15;33943:4;33940:1;33933:15;33960:229;34100:34;34096:1;34088:6;34084:14;34077:58;34169:12;34164:2;34156:6;34152:15;34145:37;33960:229;:::o;34195:366::-;34337:3;34358:67;34422:2;34417:3;34358:67;:::i;:::-;34351:74;;34434:93;34523:3;34434:93;:::i;:::-;34552:2;34547:3;34543:12;34536:19;;34195:366;;;:::o;34567:419::-;34733:4;34771:2;34760:9;34756:18;34748:26;;34820:9;34814:4;34810:20;34806:1;34795:9;34791:17;34784:47;34848:131;34974:4;34848:131;:::i;:::-;34840:139;;34567:419;;;:::o;34992:175::-;35132:27;35128:1;35120:6;35116:14;35109:51;34992:175;:::o;35173:366::-;35315:3;35336:67;35400:2;35395:3;35336:67;:::i;:::-;35329:74;;35412:93;35501:3;35412:93;:::i;:::-;35530:2;35525:3;35521:12;35514:19;;35173:366;;;:::o;35545:419::-;35711:4;35749:2;35738:9;35734:18;35726:26;;35798:9;35792:4;35788:20;35784:1;35773:9;35769:17;35762:47;35826:131;35952:4;35826:131;:::i;:::-;35818:139;;35545:419;;;:::o;35970:224::-;36110:34;36106:1;36098:6;36094:14;36087:58;36179:7;36174:2;36166:6;36162:15;36155:32;35970:224;:::o;36200:366::-;36342:3;36363:67;36427:2;36422:3;36363:67;:::i;:::-;36356:74;;36439:93;36528:3;36439:93;:::i;:::-;36557:2;36552:3;36548:12;36541:19;;36200:366;;;:::o;36572:419::-;36738:4;36776:2;36765:9;36761:18;36753:26;;36825:9;36819:4;36815:20;36811:1;36800:9;36796:17;36789:47;36853:131;36979:4;36853:131;:::i;:::-;36845:139;;36572:419;;;:::o;36997:223::-;37137:34;37133:1;37125:6;37121:14;37114:58;37206:6;37201:2;37193:6;37189:15;37182:31;36997:223;:::o;37226:366::-;37368:3;37389:67;37453:2;37448:3;37389:67;:::i;:::-;37382:74;;37465:93;37554:3;37465:93;:::i;:::-;37583:2;37578:3;37574:12;37567:19;;37226:366;;;:::o;37598:419::-;37764:4;37802:2;37791:9;37787:18;37779:26;;37851:9;37845:4;37841:20;37837:1;37826:9;37822:17;37815:47;37879:131;38005:4;37879:131;:::i;:::-;37871:139;;37598:419;;;:::o;38023:173::-;38163:25;38159:1;38151:6;38147:14;38140:49;38023:173;:::o;38202:402::-;38362:3;38383:85;38465:2;38460:3;38383:85;:::i;:::-;38376:92;;38477:93;38566:3;38477:93;:::i;:::-;38595:2;38590:3;38586:12;38579:19;;38202:402;;;:::o;38610:167::-;38750:19;38746:1;38738:6;38734:14;38727:43;38610:167;:::o;38783:402::-;38943:3;38964:85;39046:2;39041:3;38964:85;:::i;:::-;38957:92;;39058:93;39147:3;39058:93;:::i;:::-;39176:2;39171:3;39167:12;39160:19;;38783:402;;;:::o;39191:967::-;39573:3;39595:148;39739:3;39595:148;:::i;:::-;39588:155;;39760:95;39851:3;39842:6;39760:95;:::i;:::-;39753:102;;39872:148;40016:3;39872:148;:::i;:::-;39865:155;;40037:95;40128:3;40119:6;40037:95;:::i;:::-;40030:102;;40149:3;40142:10;;39191:967;;;;;:::o;40164:237::-;40304:34;40300:1;40292:6;40288:14;40281:58;40373:20;40368:2;40360:6;40356:15;40349:45;40164:237;:::o;40407:366::-;40549:3;40570:67;40634:2;40629:3;40570:67;:::i;:::-;40563:74;;40646:93;40735:3;40646:93;:::i;:::-;40764:2;40759:3;40755:12;40748:19;;40407:366;;;:::o;40779:419::-;40945:4;40983:2;40972:9;40968:18;40960:26;;41032:9;41026:4;41022:20;41018:1;41007:9;41003:17;40996:47;41060:131;41186:4;41060:131;:::i;:::-;41052:139;;40779:419;;;:::o;41204:175::-;41344:27;41340:1;41332:6;41328:14;41321:51;41204:175;:::o;41385:366::-;41527:3;41548:67;41612:2;41607:3;41548:67;:::i;:::-;41541:74;;41624:93;41713:3;41624:93;:::i;:::-;41742:2;41737:3;41733:12;41726:19;;41385:366;;;:::o;41757:419::-;41923:4;41961:2;41950:9;41946:18;41938:26;;42010:9;42004:4;42000:20;41996:1;41985:9;41981:17;41974:47;42038:131;42164:4;42038:131;:::i;:::-;42030:139;;41757:419;;;:::o;42182:166::-;42322:18;42318:1;42310:6;42306:14;42299:42;42182:166;:::o;42354:366::-;42496:3;42517:67;42581:2;42576:3;42517:67;:::i;:::-;42510:74;;42593:93;42682:3;42593:93;:::i;:::-;42711:2;42706:3;42702:12;42695:19;;42354:366;;;:::o;42726:419::-;42892:4;42930:2;42919:9;42915:18;42907:26;;42979:9;42973:4;42969:20;42965:1;42954:9;42950:17;42943:47;43007:131;43133:4;43007:131;:::i;:::-;42999:139;;42726:419;;;:::o;43151:171::-;43190:3;43213:24;43231:5;43213:24;:::i;:::-;43204:33;;43259:4;43252:5;43249:15;43246:41;;43267:18;;:::i;:::-;43246:41;43314:1;43307:5;43303:13;43296:20;;43151:171;;;:::o;43328:182::-;43468:34;43464:1;43456:6;43452:14;43445:58;43328:182;:::o;43516:366::-;43658:3;43679:67;43743:2;43738:3;43679:67;:::i;:::-;43672:74;;43755:93;43844:3;43755:93;:::i;:::-;43873:2;43868:3;43864:12;43857:19;;43516:366;;;:::o;43888:419::-;44054:4;44092:2;44081:9;44077:18;44069:26;;44141:9;44135:4;44131:20;44127:1;44116:9;44112:17;44105:47;44169:131;44295:4;44169:131;:::i;:::-;44161:139;;43888:419;;;:::o;44313:182::-;44453:34;44449:1;44441:6;44437:14;44430:58;44313:182;:::o;44501:366::-;44643:3;44664:67;44728:2;44723:3;44664:67;:::i;:::-;44657:74;;44740:93;44829:3;44740:93;:::i;:::-;44858:2;44853:3;44849:12;44842:19;;44501:366;;;:::o;44873:419::-;45039:4;45077:2;45066:9;45062:18;45054:26;;45126:9;45120:4;45116:20;45112:1;45101:9;45097:17;45090:47;45154:131;45280:4;45154:131;:::i;:::-;45146:139;;44873:419;;;:::o;45298:178::-;45438:30;45434:1;45426:6;45422:14;45415:54;45298:178;:::o;45482:366::-;45624:3;45645:67;45709:2;45704:3;45645:67;:::i;:::-;45638:74;;45721:93;45810:3;45721:93;:::i;:::-;45839:2;45834:3;45830:12;45823:19;;45482:366;;;:::o;45854:419::-;46020:4;46058:2;46047:9;46043:18;46035:26;;46107:9;46101:4;46097:20;46093:1;46082:9;46078:17;46071:47;46135:131;46261:4;46135:131;:::i;:::-;46127:139;;45854:419;;;:::o;46279:98::-;46330:6;46364:5;46358:12;46348:22;;46279:98;;;:::o;46383:168::-;46466:11;46500:6;46495:3;46488:19;46540:4;46535:3;46531:14;46516:29;;46383:168;;;;:::o;46557:360::-;46643:3;46671:38;46703:5;46671:38;:::i;:::-;46725:70;46788:6;46783:3;46725:70;:::i;:::-;46718:77;;46804:52;46849:6;46844:3;46837:4;46830:5;46826:16;46804:52;:::i;:::-;46881:29;46903:6;46881:29;:::i;:::-;46876:3;46872:39;46865:46;;46647:270;46557:360;;;;:::o;46923:640::-;47118:4;47156:3;47145:9;47141:19;47133:27;;47170:71;47238:1;47227:9;47223:17;47214:6;47170:71;:::i;:::-;47251:72;47319:2;47308:9;47304:18;47295:6;47251:72;:::i;:::-;47333;47401:2;47390:9;47386:18;47377:6;47333:72;:::i;:::-;47452:9;47446:4;47442:20;47437:2;47426:9;47422:18;47415:48;47480:76;47551:4;47542:6;47480:76;:::i;:::-;47472:84;;46923:640;;;;;;;:::o;47569:141::-;47625:5;47656:6;47650:13;47641:22;;47672:32;47698:5;47672:32;:::i;:::-;47569:141;;;;:::o;47716:349::-;47785:6;47834:2;47822:9;47813:7;47809:23;47805:32;47802:119;;;47840:79;;:::i;:::-;47802:119;47960:1;47985:63;48040:7;48031:6;48020:9;48016:22;47985:63;:::i;:::-;47975:73;;47931:127;47716:349;;;;:::o

Swarm Source

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