BNB Price: $622.92 (+2.74%)
 

Overview

Max Total Supply

14,973,811,147.733893COFFY (CSupply: 14,973,761,147.733893)

Holders

1,817 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
OKX 35
Balance
50,000,000 COFFY

Value
$0.00
0x3b5a23f6207d87b423c6789d2625ea620423b32d
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Coffy Coin merges blockchain with the coffee industry, offering a Drink-to-Earn and Play-to-Earn ecosystem supported by DAO governance. Users earn tokens by playing games and social engagement in a secure, community-driven platform.


Update? Click here to update the token ICO / general information

Contract Source Code Verified (Exact Match)

Contract Name:
CoffyCoin

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
/**
 *Submitted for verification at BscScan.com on 2025-03-03
*/

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;


/**
 * @dev Interface for the optional metadata functions from the ERC-20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File: @openzeppelin/contracts/interfaces/draft-IERC6093.sol


// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}

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


// OpenZeppelin Contracts (last updated v5.2.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;





/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

    mapping(address account => mapping(address spender => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     *
     * ```solidity
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance < type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}

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


// OpenZeppelin Contracts (last updated v5.1.0) (access/IAccessControl.sol)

pragma solidity ^0.8.20;

/**
 * @dev External interface of AccessControl declared to support ERC-165 detection.
 */
interface IAccessControl {
    /**
     * @dev The `account` is missing a role.
     */
    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);

    /**
     * @dev The caller of a function is not the expected one.
     *
     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
     */
    error AccessControlBadConfirmation();

    /**
     * @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.
     */
    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. This account bears the admin role (for the granted role).
     * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.
     */
    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 `callerConfirmation`.
     */
    function renounceRole(bytes32 role, address callerConfirmation) external;
}

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


// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[ERC].
 *
 * 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[ERC section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

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


// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)

pragma solidity ^0.8.20;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC-165 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);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)

pragma solidity ^0.8.20;




/**
 * @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:
 *
 * ```solidity
 * 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}:
 *
 * ```solidity
 * 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. We recommend using {AccessControlDefaultAdminRules}
 * to enforce additional security measures for this role.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address account => bool) hasRole;
        bytes32 adminRole;
    }

    mapping(bytes32 role => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with an {AccessControlUnauthorizedAccount} error including the required role.
     */
    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 returns (bool) {
        return _roles[role].hasRole[account];
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
     * is missing `role`.
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert AccessControlUnauthorizedAccount(account, role);
        }
    }

    /**
     * @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 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 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 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 `callerConfirmation`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address callerConfirmation) public virtual {
        if (callerConfirmation != _msgSender()) {
            revert AccessControlBadConfirmation();
        }

        _revokeRole(role, callerConfirmation);
    }

    /**
     * @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 Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
        if (!hasRole(role, account)) {
            _roles[role].hasRole[account] = true;
            emit RoleGranted(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
        if (hasRole(role, account)) {
            _roles[role].hasRole[account] = false;
            emit RoleRevoked(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: coffycoingame.sol


pragma solidity ^0.8.20;





// CoffyCoin: A game token with character purchases, daily rewards, staking, and inflation
contract CoffyCoin is ERC20, AccessControl, ReentrancyGuard, Pausable {
    // Core constants for token economics
    uint256 public constant TREASURY_AMOUNT = 7_500_000_000 * 10**18;
    uint256 public constant LIQUIDITY_AMOUNT = 3_000_000_000 * 10**18;
    uint256 public constant MARKETING_AMOUNT = 2_250_000_000 * 10**18;
    uint256 public constant TEAM_AMOUNT = 2_250_000_000 * 10**18;
    uint256 public constant MIN_TREASURY_RESERVE = 1_000_000 * 10**18;
    
    // Daily reward limit
    uint256 public constant MAX_DAILY_REWARD = 10_000 * 10**18;
    uint256 public constant BLOCKS_PER_DAY = 28800;
    
    // Staking settings
    uint256 public constant ANNUAL_STAKING_RATE = 700; // 7% annual reward
    uint256 public constant ANNUAL_INFLATION_RATE = 500; // 5% annual inflation (triggered twice a year, 2.5% each)
    uint256 public constant SECONDS_IN_YEAR = 31536000;
    uint256 public constant MINIMUM_STAKE_TIME = 1 days; // Minimum 24 hours for staking
    uint256 public lastInflationTime;
    uint256 public totalStaked;
    
    // State variables
    address public immutable treasury;
    
    // Fixed character prices
    uint256 public constant LATTE_WARRIOR_PRICE = 20_000 * 10**18;
    uint256 public constant ESPRESSO_MAGE_PRICE = 40_000 * 10**18;
    uint256 public constant ROGUE_PRICE = 70_000 * 10**18;
    uint256 public constant PALADIN_PRICE = 100_000 * 10**18;
    uint256 public constant LEGENDARY_DRAGON_PRICE = 400_000 * 10**18;
    
    // Character system
    mapping(uint256 => Character) public characters;
    mapping(address => bool) public hasBoughtLegendaryDragon;
    
    // Daily rewards tracking (optimized)
    mapping(address => RewardClaim) public dailyClaims;
    
    // Staking system (optimized)
    mapping(address => Stake) public stakes;
    
    // DAO Governance
    struct Proposal {
        uint32 id;
        string description;
        uint32 voteCount;
        bool executed;
        mapping(address => bool) hasVoted;
    }
    
    mapping(uint32 => Proposal) public proposals;
    uint32 public proposalCount;
    
    // Structs
    struct Character {
        string name;
        uint256 price;
    }
    
    struct RewardClaim {
        uint48 lastClaimTime;
        uint208 claimedToday;
    }
    
    struct Stake {
        uint208 amount;
        uint48 startTime;
        uint48 lastRewardClaim;
    }
    
    // Events
    event CharacterBought(address indexed buyer, uint256 characterId, uint256 price);
    event GameRewardsClaimed(address indexed user, uint256 amount);
    event Staked(address indexed user, uint256 amount);
    event Unstaked(address indexed user, uint256 amount);
    event StakingRewardClaimed(address indexed user, uint256 amount);
    event InflationMinted(uint256 amount, uint256 timestamp);
    event ProposalCreated(uint32 indexed proposalId, string description, address creator);
    event VoteCast(uint32 indexed proposalId, address voter);
    event TokensBurned(address burner, uint256 amount);
    
    // Errors
    error InvalidAddress();
    error InsufficientBalance();
    error DailyRewardLimitExceeded();
    error CharacterNotFound();
    error NotDAOMember();
    error ZeroAmount();
    error NothingStaked();
    error StakingPeriodNotMet();
    error ProposalNotFound();
    error AlreadyVoted();
    error NotInflationTime();
    
    // Modifier for DAO members
    modifier onlyDAOMember() {
        if (!hasBoughtLegendaryDragon[msg.sender]) revert NotDAOMember();
        _;
    }
    
    constructor(
        address _treasury,
        address _liquidityPool,
        address _marketing,
        address _team
    ) ERC20("Coffy Coin", "COFFY") {
        if (_treasury == address(0) || _liquidityPool == address(0) || 
            _marketing == address(0) || _team == address(0))
            revert InvalidAddress();
            
        treasury = _treasury;
        
        _mint(_treasury, TREASURY_AMOUNT);
        _mint(_liquidityPool, LIQUIDITY_AMOUNT);
        _mint(_marketing, MARKETING_AMOUNT);
        _mint(_team, TEAM_AMOUNT);
        
        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        
        // Initialize characters with coffee-themed fantasy names
        characters[1] = Character("Mocha Knight", LATTE_WARRIOR_PRICE);
        characters[2] = Character("Arabica Archmage", ESPRESSO_MAGE_PRICE);
        characters[3] = Character("Robusta Shadowblade", ROGUE_PRICE);
        characters[4] = Character("Cappuccino Templar", PALADIN_PRICE);
        characters[5] = Character("Espresso Dragonlord", LEGENDARY_DRAGON_PRICE);
        
        // Set inflation start time
        lastInflationTime = block.timestamp;
    }
    
    // Admin function to manually burn tokens
    function adminBurn(address from, uint256 amount) external onlyRole(DEFAULT_ADMIN_ROLE) {
        if (from == address(0)) revert InvalidAddress();
        if (amount == 0) revert ZeroAmount();
        if (balanceOf(from) < amount) revert InsufficientBalance();
        
        _burn(from, amount);
        emit TokensBurned(from, amount);
    }
    
    // Pause/unpause contract functions
    function pause() external onlyRole(DEFAULT_ADMIN_ROLE) {
        _pause();
    }
    
    function unpause() external onlyRole(DEFAULT_ADMIN_ROLE) {
        _unpause();
    }
    
    // Game rewards function with daily limit
    function claimGameRewards(uint256 amount) external nonReentrant whenNotPaused {
        if (amount == 0) revert ZeroAmount();
        if (balanceOf(treasury) < amount + MIN_TREASURY_RESERVE) revert InsufficientBalance();
        
        RewardClaim storage claim = dailyClaims[msg.sender];
        uint256 currentDay = block.number / BLOCKS_PER_DAY;
        
        if (uint256(claim.lastClaimTime) / BLOCKS_PER_DAY < currentDay) {
            claim.claimedToday = 0;
        }
        
        if (uint256(claim.claimedToday) + amount > MAX_DAILY_REWARD) {
            revert DailyRewardLimitExceeded();
        }
        
        claim.claimedToday = uint208(uint256(claim.claimedToday) + amount);
        claim.lastClaimTime = uint48(block.number);
        
        _transfer(treasury, msg.sender, amount);
        emit GameRewardsClaimed(msg.sender, amount);
    }
    
    // Character buying function - sends COFFY to treasury
    function buyCharacter(uint256 characterId) external nonReentrant whenNotPaused {
        if (characterId < 1 || characterId > 5) revert CharacterNotFound();
        
        uint256 price = characters[characterId].price;
        
        if (balanceOf(msg.sender) < price) revert InsufficientBalance();
        
        _transfer(msg.sender, treasury, price);
        
        if (characterId == 5) {
            hasBoughtLegendaryDragon[msg.sender] = true;
        }
        
        emit CharacterBought(msg.sender, characterId, price);
    }
    
    // DAO Governance functions
    function createProposal(string memory description) external onlyDAOMember {
        proposalCount++;
        Proposal storage newProposal = proposals[proposalCount];
        newProposal.id = proposalCount;
        newProposal.description = description;
        newProposal.voteCount = 0;
        newProposal.executed = false;
        
        emit ProposalCreated(proposalCount, description, msg.sender);
    }
    
    function vote(uint32 proposalId) external onlyDAOMember {
        if (proposalId == 0 || proposalId > proposalCount) revert ProposalNotFound();
        
        Proposal storage proposal = proposals[proposalId];
        if (proposal.hasVoted[msg.sender]) revert AlreadyVoted();
        
        proposal.hasVoted[msg.sender] = true;
        proposal.voteCount++;
        
        emit VoteCast(proposalId, msg.sender);
    }
    
    // Staking functions
    function stake(uint256 amount) external nonReentrant whenNotPaused {
        if (amount == 0) revert ZeroAmount();
        if (balanceOf(msg.sender) < amount) revert InsufficientBalance();
        
        _transfer(msg.sender, address(this), amount);
        
        Stake storage userStake = stakes[msg.sender];
        
        if (userStake.amount == 0) {
            userStake.startTime = uint48(block.timestamp);
            userStake.lastRewardClaim = uint48(block.timestamp);
        } else {
            uint256 pendingReward = calculatePendingReward(msg.sender);
            if (pendingReward > 0) {
                _mint(msg.sender, pendingReward);
            }
            userStake.lastRewardClaim = uint48(block.timestamp);
        }
        
        userStake.amount = uint208(uint256(userStake.amount) + amount);
        totalStaked += amount;
        
        emit Staked(msg.sender, amount);
    }
    
    function unstake(uint256 amount) external nonReentrant whenNotPaused {
        Stake storage userStake = stakes[msg.sender];
        
        if (userStake.amount == 0) revert NothingStaked();
        if (amount == 0) revert ZeroAmount();
        if (amount > uint256(userStake.amount)) revert InsufficientBalance();
        
        if (block.timestamp - uint256(userStake.startTime) < MINIMUM_STAKE_TIME) revert StakingPeriodNotMet();
        
        uint256 pendingReward = calculatePendingReward(msg.sender);
        if (pendingReward > 0) {
            _mint(msg.sender, pendingReward);
        }
        
        userStake.amount = uint208(uint256(userStake.amount) - amount);
        totalStaked -= amount;
        userStake.lastRewardClaim = uint48(block.timestamp);
        
        _transfer(address(this), msg.sender, amount);
        
        emit Unstaked(msg.sender, amount);
    }
    
    function claimStakingReward() external nonReentrant whenNotPaused {
        Stake storage userStake = stakes[msg.sender];
        
        if (userStake.amount == 0) revert NothingStaked();
        
        uint256 reward = calculatePendingReward(msg.sender);
        if (reward == 0) revert ZeroAmount();
        
        _mint(msg.sender, reward);
        
        userStake.lastRewardClaim = uint48(block.timestamp);
        
        emit StakingRewardClaimed(msg.sender, reward);
    }
    
    function calculatePendingReward(address user) public view returns (uint256) {
        Stake memory userStake = stakes[user];
        
        if (userStake.amount == 0) {
            return 0;
        }
        
        uint256 stakingDuration = block.timestamp - uint256(userStake.lastRewardClaim);
        
        uint256 rewardRate = (ANNUAL_STAKING_RATE * uint256(userStake.amount)) / 10_000 / SECONDS_IN_YEAR;
        
        return rewardRate * stakingDuration;
    }
    
    // Manual inflation trigger function for every 6 months after contract deployment (2.5% each, totaling 5% annually)
    function triggerInflation() external onlyRole(DEFAULT_ADMIN_ROLE) {
        // Check if at least 6 months (180 days) have passed since the last inflation
        if (block.timestamp - lastInflationTime < 180 days) revert NotInflationTime();
        
        uint256 currentSupply = totalSupply();
        
        // Calculate semi-annual inflation (2.5%)
        uint256 inflationAmount = (currentSupply * 250) / 10_000; // 2.5% = 250 / 10,000
        
        _mint(treasury, inflationAmount);
        
        emit InflationMinted(inflationAmount, block.timestamp);
        
        lastInflationTime = block.timestamp;
    }
    
    // View functions
    function getDailyRewardLimit(address user) external view returns (uint256) {
        RewardClaim memory claim = dailyClaims[user];
        uint256 currentDay = block.number / BLOCKS_PER_DAY;
        
        if (uint256(claim.lastClaimTime) / BLOCKS_PER_DAY < currentDay) {
            return MAX_DAILY_REWARD;
        }
        
        return MAX_DAILY_REWARD - uint256(claim.claimedToday);
    }
    
    function getCharacter(uint256 characterId) external view returns (string memory name, uint256 price) {
        if (characterId < 1 || characterId > 5) revert CharacterNotFound();
        Character memory character = characters[characterId];
        return (character.name, character.price);
    }
    
    function isDAOMember(address user) external view returns (bool) {
        return hasBoughtLegendaryDragon[user];
    }
    
    function getStakeInfo(address user) external view returns (uint256 stakedAmount, uint256 pendingReward, uint256 stakingDuration) {
        Stake memory userStake = stakes[user];
        uint256 duration = userStake.amount > 0 ? block.timestamp - uint256(userStake.startTime) : 0;
        return (uint256(userStake.amount), calculatePendingReward(user), duration);
    }
    
    function getMinimumStakeTime() external pure returns (uint256) {
        return MINIMUM_STAKE_TIME;
    }
    
    function getTotalStaked() external view returns (uint256) {
        return totalStaked;
    }
    
    function getStakingAPY() external pure returns (uint256) {
        return ANNUAL_STAKING_RATE;
    }
    
    function getInflationRate() external pure returns (uint256) {
        return ANNUAL_INFLATION_RATE;
    }
    
    function getProposalVotes(uint32 proposalId) external view returns (uint32) {
        if (proposalId == 0 || proposalId > proposalCount) revert ProposalNotFound();
        return proposals[proposalId].voteCount;
    }
    
    function getProposalInfo(uint32 proposalId) external view returns (string memory description, uint32 voteCount, bool executed) {
        if (proposalId == 0 || proposalId > proposalCount) revert ProposalNotFound();
        Proposal storage proposal = proposals[proposalId];
        return (proposal.description, proposal.voteCount, proposal.executed);
    }
    
    function hasVoted(uint32 proposalId, address user) external view returns (bool) {
        if (proposalId == 0 || proposalId > proposalCount) revert ProposalNotFound();
        return proposals[proposalId].hasVoted[user];
    }
    
    function getProposalCount() external view returns (uint32) {
        return proposalCount;
    }
    
    // View function to check if inflation can be triggered (every 6 months)
    function canTriggerInflation() external view returns (bool) {
        return (block.timestamp - lastInflationTime >= 180 days);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_liquidityPool","type":"address"},{"internalType":"address","name":"_marketing","type":"address"},{"internalType":"address","name":"_team","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[],"name":"AlreadyVoted","type":"error"},{"inputs":[],"name":"CharacterNotFound","type":"error"},{"inputs":[],"name":"DailyRewardLimitExceeded","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"NotDAOMember","type":"error"},{"inputs":[],"name":"NotInflationTime","type":"error"},{"inputs":[],"name":"NothingStaked","type":"error"},{"inputs":[],"name":"ProposalNotFound","type":"error"},{"inputs":[],"name":"StakingPeriodNotMet","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"characterId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"CharacterBought","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"GameRewardsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"InflationMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"proposalId","type":"uint32"},{"indexed":false,"internalType":"string","name":"description","type":"string"},{"indexed":false,"internalType":"address","name":"creator","type":"address"}],"name":"ProposalCreated","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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakingRewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"burner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint32","name":"proposalId","type":"uint32"},{"indexed":false,"internalType":"address","name":"voter","type":"address"}],"name":"VoteCast","type":"event"},{"inputs":[],"name":"ANNUAL_INFLATION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ANNUAL_STAKING_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BLOCKS_PER_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ESPRESSO_MAGE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LATTE_WARRIOR_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LEGENDARY_DRAGON_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIQUIDITY_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MARKETING_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_DAILY_REWARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_STAKE_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_TREASURY_RESERVE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PALADIN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROGUE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_IN_YEAR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TEAM_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREASURY_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"adminBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId","type":"uint256"}],"name":"buyCharacter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"calculatePendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canTriggerInflation","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"characters","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimGameRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimStakingReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"description","type":"string"}],"name":"createProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"dailyClaims","outputs":[{"internalType":"uint48","name":"lastClaimTime","type":"uint48"},{"internalType":"uint208","name":"claimedToday","type":"uint208"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"characterId","type":"uint256"}],"name":"getCharacter","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getDailyRewardLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInflationRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getMinimumStakeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getProposalCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"proposalId","type":"uint32"}],"name":"getProposalInfo","outputs":[{"internalType":"string","name":"description","type":"string"},{"internalType":"uint32","name":"voteCount","type":"uint32"},{"internalType":"bool","name":"executed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"proposalId","type":"uint32"}],"name":"getProposalVotes","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"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":"address","name":"user","type":"address"}],"name":"getStakeInfo","outputs":[{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"pendingReward","type":"uint256"},{"internalType":"uint256","name":"stakingDuration","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingAPY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getTotalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"address","name":"","type":"address"}],"name":"hasBoughtLegendaryDragon","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"uint32","name":"proposalId","type":"uint32"},{"internalType":"address","name":"user","type":"address"}],"name":"hasVoted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isDAOMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastInflationTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposalCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"proposals","outputs":[{"internalType":"uint32","name":"id","type":"uint32"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint32","name":"voteCount","type":"uint32"},{"internalType":"bool","name":"executed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","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":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakes","outputs":[{"internalType":"uint208","name":"amount","type":"uint208"},{"internalType":"uint48","name":"startTime","type":"uint48"},{"internalType":"uint48","name":"lastRewardClaim","type":"uint48"}],"stateMutability":"view","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":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"triggerInflation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"proposalId","type":"uint32"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405234801562000010575f80fd5b506040516200309d3803806200309d833981016040819052620000339162000683565b6040518060400160405280600a81526020016921b7b3333c9021b7b4b760b11b81525060405180604001604052806005815260200164434f46465960d81b81525081600390816200008591906200077d565b5060046200009482826200077d565b50506001600655506007805460ff191690556001600160a01b0384161580620000c457506001600160a01b038316155b80620000d757506001600160a01b038216155b80620000ea57506001600160a01b038116155b15620001095760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0384166080526200012e846b183bdac6ae9bc1c8cc00000062000448565b62000146836b09b18ab5df7180b6b800000062000448565b6200015e826b07452808679520890a00000062000448565b62000176816b07452808679520890a00000062000448565b620001825f3362000488565b5060408051608081018252600c9181019182526b135bd8da184812db9a59da1d60a21b606082015290815269043c33c193756480000060208083019190915260015f52600a905280517fbbc70db1b6c7afd11e79c0fb0051300458f1a3acb8ee9789d9b6b26c61ad9bc7908190620001fb90826200077d565b506020918201516001909101556040805160808101825260109181019182526f4172616269636120417263686d61676560801b6060820152908152690878678326eac90000008183015260025f52600a90915280517fbff4442b8ed600beeb8e26b1279a0f0d14c6edfaec26d968ee13c86f7d4c2ba89081906200028090826200077d565b506020918201516001909101556040805160808101825260139181019182527f526f627573746120536861646f77626c616465000000000000000000000000006060820152908152690ed2b525841adfc000008183015260035f52600a90915280517fa856840544dc26124927add067d799967eac11be13e14d82cc281ea46fa397599081906200031290826200077d565b506020918201516001909101556040805160808101825260129181019182527121b0b8383ab1b1b4b737902a32b6b83630b960711b606082015290815269152d02c7e14af68000008183015260045f52600a90915280517fe1eb2b2161a492c07c5a334e48012567cba93ec021043f53c1955516a3c5a8419081906200039990826200077d565b506020918201516001909101556040805160808101825260139181019182527f457370726573736f20447261676f6e6c6f72640000000000000000000000000060608201529081526954b40b1f852bda0000008183015260055f52600a90915280517ff35035bc2b01d44bd35a1dcdc552315cffb73da35cfd60570b7b777f98036f9f9081906200042b90826200077d565b506020919091015160019091015550504260085550620008659050565b6001600160a01b038216620004775760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b620004845f838362000538565b5050565b5f8281526005602090815260408083206001600160a01b038516845290915281205460ff166200052f575f8381526005602090815260408083206001600160a01b03861684529091529020805460ff19166001179055620004e63390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600162000532565b505f5b92915050565b6001600160a01b03831662000566578060025f8282546200055a919062000845565b90915550620005d89050565b6001600160a01b0383165f9081526020819052604090205481811015620005ba5760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016200046e565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216620005f65760028054829003905562000614565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200065a91815260200190565b60405180910390a3505050565b80516001600160a01b03811681146200067e575f80fd5b919050565b5f805f806080858703121562000697575f80fd5b620006a28562000667565b9350620006b26020860162000667565b9250620006c26040860162000667565b9150620006d26060860162000667565b905092959194509250565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200070657607f821691505b6020821081036200072557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000778575f81815260208120601f850160051c81016020861015620007535750805b601f850160051c820191505b8181101562000774578281556001016200075f565b5050505b505050565b81516001600160401b03811115620007995762000799620006dd565b620007b181620007aa8454620006f1565b846200072b565b602080601f831160018114620007e7575f8415620007cf5750858301515b5f19600386901b1c1916600185901b17855562000774565b5f85815260208120601f198616915b828110156200081757888601518255948401946001909101908401620007f6565b50858210156200083557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200053257634e487b7160e01b5f52601160045260245ffd5b6080516128036200089a5f395f818161068e01528181610a4501528181610c8001528181610da801526113c001526128035ff3fe608060405234801561000f575f80fd5b50600436106103e0575f3560e01c80637fbd1b5a1161020b578063afc695ce1161011f578063cfff9c98116100b4578063dabb053111610084578063dabb053114610915578063dd62ed3e14610928578063deb61c1514610960578063e7d2128714610973578063fb9ba93714610986575f80fd5b8063cfff9c98146108d7578063d3c22b38146108df578063d547741f146108f2578063da35c66414610905575f80fd5b8063c08cc02d116100ef578063c08cc02d14610870578063c34531531461088f578063c3bd8d03146108bd578063c690fb95146108ce575f80fd5b8063afc695ce1461082c578063b1e44d8f14610834578063b5bfea66146107ab578063bec363821461085f575f80fd5b80638b32f62a116101a057806395d89b411161017057806395d89b41146107ee578063a217fddf146107f6578063a51e6da2146107fd578063a694fc3a14610806578063a9059cbb14610819575f80fd5b80638b32f62a146107ab5780638b70e604146107be5780639094c763146107c857806391d14854146107db575f80fd5b80638456cb59116101db5780638456cb591461075d57806386b203dc1461076557806386fba106146107875780638918ac8214610798575f80fd5b80637fbd1b5a14610726578063817b1cd214610739578063819df2c41461074257806383a91f561461074a575f80fd5b80632f2ff15d116103025780635961ae00116102975780636b500373116102675780636b500373146106c85780636bb987fe146106d9578063703204ca146106e257806370a08231146106eb5780637d93cb2514610713575f80fd5b80635961ae00146106625780635c975abb146106735780635dcc93911461067e57806361d027b314610689575f80fd5b80634810bc59116102d25780634810bc591461061557806348b7d60a1461063657806349c2a1a614610647578063507e5df31461065a575f80fd5b80632f2ff15d146105d8578063313ce567146105eb57806336568abe146105fa5780633f4ba83a1461060d575f80fd5b8063113112991161037857806323b872dd1161034857806323b872dd1461056d578063248a9ca3146105805780632a4910ab146105a25780632e17de78146105c5575f80fd5b8063113112991461048157806315022d981461049457806316934fc4146104f357806318160ddd14610565575f80fd5b806306fdde03116103b357806306fdde03146104485780630917e7761461045d578063095ea7b3146104655780630da63e3f14610478575f80fd5b806301ffc9a7146103e457806302c120631461040c57806302c789c31461042b57806306dd041914610435575b5f80fd5b6103f76103f23660046122c5565b6109a8565b60405190151581526020015b60405180910390f35b61041d69152d02c7e14af680000081565b604051908152602001610403565b6104336109de565b005b61043361044336600461230e565b610aab565b610450610b8b565b6040516104039190612379565b60095461041d565b6103f761047336600461230e565b610c1b565b61041d6101f481565b61043361048f36600461238b565b610c32565b6104cd6104a23660046123a2565b600c6020525f908152604090205465ffffffffffff811690600160301b90046001600160d01b031682565b6040805165ffffffffffff90931683526001600160d01b03909116602083015201610403565b6105376105013660046123a2565b600d6020525f9081526040902080546001909101546001600160d01b0382169165ffffffffffff600160d01b9091048116911683565b604080516001600160d01b03909416845265ffffffffffff9283166020850152911690820152606001610403565b60025461041d565b6103f761057b3660046123bb565b610e13565b61041d61058e36600461238b565b5f9081526005602052604090206001015490565b6105b56105b0366004612407565b610e36565b6040516104039493929190612420565b6104336105d336600461238b565b610ef9565b6104336105e6366004612456565b61108d565b60405160128152602001610403565b610433610608366004612456565b6110b7565b6104336110ef565b61062861062336600461238b565b611101565b604051610403929190612480565b61041d6954b40b1f852bda00000081565b6104336106553660046124b5565b6111a2565b6102bc61041d565b61041d690ed2b525841adfc0000081565b60075460ff166103f7565b61041d6301e1338081565b6106b07f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610403565b61041d69043c33c193756480000081565b61041d61708081565b61041d60085481565b61041d6106f93660046123a2565b6001600160a01b03165f9081526020819052604090205490565b61041d6107213660046123a2565b61128d565b61041d6b183bdac6ae9bc1c8cc00000081565b61041d60095481565b6101f461041d565b61043361075836600461238b565b61133e565b61043361144e565b6103f76107733660046123a2565b600b6020525f908152604090205460ff1681565b61041d690878678326eac900000081565b61041d6b09b18ab5df7180b6b800000081565b61041d6b07452808679520890a00000081565b61041d6201518081565b6104336107d6366004612407565b611460565b6103f76107e9366004612456565b6115a6565b6104506115d0565b61041d5f81565b6201518061041d565b61043361081436600461238b565b6115df565b6103f761082736600461230e565b61175c565b610433611769565b6103f76108423660046123a2565b6001600160a01b03165f908152600b602052604090205460ff1690565b61041d69d3c21bcecceda100000081565b600f5463ffffffff165b60405163ffffffff9091168152602001610403565b6108a261089d3660046123a2565b611849565b60408051938452602084019290925290820152606001610403565b61041d69021e19e0c9bab240000081565b61041d6102bc81565b6103f76118ef565b6103f76108ed366004612560565b611909565b610433610900366004612456565b61197c565b600f5461087a9063ffffffff1681565b61062861092336600461238b565b6119a0565b61041d610936366004612588565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61087a61096e366004612407565b611a91565b61041d6109813660046123a2565b611aec565b610999610994366004612407565b611bbb565b604051610403939291906125a2565b5f6001600160e01b03198216637965db0b60e01b14806109d857506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f6109e881611cc6565b62ed4e00600854426109fa91906125e5565b1015610a19576040516335623f5360e01b815260040160405180910390fd5b5f610a2360025490565b90505f612710610a348360fa6125f8565b610a3e919061260f565b9050610a6a7f000000000000000000000000000000000000000000000000000000000000000082611cd0565b604080518281524260208201527f0d82c0920038b8dc7f633e18585f37092ba957b84876fcf833d6841f69eaa327910160405180910390a150504260085550565b5f610ab581611cc6565b6001600160a01b038316610adc5760405163e6c4247b60e01b815260040160405180910390fd5b815f03610afc57604051631f2a200560e01b815260040160405180910390fd5b81610b1b846001600160a01b03165f9081526020819052604090205490565b1015610b3a57604051631e9acf1760e31b815260040160405180910390fd5b610b448383611d0d565b604080516001600160a01b0385168152602081018490527ffd38818f5291bf0bb3a2a48aadc06ba8757865d1dabd804585338aab3009dcb6910160405180910390a1505050565b606060038054610b9a9061262e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc69061262e565b8015610c115780601f10610be857610100808354040283529160200191610c11565b820191905f5260205f20905b815481529060010190602001808311610bf457829003601f168201915b5050505050905090565b5f33610c28818585611d41565b5060019392505050565b610c3a611d4e565b610c42611da7565b805f03610c6257604051631f2a200560e01b815260040160405180910390fd5b610c7669d3c21bcecceda100000082612666565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000165f908152602081905260409020541015610ccd57604051631e9acf1760e31b815260040160405180910390fd5b335f908152600c6020526040812090610ce86170804361260f565b82549091508190610d04906170809065ffffffffffff1661260f565b1015610d1757815465ffffffffffff1682555b815469021e19e0c9bab240000090610d40908590600160301b90046001600160d01b0316612666565b1115610d5f5760405163bcb0602f60e01b815260040160405180910390fd5b8154610d7c908490600160301b90046001600160d01b0316612666565b4365ffffffffffff166001600160d01b0391909116600160301b0265ffffffffffff1916178255610dce7f00000000000000000000000000000000000000000000000000000000000000003385611ded565b60405183815233907f8d718f6dd7a972f534a1d5d20112e9a7f1b0129351da26dde14d940fe28e4e5a906020015b60405180910390a25050610e106001600655565b50565b5f33610e20858285611e4a565b610e2b858585611ded565b506001949350505050565b600e6020525f90815260409020805460018201805463ffffffff9092169291610e5e9061262e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8a9061262e565b8015610ed55780601f10610eac57610100808354040283529160200191610ed5565b820191905f5260205f20905b815481529060010190602001808311610eb857829003601f168201915b5050506002909301549192505063ffffffff81169060ff6401000000009091041684565b610f01611d4e565b610f09611da7565b335f908152600d60205260408120805490916001600160d01b039091169003610f4557604051639fe7bfd960e01b815260040160405180910390fd5b815f03610f6557604051631f2a200560e01b815260040160405180910390fd5b80546001600160d01b0316821115610f9057604051631e9acf1760e31b815260040160405180910390fd5b80546201518090610fb090600160d01b900465ffffffffffff16426125e5565b1015610fcf5760405163508bb1f560e01b815260040160405180910390fd5b5f610fd933611aec565b90508015610feb57610feb3382611cd0565b81546110019084906001600160d01b03166125e5565b82546001600160d01b0319166001600160d01b0391909116178255600980548491905f906110309084906125e5565b909155505060018201805465ffffffffffff19164265ffffffffffff1617905561105b303385611ded565b60405183815233907f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f7590602001610dfc565b5f828152600560205260409020600101546110a781611cc6565b6110b18383611ec0565b50505050565b6001600160a01b03811633146110e05760405163334bd91960e11b815260040160405180910390fd5b6110ea8282611f51565b505050565b5f6110f981611cc6565b610e10611fbc565b600a6020525f908152604090208054819061111b9061262e565b80601f01602080910402602001604051908101604052809291908181526020018280546111479061262e565b80156111925780601f1061116957610100808354040283529160200191611192565b820191905f5260205f20905b81548152906001019060200180831161117557829003601f168201915b5050505050908060010154905082565b335f908152600b602052604090205460ff166111d157604051636acb7bb760e01b815260040160405180910390fd5b600f805463ffffffff16905f6111e683612679565b82546101009290920a63ffffffff818102199093169183160217909155600f54165f818152600e60205260409020805463ffffffff1916909117815590506001810161123283826126e8565b5060028101805464ffffffffff19169055600f5460405163ffffffff909116907f170253c0daf084f6c4fa3517aa2197938887318106d1ee18092df470faef88739061128190859033906127a4565b60405180910390a25050565b6001600160a01b0381165f908152600c6020908152604080832081518083019092525465ffffffffffff81168252600160301b90046001600160d01b031691810191909152816112df6170804361260f565b905080617080835f015165ffffffffffff166112fb919061260f565b1015611314575069021e19e0c9bab24000009392505050565b6020820151611336906001600160d01b031669021e19e0c9bab24000006125e5565b949350505050565b611346611d4e565b61134e611da7565b600181108061135d5750600581115b1561137b57604051634248397760e01b815260040160405180910390fd5b5f818152600a602090815260408083206001015433845291839052909120548111156113ba57604051631e9acf1760e31b815260040160405180910390fd5b6113e5337f000000000000000000000000000000000000000000000000000000000000000083611ded565b8160050361140757335f908152600b60205260409020805460ff191660011790555b604080518381526020810183905233917f245c63bb62aea757877ac076761c58fd7196a5acfe380e7792de9115eb82d08591015b60405180910390a250610e106001600655565b5f61145881611cc6565b610e1061200e565b335f908152600b602052604090205460ff1661148f57604051636acb7bb760e01b815260040160405180910390fd5b63ffffffff811615806114ad5750600f5463ffffffff908116908216115b156114cb5760405163635e873760e01b815260040160405180910390fd5b63ffffffff81165f908152600e60209081526040808320338452600381019092529091205460ff161561151157604051637c9a1cf960e01b815260040160405180910390fd5b335f9081526003820160205260408120805460ff1916600117905560028201805463ffffffff169161154283612679565b91906101000a81548163ffffffff021916908363ffffffff160217905550508163ffffffff167f91a843eedce4bb90842f8c2294f2a7171d8887f5bb8f4650ca6c91bd9f551cdb3360405161128191906001600160a01b0391909116815260200190565b5f9182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060048054610b9a9061262e565b6115e7611d4e565b6115ef611da7565b805f0361160f57604051631f2a200560e01b815260040160405180910390fd5b335f9081526020819052604090205481111561163e57604051631e9acf1760e31b815260040160405180910390fd5b611649333083611ded565b335f908152600d60205260408120805490916001600160d01b0390911690036116a75780546001600160d01b0316600160d01b4265ffffffffffff1690810291909117825560018201805465ffffffffffff191690911790556116e0565b5f6116b133611aec565b905080156116c3576116c33382611cd0565b5060018101805465ffffffffffff19164265ffffffffffff161790555b80546116f69083906001600160d01b0316612666565b81546001600160d01b0319166001600160d01b0391909116178155600980548391905f90611725908490612666565b909155505060405182815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d9060200161143b565b5f33610c28818585611ded565b611771611d4e565b611779611da7565b335f908152600d60205260408120805490916001600160d01b0390911690036117b557604051639fe7bfd960e01b815260040160405180910390fd5b5f6117bf33611aec565b9050805f036117e157604051631f2a200560e01b815260040160405180910390fd5b6117eb3382611cd0565b60018201805465ffffffffffff19164265ffffffffffff1617905560405181815233907f6dd401e61ba732582a5eba3d54ccc3afb3609cd3ac1a166d1d36f75fc0aedcda9060200160405180910390a250506118476001600655565b565b6001600160a01b0381165f908152600d60209081526040808320815160608101835281546001600160d01b03811680835265ffffffffffff600160d01b90920482169583019590955260019092015490911691810191909152829182919082906118b3575f6118ca565b60208201516118ca9065ffffffffffff16426125e5565b82519091506001600160d01b03166118e187611aec565b909790965090945092505050565b5f62ed4e006008544261190291906125e5565b1015905090565b5f63ffffffff831615806119285750600f5463ffffffff908116908416115b156119465760405163635e873760e01b815260040160405180910390fd5b5063ffffffff82165f908152600e602090815260408083206001600160a01b038516845260030190915290205460ff1692915050565b5f8281526005602052604090206001015461199681611cc6565b6110b18383611f51565b60605f60018310806119b25750600583115b156119d057604051634248397760e01b815260040160405180910390fd5b5f838152600a602052604080822081518083019092528054829082906119f59061262e565b80601f0160208091040260200160405190810160405280929190818152602001828054611a219061262e565b8015611a6c5780601f10611a4357610100808354040283529160200191611a6c565b820191905f5260205f20905b815481529060010190602001808311611a4f57829003601f168201915b5050509183525050600191909101546020918201528151910151909590945092505050565b5f63ffffffff82161580611ab05750600f5463ffffffff908116908316115b15611ace5760405163635e873760e01b815260040160405180910390fd5b5063ffffffff9081165f908152600e60205260409020600201541690565b6001600160a01b0381165f908152600d60209081526040808320815160608101835281546001600160d01b03811680835265ffffffffffff600160d01b90920482169583019590955260019092015490911691810191909152908203611b5457505f92915050565b5f816040015165ffffffffffff1642611b6d91906125e5565b90505f6301e13380612710845f01516001600160d01b03166102bc611b9291906125f8565b611b9c919061260f565b611ba6919061260f565b9050611bb282826125f8565b95945050505050565b60605f8063ffffffff84161580611bdd5750600f5463ffffffff908116908516115b15611bfb5760405163635e873760e01b815260040160405180910390fd5b63ffffffff8481165f908152600e6020526040902060028101546001820180549293909290821691640100000000900460ff16908390611c3a9061262e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c669061262e565b8015611cb15780601f10611c8857610100808354040283529160200191611cb1565b820191905f5260205f20905b815481529060010190602001808311611c9457829003601f168201915b50505050509250935093509350509193909250565b610e10813361204b565b6001600160a01b038216611cfe5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b611d095f8383612084565b5050565b6001600160a01b038216611d3657604051634b637e8f60e11b81525f6004820152602401611cf5565b611d09825f83612084565b6110ea83838360016121aa565b600260065403611da05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611cf5565b6002600655565b60075460ff16156118475760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401611cf5565b6001600160a01b038316611e1657604051634b637e8f60e11b81525f6004820152602401611cf5565b6001600160a01b038216611e3f5760405163ec442f0560e01b81525f6004820152602401611cf5565b6110ea838383612084565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198110156110b15781811015611eb257604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401611cf5565b6110b184848484035f6121aa565b5f611ecb83836115a6565b611f4a575f8381526005602090815260408083206001600160a01b03861684529091529020805460ff19166001179055611f023390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016109d8565b505f6109d8565b5f611f5c83836115a6565b15611f4a575f8381526005602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016109d8565b611fc461227c565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b612016611da7565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ff13390565b61205582826115a6565b611d095760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611cf5565b6001600160a01b0383166120ae578060025f8282546120a39190612666565b9091555061211e9050565b6001600160a01b0383165f90815260208190526040902054818110156121005760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401611cf5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661213a57600280548290039055612158565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161219d91815260200190565b60405180910390a3505050565b6001600160a01b0384166121d35760405163e602df0560e01b81525f6004820152602401611cf5565b6001600160a01b0383166121fc57604051634a1406b160e11b81525f6004820152602401611cf5565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156110b157826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161226e91815260200190565b60405180910390a350505050565b60075460ff166118475760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401611cf5565b5f602082840312156122d5575f80fd5b81356001600160e01b0319811681146122ec575f80fd5b9392505050565b80356001600160a01b0381168114612309575f80fd5b919050565b5f806040838503121561231f575f80fd5b612328836122f3565b946020939093013593505050565b5f81518084525f5b8181101561235a5760208185018101518683018201520161233e565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6122ec6020830184612336565b5f6020828403121561239b575f80fd5b5035919050565b5f602082840312156123b2575f80fd5b6122ec826122f3565b5f805f606084860312156123cd575f80fd5b6123d6846122f3565b92506123e4602085016122f3565b9150604084013590509250925092565b803563ffffffff81168114612309575f80fd5b5f60208284031215612417575f80fd5b6122ec826123f4565b5f63ffffffff80871683526080602084015261243f6080840187612336565b941660408301525090151560609091015292915050565b5f8060408385031215612467575f80fd5b82359150612477602084016122f3565b90509250929050565b604081525f6124926040830185612336565b90508260208301529392505050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156124c5575f80fd5b813567ffffffffffffffff808211156124dc575f80fd5b818401915084601f8301126124ef575f80fd5b813581811115612501576125016124a1565b604051601f8201601f19908116603f01168101908382118183101715612529576125296124a1565b81604052828152876020848701011115612541575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f8060408385031215612571575f80fd5b61257a836123f4565b9150612477602084016122f3565b5f8060408385031215612599575f80fd5b61257a836122f3565b606081525f6125b46060830186612336565b63ffffffff94909416602083015250901515604090910152919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156109d8576109d86125d1565b80820281158282048414176109d8576109d86125d1565b5f8261262957634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c9082168061264257607f821691505b60208210810361266057634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156109d8576109d86125d1565b5f63ffffffff808316818103612691576126916125d1565b6001019392505050565b601f8211156110ea575f81815260208120601f850160051c810160208610156126c15750805b601f850160051c820191505b818110156126e0578281556001016126cd565b505050505050565b815167ffffffffffffffff811115612702576127026124a1565b61271681612710845461262e565b8461269b565b602080601f831160018114612749575f84156127325750858301515b5f19600386901b1c1916600185901b1785556126e0565b5f85815260208120601f198616915b8281101561277757888601518255948401946001909101908401612758565b508582101561279457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b604081525f6127b66040830185612336565b905060018060a01b0383166020830152939250505056fea26469706673582212205b3e6f91cdf80762b126ddfdc2ee362b31d7e0da26066bf8259c6f1890ca2dd164736f6c634300081400330000000000000000000000001a146f6a10ec0e6561ef9e56ddb8d181881b34810000000000000000000000001421cf03921a81f275ff8d0c3a1af59c17f6f7a8000000000000000000000000f72adec5e8d006f28600d3cd70417c3e5c33198c000000000000000000000000cf8916f41e6dfefee48b83ff73fa83a03be788d6

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106103e0575f3560e01c80637fbd1b5a1161020b578063afc695ce1161011f578063cfff9c98116100b4578063dabb053111610084578063dabb053114610915578063dd62ed3e14610928578063deb61c1514610960578063e7d2128714610973578063fb9ba93714610986575f80fd5b8063cfff9c98146108d7578063d3c22b38146108df578063d547741f146108f2578063da35c66414610905575f80fd5b8063c08cc02d116100ef578063c08cc02d14610870578063c34531531461088f578063c3bd8d03146108bd578063c690fb95146108ce575f80fd5b8063afc695ce1461082c578063b1e44d8f14610834578063b5bfea66146107ab578063bec363821461085f575f80fd5b80638b32f62a116101a057806395d89b411161017057806395d89b41146107ee578063a217fddf146107f6578063a51e6da2146107fd578063a694fc3a14610806578063a9059cbb14610819575f80fd5b80638b32f62a146107ab5780638b70e604146107be5780639094c763146107c857806391d14854146107db575f80fd5b80638456cb59116101db5780638456cb591461075d57806386b203dc1461076557806386fba106146107875780638918ac8214610798575f80fd5b80637fbd1b5a14610726578063817b1cd214610739578063819df2c41461074257806383a91f561461074a575f80fd5b80632f2ff15d116103025780635961ae00116102975780636b500373116102675780636b500373146106c85780636bb987fe146106d9578063703204ca146106e257806370a08231146106eb5780637d93cb2514610713575f80fd5b80635961ae00146106625780635c975abb146106735780635dcc93911461067e57806361d027b314610689575f80fd5b80634810bc59116102d25780634810bc591461061557806348b7d60a1461063657806349c2a1a614610647578063507e5df31461065a575f80fd5b80632f2ff15d146105d8578063313ce567146105eb57806336568abe146105fa5780633f4ba83a1461060d575f80fd5b8063113112991161037857806323b872dd1161034857806323b872dd1461056d578063248a9ca3146105805780632a4910ab146105a25780632e17de78146105c5575f80fd5b8063113112991461048157806315022d981461049457806316934fc4146104f357806318160ddd14610565575f80fd5b806306fdde03116103b357806306fdde03146104485780630917e7761461045d578063095ea7b3146104655780630da63e3f14610478575f80fd5b806301ffc9a7146103e457806302c120631461040c57806302c789c31461042b57806306dd041914610435575b5f80fd5b6103f76103f23660046122c5565b6109a8565b60405190151581526020015b60405180910390f35b61041d69152d02c7e14af680000081565b604051908152602001610403565b6104336109de565b005b61043361044336600461230e565b610aab565b610450610b8b565b6040516104039190612379565b60095461041d565b6103f761047336600461230e565b610c1b565b61041d6101f481565b61043361048f36600461238b565b610c32565b6104cd6104a23660046123a2565b600c6020525f908152604090205465ffffffffffff811690600160301b90046001600160d01b031682565b6040805165ffffffffffff90931683526001600160d01b03909116602083015201610403565b6105376105013660046123a2565b600d6020525f9081526040902080546001909101546001600160d01b0382169165ffffffffffff600160d01b9091048116911683565b604080516001600160d01b03909416845265ffffffffffff9283166020850152911690820152606001610403565b60025461041d565b6103f761057b3660046123bb565b610e13565b61041d61058e36600461238b565b5f9081526005602052604090206001015490565b6105b56105b0366004612407565b610e36565b6040516104039493929190612420565b6104336105d336600461238b565b610ef9565b6104336105e6366004612456565b61108d565b60405160128152602001610403565b610433610608366004612456565b6110b7565b6104336110ef565b61062861062336600461238b565b611101565b604051610403929190612480565b61041d6954b40b1f852bda00000081565b6104336106553660046124b5565b6111a2565b6102bc61041d565b61041d690ed2b525841adfc0000081565b60075460ff166103f7565b61041d6301e1338081565b6106b07f0000000000000000000000001a146f6a10ec0e6561ef9e56ddb8d181881b348181565b6040516001600160a01b039091168152602001610403565b61041d69043c33c193756480000081565b61041d61708081565b61041d60085481565b61041d6106f93660046123a2565b6001600160a01b03165f9081526020819052604090205490565b61041d6107213660046123a2565b61128d565b61041d6b183bdac6ae9bc1c8cc00000081565b61041d60095481565b6101f461041d565b61043361075836600461238b565b61133e565b61043361144e565b6103f76107733660046123a2565b600b6020525f908152604090205460ff1681565b61041d690878678326eac900000081565b61041d6b09b18ab5df7180b6b800000081565b61041d6b07452808679520890a00000081565b61041d6201518081565b6104336107d6366004612407565b611460565b6103f76107e9366004612456565b6115a6565b6104506115d0565b61041d5f81565b6201518061041d565b61043361081436600461238b565b6115df565b6103f761082736600461230e565b61175c565b610433611769565b6103f76108423660046123a2565b6001600160a01b03165f908152600b602052604090205460ff1690565b61041d69d3c21bcecceda100000081565b600f5463ffffffff165b60405163ffffffff9091168152602001610403565b6108a261089d3660046123a2565b611849565b60408051938452602084019290925290820152606001610403565b61041d69021e19e0c9bab240000081565b61041d6102bc81565b6103f76118ef565b6103f76108ed366004612560565b611909565b610433610900366004612456565b61197c565b600f5461087a9063ffffffff1681565b61062861092336600461238b565b6119a0565b61041d610936366004612588565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b61087a61096e366004612407565b611a91565b61041d6109813660046123a2565b611aec565b610999610994366004612407565b611bbb565b604051610403939291906125a2565b5f6001600160e01b03198216637965db0b60e01b14806109d857506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f6109e881611cc6565b62ed4e00600854426109fa91906125e5565b1015610a19576040516335623f5360e01b815260040160405180910390fd5b5f610a2360025490565b90505f612710610a348360fa6125f8565b610a3e919061260f565b9050610a6a7f0000000000000000000000001a146f6a10ec0e6561ef9e56ddb8d181881b348182611cd0565b604080518281524260208201527f0d82c0920038b8dc7f633e18585f37092ba957b84876fcf833d6841f69eaa327910160405180910390a150504260085550565b5f610ab581611cc6565b6001600160a01b038316610adc5760405163e6c4247b60e01b815260040160405180910390fd5b815f03610afc57604051631f2a200560e01b815260040160405180910390fd5b81610b1b846001600160a01b03165f9081526020819052604090205490565b1015610b3a57604051631e9acf1760e31b815260040160405180910390fd5b610b448383611d0d565b604080516001600160a01b0385168152602081018490527ffd38818f5291bf0bb3a2a48aadc06ba8757865d1dabd804585338aab3009dcb6910160405180910390a1505050565b606060038054610b9a9061262e565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc69061262e565b8015610c115780601f10610be857610100808354040283529160200191610c11565b820191905f5260205f20905b815481529060010190602001808311610bf457829003601f168201915b5050505050905090565b5f33610c28818585611d41565b5060019392505050565b610c3a611d4e565b610c42611da7565b805f03610c6257604051631f2a200560e01b815260040160405180910390fd5b610c7669d3c21bcecceda100000082612666565b6001600160a01b037f0000000000000000000000001a146f6a10ec0e6561ef9e56ddb8d181881b3481165f908152602081905260409020541015610ccd57604051631e9acf1760e31b815260040160405180910390fd5b335f908152600c6020526040812090610ce86170804361260f565b82549091508190610d04906170809065ffffffffffff1661260f565b1015610d1757815465ffffffffffff1682555b815469021e19e0c9bab240000090610d40908590600160301b90046001600160d01b0316612666565b1115610d5f5760405163bcb0602f60e01b815260040160405180910390fd5b8154610d7c908490600160301b90046001600160d01b0316612666565b4365ffffffffffff166001600160d01b0391909116600160301b0265ffffffffffff1916178255610dce7f0000000000000000000000001a146f6a10ec0e6561ef9e56ddb8d181881b34813385611ded565b60405183815233907f8d718f6dd7a972f534a1d5d20112e9a7f1b0129351da26dde14d940fe28e4e5a906020015b60405180910390a25050610e106001600655565b50565b5f33610e20858285611e4a565b610e2b858585611ded565b506001949350505050565b600e6020525f90815260409020805460018201805463ffffffff9092169291610e5e9061262e565b80601f0160208091040260200160405190810160405280929190818152602001828054610e8a9061262e565b8015610ed55780601f10610eac57610100808354040283529160200191610ed5565b820191905f5260205f20905b815481529060010190602001808311610eb857829003601f168201915b5050506002909301549192505063ffffffff81169060ff6401000000009091041684565b610f01611d4e565b610f09611da7565b335f908152600d60205260408120805490916001600160d01b039091169003610f4557604051639fe7bfd960e01b815260040160405180910390fd5b815f03610f6557604051631f2a200560e01b815260040160405180910390fd5b80546001600160d01b0316821115610f9057604051631e9acf1760e31b815260040160405180910390fd5b80546201518090610fb090600160d01b900465ffffffffffff16426125e5565b1015610fcf5760405163508bb1f560e01b815260040160405180910390fd5b5f610fd933611aec565b90508015610feb57610feb3382611cd0565b81546110019084906001600160d01b03166125e5565b82546001600160d01b0319166001600160d01b0391909116178255600980548491905f906110309084906125e5565b909155505060018201805465ffffffffffff19164265ffffffffffff1617905561105b303385611ded565b60405183815233907f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f7590602001610dfc565b5f828152600560205260409020600101546110a781611cc6565b6110b18383611ec0565b50505050565b6001600160a01b03811633146110e05760405163334bd91960e11b815260040160405180910390fd5b6110ea8282611f51565b505050565b5f6110f981611cc6565b610e10611fbc565b600a6020525f908152604090208054819061111b9061262e565b80601f01602080910402602001604051908101604052809291908181526020018280546111479061262e565b80156111925780601f1061116957610100808354040283529160200191611192565b820191905f5260205f20905b81548152906001019060200180831161117557829003601f168201915b5050505050908060010154905082565b335f908152600b602052604090205460ff166111d157604051636acb7bb760e01b815260040160405180910390fd5b600f805463ffffffff16905f6111e683612679565b82546101009290920a63ffffffff818102199093169183160217909155600f54165f818152600e60205260409020805463ffffffff1916909117815590506001810161123283826126e8565b5060028101805464ffffffffff19169055600f5460405163ffffffff909116907f170253c0daf084f6c4fa3517aa2197938887318106d1ee18092df470faef88739061128190859033906127a4565b60405180910390a25050565b6001600160a01b0381165f908152600c6020908152604080832081518083019092525465ffffffffffff81168252600160301b90046001600160d01b031691810191909152816112df6170804361260f565b905080617080835f015165ffffffffffff166112fb919061260f565b1015611314575069021e19e0c9bab24000009392505050565b6020820151611336906001600160d01b031669021e19e0c9bab24000006125e5565b949350505050565b611346611d4e565b61134e611da7565b600181108061135d5750600581115b1561137b57604051634248397760e01b815260040160405180910390fd5b5f818152600a602090815260408083206001015433845291839052909120548111156113ba57604051631e9acf1760e31b815260040160405180910390fd5b6113e5337f0000000000000000000000001a146f6a10ec0e6561ef9e56ddb8d181881b348183611ded565b8160050361140757335f908152600b60205260409020805460ff191660011790555b604080518381526020810183905233917f245c63bb62aea757877ac076761c58fd7196a5acfe380e7792de9115eb82d08591015b60405180910390a250610e106001600655565b5f61145881611cc6565b610e1061200e565b335f908152600b602052604090205460ff1661148f57604051636acb7bb760e01b815260040160405180910390fd5b63ffffffff811615806114ad5750600f5463ffffffff908116908216115b156114cb5760405163635e873760e01b815260040160405180910390fd5b63ffffffff81165f908152600e60209081526040808320338452600381019092529091205460ff161561151157604051637c9a1cf960e01b815260040160405180910390fd5b335f9081526003820160205260408120805460ff1916600117905560028201805463ffffffff169161154283612679565b91906101000a81548163ffffffff021916908363ffffffff160217905550508163ffffffff167f91a843eedce4bb90842f8c2294f2a7171d8887f5bb8f4650ca6c91bd9f551cdb3360405161128191906001600160a01b0391909116815260200190565b5f9182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b606060048054610b9a9061262e565b6115e7611d4e565b6115ef611da7565b805f0361160f57604051631f2a200560e01b815260040160405180910390fd5b335f9081526020819052604090205481111561163e57604051631e9acf1760e31b815260040160405180910390fd5b611649333083611ded565b335f908152600d60205260408120805490916001600160d01b0390911690036116a75780546001600160d01b0316600160d01b4265ffffffffffff1690810291909117825560018201805465ffffffffffff191690911790556116e0565b5f6116b133611aec565b905080156116c3576116c33382611cd0565b5060018101805465ffffffffffff19164265ffffffffffff161790555b80546116f69083906001600160d01b0316612666565b81546001600160d01b0319166001600160d01b0391909116178155600980548391905f90611725908490612666565b909155505060405182815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d9060200161143b565b5f33610c28818585611ded565b611771611d4e565b611779611da7565b335f908152600d60205260408120805490916001600160d01b0390911690036117b557604051639fe7bfd960e01b815260040160405180910390fd5b5f6117bf33611aec565b9050805f036117e157604051631f2a200560e01b815260040160405180910390fd5b6117eb3382611cd0565b60018201805465ffffffffffff19164265ffffffffffff1617905560405181815233907f6dd401e61ba732582a5eba3d54ccc3afb3609cd3ac1a166d1d36f75fc0aedcda9060200160405180910390a250506118476001600655565b565b6001600160a01b0381165f908152600d60209081526040808320815160608101835281546001600160d01b03811680835265ffffffffffff600160d01b90920482169583019590955260019092015490911691810191909152829182919082906118b3575f6118ca565b60208201516118ca9065ffffffffffff16426125e5565b82519091506001600160d01b03166118e187611aec565b909790965090945092505050565b5f62ed4e006008544261190291906125e5565b1015905090565b5f63ffffffff831615806119285750600f5463ffffffff908116908416115b156119465760405163635e873760e01b815260040160405180910390fd5b5063ffffffff82165f908152600e602090815260408083206001600160a01b038516845260030190915290205460ff1692915050565b5f8281526005602052604090206001015461199681611cc6565b6110b18383611f51565b60605f60018310806119b25750600583115b156119d057604051634248397760e01b815260040160405180910390fd5b5f838152600a602052604080822081518083019092528054829082906119f59061262e565b80601f0160208091040260200160405190810160405280929190818152602001828054611a219061262e565b8015611a6c5780601f10611a4357610100808354040283529160200191611a6c565b820191905f5260205f20905b815481529060010190602001808311611a4f57829003601f168201915b5050509183525050600191909101546020918201528151910151909590945092505050565b5f63ffffffff82161580611ab05750600f5463ffffffff908116908316115b15611ace5760405163635e873760e01b815260040160405180910390fd5b5063ffffffff9081165f908152600e60205260409020600201541690565b6001600160a01b0381165f908152600d60209081526040808320815160608101835281546001600160d01b03811680835265ffffffffffff600160d01b90920482169583019590955260019092015490911691810191909152908203611b5457505f92915050565b5f816040015165ffffffffffff1642611b6d91906125e5565b90505f6301e13380612710845f01516001600160d01b03166102bc611b9291906125f8565b611b9c919061260f565b611ba6919061260f565b9050611bb282826125f8565b95945050505050565b60605f8063ffffffff84161580611bdd5750600f5463ffffffff908116908516115b15611bfb5760405163635e873760e01b815260040160405180910390fd5b63ffffffff8481165f908152600e6020526040902060028101546001820180549293909290821691640100000000900460ff16908390611c3a9061262e565b80601f0160208091040260200160405190810160405280929190818152602001828054611c669061262e565b8015611cb15780601f10611c8857610100808354040283529160200191611cb1565b820191905f5260205f20905b815481529060010190602001808311611c9457829003601f168201915b50505050509250935093509350509193909250565b610e10813361204b565b6001600160a01b038216611cfe5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b611d095f8383612084565b5050565b6001600160a01b038216611d3657604051634b637e8f60e11b81525f6004820152602401611cf5565b611d09825f83612084565b6110ea83838360016121aa565b600260065403611da05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611cf5565b6002600655565b60075460ff16156118475760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401611cf5565b6001600160a01b038316611e1657604051634b637e8f60e11b81525f6004820152602401611cf5565b6001600160a01b038216611e3f5760405163ec442f0560e01b81525f6004820152602401611cf5565b6110ea838383612084565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198110156110b15781811015611eb257604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401611cf5565b6110b184848484035f6121aa565b5f611ecb83836115a6565b611f4a575f8381526005602090815260408083206001600160a01b03861684529091529020805460ff19166001179055611f023390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016109d8565b505f6109d8565b5f611f5c83836115a6565b15611f4a575f8381526005602090815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016109d8565b611fc461227c565b6007805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b612016611da7565b6007805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ff13390565b61205582826115a6565b611d095760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611cf5565b6001600160a01b0383166120ae578060025f8282546120a39190612666565b9091555061211e9050565b6001600160a01b0383165f90815260208190526040902054818110156121005760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401611cf5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661213a57600280548290039055612158565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161219d91815260200190565b60405180910390a3505050565b6001600160a01b0384166121d35760405163e602df0560e01b81525f6004820152602401611cf5565b6001600160a01b0383166121fc57604051634a1406b160e11b81525f6004820152602401611cf5565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156110b157826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161226e91815260200190565b60405180910390a350505050565b60075460ff166118475760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401611cf5565b5f602082840312156122d5575f80fd5b81356001600160e01b0319811681146122ec575f80fd5b9392505050565b80356001600160a01b0381168114612309575f80fd5b919050565b5f806040838503121561231f575f80fd5b612328836122f3565b946020939093013593505050565b5f81518084525f5b8181101561235a5760208185018101518683018201520161233e565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f6122ec6020830184612336565b5f6020828403121561239b575f80fd5b5035919050565b5f602082840312156123b2575f80fd5b6122ec826122f3565b5f805f606084860312156123cd575f80fd5b6123d6846122f3565b92506123e4602085016122f3565b9150604084013590509250925092565b803563ffffffff81168114612309575f80fd5b5f60208284031215612417575f80fd5b6122ec826123f4565b5f63ffffffff80871683526080602084015261243f6080840187612336565b941660408301525090151560609091015292915050565b5f8060408385031215612467575f80fd5b82359150612477602084016122f3565b90509250929050565b604081525f6124926040830185612336565b90508260208301529392505050565b634e487b7160e01b5f52604160045260245ffd5b5f602082840312156124c5575f80fd5b813567ffffffffffffffff808211156124dc575f80fd5b818401915084601f8301126124ef575f80fd5b813581811115612501576125016124a1565b604051601f8201601f19908116603f01168101908382118183101715612529576125296124a1565b81604052828152876020848701011115612541575f80fd5b826020860160208301375f928101602001929092525095945050505050565b5f8060408385031215612571575f80fd5b61257a836123f4565b9150612477602084016122f3565b5f8060408385031215612599575f80fd5b61257a836122f3565b606081525f6125b46060830186612336565b63ffffffff94909416602083015250901515604090910152919050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156109d8576109d86125d1565b80820281158282048414176109d8576109d86125d1565b5f8261262957634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c9082168061264257607f821691505b60208210810361266057634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156109d8576109d86125d1565b5f63ffffffff808316818103612691576126916125d1565b6001019392505050565b601f8211156110ea575f81815260208120601f850160051c810160208610156126c15750805b601f850160051c820191505b818110156126e0578281556001016126cd565b505050505050565b815167ffffffffffffffff811115612702576127026124a1565b61271681612710845461262e565b8461269b565b602080601f831160018114612749575f84156127325750858301515b5f19600386901b1c1916600185901b1785556126e0565b5f85815260208120601f198616915b8281101561277757888601518255948401946001909101908401612758565b508582101561279457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b604081525f6127b66040830185612336565b905060018060a01b0383166020830152939250505056fea26469706673582212205b3e6f91cdf80762b126ddfdc2ee362b31d7e0da26066bf8259c6f1890ca2dd164736f6c63430008140033

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

0000000000000000000000001a146f6a10ec0e6561ef9e56ddb8d181881b34810000000000000000000000001421cf03921a81f275ff8d0c3a1af59c17f6f7a8000000000000000000000000f72adec5e8d006f28600d3cd70417c3e5c33198c000000000000000000000000cf8916f41e6dfefee48b83ff73fa83a03be788d6

-----Decoded View---------------
Arg [0] : _treasury (address): 0x1a146F6A10EC0E6561Ef9e56dDB8D181881b3481
Arg [1] : _liquidityPool (address): 0x1421cF03921A81F275fF8d0C3a1AF59c17F6f7a8
Arg [2] : _marketing (address): 0xF72aDEC5E8D006f28600D3CD70417c3e5C33198c
Arg [3] : _team (address): 0xCf8916f41e6dfEFEe48B83Ff73fa83A03BE788D6

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000001a146f6a10ec0e6561ef9e56ddb8d181881b3481
Arg [1] : 0000000000000000000000001421cf03921a81f275ff8d0c3a1af59c17f6f7a8
Arg [2] : 000000000000000000000000f72adec5e8d006f28600d3cd70417c3e5c33198c
Arg [3] : 000000000000000000000000cf8916f41e6dfefee48b83ff73fa83a03be788d6


Deployed Bytecode Sourcemap

40917:14553:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30236:204;;;;;;:::i;:::-;;:::i;:::-;;;470:14:1;;463:22;445:41;;433:2;418:18;30236:204:0;;;;;;;;42288:56;;42328:16;42288:56;;;;;643:25:1;;;631:2;616:18;42288:56:0;497:177:1;51914:642:0;;;:::i;:::-;;45788:351;;;;;;:::i;:::-;;:::i;13005:91::-;;;:::i;:::-;;;;;;;:::i;53958:95::-;54034:11;;53958:95;;15298:190;;;;;;:::i;:::-;;:::i;41649:51::-;;41697:3;41649:51;;46431:890;;;;;;:::i;:::-;;:::i;42620:50::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;42620:50:0;;-1:-1:-1;;;;;42620:50:0;;;;;;;2347:14:1;2335:27;;;2317:46;;-1:-1:-1;;;;;2399:32:1;;;2394:2;2379:18;;2372:60;2290:18;42620:50:0;2145:293:1;42718:39:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42718:39:0;;;;-1:-1:-1;;;42718:39:0;;;;;;;;;;;;;-1:-1:-1;;;;;2659:32:1;;;2641:51;;2711:14;2761:15;;;2756:2;2741:18;;2734:43;2813:15;;2793:18;;;2786:43;2629:2;2614:18;42718:39:0;2443:392:1;14107:99:0;14186:12;;14107:99;;16098:249;;;;;;:::i;:::-;;:::i;31516:122::-;;;;;;:::i;:::-;31581:7;31608:12;;;:6;:12;;;;;:22;;;;31516:122;42973:44;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;49851:917::-;;;;;;:::i;:::-;;:::i;31948:138::-;;;;;;:::i;:::-;;:::i;13958:84::-;;;14032:2;4791:36:1;;4779:2;4764:18;13958:84:0;4649:184:1;33085:251:0;;;;;;:::i;:::-;;:::i;46286:86::-;;;:::i;42454:47::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;42351:65::-;;42400:16;42351:65;;47996:419;;;;;;:::i;:::-;;:::i;54065:102::-;41619:3;54065:102;;42228:53;;42266:15;42228:53;;39775:86;39846:7;;;;39775:86;;41766:50;;41808:8;41766:50;;42015:33;;;;;;;;-1:-1:-1;;;;;6357:32:1;;;6339:51;;6327:2;6312:18;42015:33:0;6193:203:1;42092:61:0;;42138:15;42092:61;;41489:46;;41530:5;41489:46;;41913:32;;;;;;14269:118;;;;;;:::i;:::-;-1:-1:-1;;;;;14361:18:0;14334:7;14361:18;;;;;;;;;;;;14269:118;52591:407;;;;;;:::i;:::-;;:::i;41037:64::-;;41079:22;41037:64;;41952:26;;;;;;54179:107;41697:3;54179:107;;47393:558;;;;;;:::i;:::-;;:::i;46192:82::-;;;:::i;42508:56::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;42160:61;;42206:15;42160:61;;41108:65;;41151:22;41108:65;;41252:60;;41290:22;41252:60;;41823:51;;41868:6;41823:51;;48427:434;;;;;;:::i;:::-;;:::i;30532:138::-;;;;;;:::i;:::-;;:::i;13215:95::-;;;:::i;29844:49::-;;29889:4;29844:49;;53839:107;41868:6;53839:107;;48899:940;;;;;;:::i;:::-;;:::i;14592:182::-;;;;;;:::i;:::-;;:::i;50780:502::-;;;:::i;53322:120::-;;;;;;:::i;:::-;-1:-1:-1;;;;;53404:30:0;53380:4;53404:30;;;:24;:30;;;;;;;;;53322:120;41319:65;;41366:18;41319:65;;55144:98;55221:13;;;;55144:98;;;6575:10:1;6563:23;;;6545:42;;6533:2;6518:18;55144:98:0;6401:192:1;53454:373:0;;;;;;:::i;:::-;;:::i;:::-;;;;6800:25:1;;;6856:2;6841:18;;6834:34;;;;6884:18;;;6877:34;6788:2;6773:18;53454:373:0;6598:319:1;41424:58:0;;41467:15;41424:58;;41573:49;;41619:3;41573:49;;55332:135;;;:::i;54903:229::-;;;;;;:::i;:::-;;:::i;32379:140::-;;;;;;:::i;:::-;;:::i;43024:27::-;;;;;;;;;53010:300;;;;;;:::i;:::-;;:::i;14837:142::-;;;;;;:::i;:::-;-1:-1:-1;;;;;14944:18:0;;;14917:7;14944:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;14837:142;54298:220;;;;;;:::i;:::-;;:::i;51294:487::-;;;;;;:::i;:::-;;:::i;54530:361::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;30236:204::-;30321:4;-1:-1:-1;;;;;;30345:47:0;;-1:-1:-1;;;30345:47:0;;:87;;-1:-1:-1;;;;;;;;;;27672:40:0;;;30396:36;30338:94;30236:204;-1:-1:-1;;30236:204:0:o;51914:642::-;29889:4;30128:16;29889:4;30128:10;:16::i;:::-;52120:8:::1;52100:17;;52082:15;:35;;;;:::i;:::-;:46;52078:77;;;52137:18;;-1:-1:-1::0;;;52137:18:0::1;;;;;;;;;;;52078:77;52176:21;52200:13;14186:12:::0;;;14107:99;52200:13:::1;52176:37:::0;-1:-1:-1;52285:23:0::1;52335:6;52312:19;52176:37:::0;52328:3:::1;52312:19;:::i;:::-;52311:30;;;;:::i;:::-;52285:56;;52385:32;52391:8;52401:15;52385:5;:32::i;:::-;52443:49;::::0;;8676:25:1;;;52476:15:0::1;8732:2:1::0;8717:18;;8710:34;52443:49:0::1;::::0;8649:18:1;52443:49:0::1;;;;;;;-1:-1:-1::0;;52533:15:0::1;52513:17;:35:::0;-1:-1:-1;51914:642:0:o;45788:351::-;29889:4;30128:16;29889:4;30128:10;:16::i;:::-;-1:-1:-1;;;;;45890:18:0;::::1;45886:47;;45917:16;;-1:-1:-1::0;;;45917:16:0::1;;;;;;;;;;;45886:47;45948:6;45958:1;45948:11:::0;45944:36:::1;;45968:12;;-1:-1:-1::0;;;45968:12:0::1;;;;;;;;;;;45944:36;46013:6;45995:15;46005:4;-1:-1:-1::0;;;;;14361:18:0;14334:7;14361:18;;;;;;;;;;;;14269:118;45995:15:::1;:24;45991:58;;;46028:21;;-1:-1:-1::0;;;46028:21:0::1;;;;;;;;;;;45991:58;46070:19;46076:4;46082:6;46070:5;:19::i;:::-;46105:26;::::0;;-1:-1:-1;;;;;8947:32:1;;8929:51;;9011:2;8996:18;;8989:34;;;46105:26:0::1;::::0;8902:18:1;46105:26:0::1;;;;;;;45788:351:::0;;;:::o;13005:91::-;13050:13;13083:5;13076:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13005:91;:::o;15298:190::-;15371:4;4384:10;15427:31;4384:10;15443:7;15452:5;15427:8;:31::i;:::-;-1:-1:-1;15476:4:0;;15298:190;-1:-1:-1;;;15298:190:0:o;46431:890::-;37207:21;:19;:21::i;:::-;39380:19:::1;:17;:19::i;:::-;46524:6:::2;46534:1;46524:11:::0;46520:36:::2;;46544:12;;-1:-1:-1::0;;;46544:12:0::2;;;;;;;;;;;46520:36;46593:29;41366:18;46593:6:::0;:29:::2;:::i;:::-;-1:-1:-1::0;;;;;46581:8:0::2;14361:18:::0;14334:7;14361:18;;;;;;;;;;;46571:51:::2;46567:85;;;46631:21;;-1:-1:-1::0;;;46631:21:0::2;;;;;;;;;;;46567:85;46713:10;46673:25;46701:23:::0;;;:11:::2;:23;::::0;;;;;46756:29:::2;41530:5;46756:12;:29;:::i;:::-;46818:19:::0;;46735:50;;-1:-1:-1;46735:50:0;;46810:45:::2;::::0;41530:5:::2;::::0;46818:19:::2;;46810:45;:::i;:::-;:58;46806:113;;;46885:22:::0;;;::::2;::::0;;46806:113:::2;46951:18:::0;;41467:15:::2;::::0;46943:36:::2;::::0;46973:6;;-1:-1:-1;;;46951:18:0;::::2;-1:-1:-1::0;;;;;46951:18:0::2;46943:36;:::i;:::-;:55;46939:121;;;47022:26;;-1:-1:-1::0;;;47022:26:0::2;;;;;;;;;;;46939:121;47117:18:::0;;47109:36:::2;::::0;47139:6;;-1:-1:-1;;;47117:18:0;::::2;-1:-1:-1::0;;;;;47117:18:0::2;47109:36;:::i;:::-;47186:12;47080:66:::0;47157:42:::2;-1:-1:-1::0;;;;;47080:66:0;;;::::2;-1:-1:-1::0;;;47080:66:0::2;-1:-1:-1::0;;47157:42:0;::::2;::::0;;47220:39:::2;47230:8;47240:10;47252:6:::0;47220:9:::2;:39::i;:::-;47275:38;::::0;643:25:1;;;47294:10:0::2;::::0;47275:38:::2;::::0;631:2:1;616:18;47275:38:0::2;;;;;;;;46509:812;;37251:20:::0;36645:1;37771:7;:22;37588:213;37251:20;46431:890;:::o;16098:249::-;16185:4;4384:10;16243:37;16259:4;4384:10;16274:5;16243:15;:37::i;:::-;16291:26;16301:4;16307:2;16311:5;16291:9;:26::i;:::-;-1:-1:-1;16335:4:0;;16098:249;-1:-1:-1;;;;16098:249:0:o;42973:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42973:44:0;;;;;;;-1:-1:-1;;42973:44:0;;;;;;;;;;;:::o;49851:917::-;37207:21;:19;:21::i;:::-;39380:19:::1;:17;:19::i;:::-;49964:10:::2;49931:23;49957:18:::0;;;:6:::2;:18;::::0;;;;50000:16;;49957:18;;-1:-1:-1;;;;;50000:16:0;;::::2;:21:::0;;49996:49:::2;;50030:15;;-1:-1:-1::0;;;50030:15:0::2;;;;;;;;;;;49996:49;50060:6;50070:1;50060:11:::0;50056:36:::2;;50080:12;;-1:-1:-1::0;;;50080:12:0::2;;;;;;;;;;;50056:36;50124:16:::0;;-1:-1:-1;;;;;50124:16:0::2;50107:34:::0;::::2;50103:68;;;50150:21;;-1:-1:-1::0;;;50150:21:0::2;;;;;;;;;;;50103:68;50222:19:::0;;41868:6:::2;::::0;50196:46:::2;::::0;-1:-1:-1;;;50222:19:0;::::2;;;50196:15;:46;:::i;:::-;:67;50192:101;;;50272:21;;-1:-1:-1::0;;;50272:21:0::2;;;;;;;;;;;50192:101;50314:21;50338:34;50361:10;50338:22;:34::i;:::-;50314:58:::0;-1:-1:-1;50387:17:0;;50383:82:::2;;50421:32;50427:10;50439:13;50421:5;:32::i;:::-;50520:16:::0;;50512:34:::2;::::0;50540:6;;-1:-1:-1;;;;;50520:16:0::2;50512:34;:::i;:::-;50485:62:::0;;-1:-1:-1;;;;;;50485:62:0::2;-1:-1:-1::0;;;;;50485:62:0;;;::::2;;::::0;;50558:11:::2;:21:::0;;50573:6;;50558:11;-1:-1:-1;;50558:21:0::2;::::0;50573:6;;50558:21:::2;:::i;:::-;::::0;;;-1:-1:-1;;50590:25:0::2;::::0;::::2;:51:::0;;-1:-1:-1;;50590:51:0::2;50625:15;50590:51;;;::::0;;50662:44:::2;50680:4;50687:10;50699:6:::0;50662:9:::2;:44::i;:::-;50732:28;::::0;643:25:1;;;50741:10:0::2;::::0;50732:28:::2;::::0;631:2:1;616:18;50732:28:0::2;497:177:1::0;31948:138:0;31581:7;31608:12;;;:6;:12;;;;;:22;;;30128:16;30139:4;30128:10;:16::i;:::-;32053:25:::1;32064:4;32070:7;32053:10;:25::i;:::-;;31948:138:::0;;;:::o;33085:251::-;-1:-1:-1;;;;;33179:34:0;;4384:10;33179:34;33175:104;;33237:30;;-1:-1:-1;;;33237:30:0;;;;;;;;;;;33175:104;33291:37;33303:4;33309:18;33291:11;:37::i;:::-;;33085:251;;:::o;46286:86::-;29889:4;30128:16;29889:4;30128:10;:16::i;:::-;46354:10:::1;:8;:10::i;42454:47::-:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47996:419::-;44478:10;44453:36;;;;:24;:36;;;;;;;;44448:64;;44498:14;;-1:-1:-1;;;44498:14:0;;;;;;;;;;;44448:64;48081:13:::1;:15:::0;;::::1;;::::0;:13:::1;:15;::::0;::::1;:::i;:::-;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;48148:13:::1;::::0;::::1;-1:-1:-1::0;48138:24:0;;;:9:::1;:24;::::0;;;;48173:30;;-1:-1:-1;;48173:30:0::1;::::0;;::::1;::::0;;48138:24;-1:-1:-1;;48214:23:0;::::1;:37;48240:11:::0;48214:23;:37:::1;:::i;:::-;-1:-1:-1::0;48262:21:0::1;::::0;::::1;:25:::0;;-1:-1:-1;;48298:28:0;;;48368:13:::1;::::0;48352:55:::1;::::0;48262:25:::1;48368:13:::0;;::::1;::::0;48352:55:::1;::::0;::::1;::::0;48383:11;;48396:10:::1;::::0;48352:55:::1;:::i;:::-;;;;;;;;48070:345;47996:419:::0;:::o;52591:407::-;-1:-1:-1;;;;;52704:17:0;;52657:7;52704:17;;;:11;:17;;;;;;;;52677:44;;;;;;;;;;;;;;-1:-1:-1;;;52677:44:0;;-1:-1:-1;;;;;52677:44:0;;;;;;;;52657:7;52753:29;41530:5;52753:12;:29;:::i;:::-;52732:50;;52855:10;41530:5;52815;:19;;;52807:28;;:45;;;;:::i;:::-;:58;52803:114;;;-1:-1:-1;41467:15:0;;52591:407;-1:-1:-1;;;52591:407:0:o;52803:114::-;52971:18;;;;52944:46;;-1:-1:-1;;;;;52963:27:0;41467:15;52944:46;:::i;:::-;52937:53;52591:407;-1:-1:-1;;;;52591:407:0:o;47393:558::-;37207:21;:19;:21::i;:::-;39380:19:::1;:17;:19::i;:::-;47501:1:::2;47487:11;:15;:34;;;;47520:1;47506:11;:15;47487:34;47483:66;;;47530:19;;-1:-1:-1::0;;;47530:19:0::2;;;;;;;;;;;47483:66;47570:13;47586:23:::0;;;:10:::2;:23;::::0;;;;;;;:29:::2;;::::0;47650:10:::2;14361:18:::0;;;;;;;;;;47586:29;-1:-1:-1;47636:63:0::2;;;47678:21;;-1:-1:-1::0;;;47678:21:0::2;;;;;;;;;;;47636:63;47720:38;47730:10;47742:8;47752:5;47720:9;:38::i;:::-;47783:11;47798:1;47783:16:::0;47779:92:::2;;47841:10;47816:36;::::0;;;:24:::2;:36;::::0;;;;:43;;-1:-1:-1;;47816:43:0::2;47855:4;47816:43;::::0;;47779:92:::2;47896:47;::::0;;8676:25:1;;;8732:2;8717:18;;8710:34;;;47912:10:0::2;::::0;47896:47:::2;::::0;8649:18:1;47896:47:0::2;;;;;;;;47472:479;37251:20:::0;36645:1;37771:7;:22;37588:213;46192:82;29889:4;30128:16;29889:4;30128:10;:16::i;:::-;46258:8:::1;:6;:8::i;48427:434::-:0;44478:10;44453:36;;;;:24;:36;;;;;;;;44448:64;;44498:14;;-1:-1:-1;;;44498:14:0;;;;;;;;;;;44448:64;48498:15:::1;::::0;::::1;::::0;;:45:::1;;-1:-1:-1::0;48530:13:0::1;::::0;::::1;::::0;;::::1;48517:26:::0;;::::1;;48498:45;48494:76;;;48552:18;;-1:-1:-1::0;;;48552:18:0::1;;;;;;;;;;;48494:76;48619:21;::::0;::::1;48591:25;48619:21:::0;;;:9:::1;:21;::::0;;;;;;;48673:10:::1;48655:29:::0;;:17:::1;::::0;::::1;:29:::0;;;;;;;::::1;;48651:56;;;48693:14;;-1:-1:-1::0;;;48693:14:0::1;;;;;;;;;;;48651:56;48746:10;48728:29;::::0;;;:17:::1;::::0;::::1;:29;::::0;;;;:36;;-1:-1:-1;;48728:36:0::1;48760:4;48728:36;::::0;;48775:18:::1;::::0;::::1;:20:::0;;::::1;;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;48830:10;48821:32;;;48842:10;48821:32;;;;;-1:-1:-1::0;;;;;6357:32:1;;;;6339:51;;6327:2;6312:18;;6193:203;30532:138:0;30609:4;30633:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;30633:29:0;;;;;;;;;;;;;;;30532:138::o;13215:95::-;13262:13;13295:7;13288:14;;;;;:::i;48899:940::-;37207:21;:19;:21::i;:::-;39380:19:::1;:17;:19::i;:::-;48981:6:::2;48991:1;48981:11:::0;48977:36:::2;;49001:12;;-1:-1:-1::0;;;49001:12:0::2;;;;;;;;;;;48977:36;49038:10;14334:7:::0;14361:18;;;;;;;;;;;49052:6;-1:-1:-1;49024:64:0::2;;;49067:21;;-1:-1:-1::0;;;49067:21:0::2;;;;;;;;;;;49024:64;49109:44;49119:10;49139:4;49146:6;49109:9;:44::i;:::-;49207:10;49174:23;49200:18:::0;;;:6:::2;:18;::::0;;;;49243:16;;49200:18;;-1:-1:-1;;;;;49243:16:0;;::::2;:21:::0;;49239:426:::2;;49281:45:::0;;-1:-1:-1;;;;;49281:45:0::2;-1:-1:-1::0;;;49310:15:0::2;49281:45;;::::0;;::::2;::::0;;;::::2;::::0;;-1:-1:-1;49341:25:0;::::2;:51:::0;;-1:-1:-1;;49341:51:0::2;::::0;;::::2;::::0;;49239:426:::2;;;49425:21;49449:34;49472:10;49449:22;:34::i;:::-;49425:58:::0;-1:-1:-1;49502:17:0;;49498:90:::2;;49540:32;49546:10;49558:13;49540:5;:32::i;:::-;-1:-1:-1::0;49602:25:0::2;::::0;::::2;:51:::0;;-1:-1:-1;;49602:51:0::2;49637:15;49602:51;;;::::0;;49239:426:::2;49720:16:::0;;49712:34:::2;::::0;49740:6;;-1:-1:-1;;;;;49720:16:0::2;49712:34;:::i;:::-;49685:62:::0;;-1:-1:-1;;;;;;49685:62:0::2;-1:-1:-1::0;;;;;49685:62:0;;;::::2;;::::0;;49758:11:::2;:21:::0;;49773:6;;49758:11;-1:-1:-1;;49758:21:0::2;::::0;49773:6;;49758:21:::2;:::i;:::-;::::0;;;-1:-1:-1;;49805:26:0::2;::::0;643:25:1;;;49812:10:0::2;::::0;49805:26:::2;::::0;631:2:1;616:18;49805:26:0::2;497:177:1::0;14592:182:0;14661:4;4384:10;14717:27;4384:10;14734:2;14738:5;14717:9;:27::i;50780:502::-;37207:21;:19;:21::i;:::-;39380:19:::1;:17;:19::i;:::-;50890:10:::2;50857:23;50883:18:::0;;;:6:::2;:18;::::0;;;;50926:16;;50883:18;;-1:-1:-1;;;;;50926:16:0;;::::2;:21:::0;;50922:49:::2;;50956:15;;-1:-1:-1::0;;;50956:15:0::2;;;;;;;;;;;50922:49;50992:14;51009:34;51032:10;51009:22;:34::i;:::-;50992:51;;51058:6;51068:1;51058:11:::0;51054:36:::2;;51078:12;;-1:-1:-1::0;;;51078:12:0::2;;;;;;;;;;;51054:36;51111:25;51117:10;51129:6;51111:5;:25::i;:::-;51157;::::0;::::2;:51:::0;;-1:-1:-1;;51157:51:0::2;51192:15;51157:51;;;::::0;;51234:40:::2;::::0;643:25:1;;;51255:10:0::2;::::0;51234:40:::2;::::0;631:2:1;616:18;51234:40:0::2;;;;;;;50846:436;;37251:20:::0;36645:1;37771:7;:22;37588:213;37251:20;50780:502::o;53454:373::-;-1:-1:-1;;;;;53619:12:0;;53513:20;53619:12;;;:6;:12;;;;;;;;53594:37;;;;;;;;;-1:-1:-1;;;;;53594:37:0;;;;;;-1:-1:-1;;;53594:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;53513:20;;;;53594:37;53513:20;;53661:73;;53733:1;53661:73;;;53710:19;;;;53684:46;;53702:28;;53684:15;:46;:::i;:::-;53761:16;;53642:92;;-1:-1:-1;;;;;;53753:25:0;53780:28;53803:4;53780:22;:28::i;:::-;53745:74;;;;-1:-1:-1;53810:8:0;;-1:-1:-1;53454:373:0;-1:-1:-1;;;53454:373:0:o;55332:135::-;55386:4;55450:8;55429:17;;55411:15;:35;;;;:::i;:::-;:47;;55403:56;;55332:135;:::o;54903:229::-;54977:4;54998:15;;;;;:45;;-1:-1:-1;55030:13:0;;;;;;55017:26;;;;54998:45;54994:76;;;55052:18;;-1:-1:-1;;;55052:18:0;;;;;;;;;;;54994:76;-1:-1:-1;55088:21:0;;;;;;;:9;:21;;;;;;;;-1:-1:-1;;;;;55088:36:0;;;;:30;;:36;;;;;;;;54903:229;;;;:::o;32379:140::-;31581:7;31608:12;;;:6;:12;;;;;:22;;;30128:16;30139:4;30128:10;:16::i;:::-;32485:26:::1;32497:4;32503:7;32485:11;:26::i;53010:300::-:0;53076:18;53096:13;53140:1;53126:11;:15;:34;;;;53159:1;53145:11;:15;53126:34;53122:66;;;53169:19;;-1:-1:-1;;;53169:19:0;;;;;;;;;;;53122:66;53199:26;53228:23;;;:10;:23;;;;;;53199:52;;;;;;;;;;;;53228:23;;53199:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;53199:52:0;;;-1:-1:-1;;53199:52:0;;;;;;;;;;;53270:14;;53286:15;;;53270:14;;53286:15;;-1:-1:-1;53010:300:0;-1:-1:-1;;;53010:300:0:o;54298:220::-;54366:6;54389:15;;;;;:45;;-1:-1:-1;54421:13:0;;;;;;54408:26;;;;54389:45;54385:76;;;54443:18;;-1:-1:-1;;;54443:18:0;;;;;;;;;;;54385:76;-1:-1:-1;54479:21:0;;;;;;;;:9;:21;;;;;:31;;;;;54298:220::o;51294:487::-;-1:-1:-1;;;;;51406:12:0;;51361:7;51406:12;;;:6;:12;;;;;;;;51381:37;;;;;;;;;-1:-1:-1;;;;;51381:37:0;;;;;;-1:-1:-1;;;51381:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51443:21;;51439:62;;-1:-1:-1;51488:1:0;;51294:487;-1:-1:-1;;51294:487:0:o;51439:62::-;51521:23;51573:9;:25;;;51565:34;;51547:15;:52;;;;:::i;:::-;51521:78;;51620:18;41808:8;51693:6;51672:9;:16;;;-1:-1:-1;;;;;51664:25:0;41619:3;51642:47;;;;:::i;:::-;51641:58;;;;:::i;:::-;:76;;;;:::i;:::-;51620:97;-1:-1:-1;51745:28:0;51758:15;51620:97;51745:28;:::i;:::-;51738:35;51294:487;-1:-1:-1;;;;;51294:487:0:o;54530:361::-;54597:25;54624:16;;54672:15;;;;;:45;;-1:-1:-1;54704:13:0;;;;;;54691:26;;;;54672:45;54668:76;;;54726:18;;-1:-1:-1;;;54726:18:0;;;;;;;;;;;54668:76;54783:21;;;;54755:25;54783:21;;;:9;:21;;;;;54845:18;;;;54823:20;;;54815:68;;54783:21;;54823:20;;54845:18;;;;54865:17;;;;;;54823:20;;54815:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54530:361;;;;;:::o;30885:105::-;30952:30;30963:4;4384:10;30952;:30::i;18852:213::-;-1:-1:-1;;;;;18923:21:0;;18919:93;;18968:32;;-1:-1:-1;;;18968:32:0;;18997:1;18968:32;;;6339:51:1;6312:18;;18968:32:0;;;;;;;;18919:93;19022:35;19038:1;19042:7;19051:5;19022:7;:35::i;:::-;18852:213;;:::o;19393:211::-;-1:-1:-1;;;;;19464:21:0;;19460:91;;19509:30;;-1:-1:-1;;;19509:30:0;;19536:1;19509:30;;;6339:51:1;6312:18;;19509:30:0;6193:203:1;19460:91:0;19561:35;19569:7;19586:1;19590:5;19561:7;:35::i;20157:130::-;20242:37;20251:5;20258:7;20267:5;20274:4;20242:8;:37::i;37287:293::-;36689:1;37421:7;;:19;37413:63;;;;-1:-1:-1;;;37413:63:0;;12483:2:1;37413:63:0;;;12465:21:1;12522:2;12502:18;;;12495:30;12561:33;12541:18;;;12534:61;12612:18;;37413:63:0;12281:355:1;37413:63:0;36689:1;37554:7;:18;37287:293::o;39934:108::-;39846:7;;;;40004:9;39996:38;;;;-1:-1:-1;;;39996:38:0;;12843:2:1;39996:38:0;;;12825:21:1;12882:2;12862:18;;;12855:30;-1:-1:-1;;;12901:18:1;;;12894:46;12957:18;;39996:38:0;12641:340:1;16732:308:0;-1:-1:-1;;;;;16816:18:0;;16812:88;;16858:30;;-1:-1:-1;;;16858:30:0;;16885:1;16858:30;;;6339:51:1;6312:18;;16858:30:0;6193:203:1;16812:88:0;-1:-1:-1;;;;;16914:16:0;;16910:88;;16954:32;;-1:-1:-1;;;16954:32:0;;16983:1;16954:32;;;6339:51:1;6312:18;;16954:32:0;6193:203:1;16910:88:0;17008:24;17016:4;17022:2;17026:5;17008:7;:24::i;21889:486::-;-1:-1:-1;;;;;14944:18:0;;;21989:24;14944:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;22056:36:0;;22052:316;;;22132:5;22113:16;:24;22109:132;;;22165:60;;-1:-1:-1;;;22165:60:0;;-1:-1:-1;;;;;13206:32:1;;22165:60:0;;;13188:51:1;13255:18;;;13248:34;;;13298:18;;;13291:34;;;13161:18;;22165:60:0;12986:345:1;22109:132:0;22284:57;22293:5;22300:7;22328:5;22309:16;:24;22335:5;22284:8;:57::i;33962:324::-;34039:4;34061:22;34069:4;34075:7;34061;:22::i;:::-;34056:223;;34100:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;34100:29:0;;;;;;;;;:36;;-1:-1:-1;;34100:36:0;34132:4;34100:36;;;34183:12;4384:10;;4304:98;34183:12;-1:-1:-1;;;;;34156:40:0;34174:7;-1:-1:-1;;;;;34156:40:0;34168:4;34156:40;;;;;;;;;;-1:-1:-1;34218:4:0;34211:11;;34056:223;-1:-1:-1;34262:5:0;34255:12;;34530:325;34608:4;34629:22;34637:4;34643:7;34629;:22::i;:::-;34625:223;;;34700:5;34668:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;34668:29:0;;;;;;;;;;:37;;-1:-1:-1;;34668:37:0;;;34725:40;4384:10;;34668:12;;34725:40;;34700:5;34725:40;-1:-1:-1;34787:4:0;34780:11;;40630:120;39639:16;:14;:16::i;:::-;40689:7:::1;:15:::0;;-1:-1:-1;;40689:15:0::1;::::0;;40720:22:::1;4384:10:::0;40729:12:::1;40720:22;::::0;-1:-1:-1;;;;;6357:32:1;;;6339:51;;6327:2;6312:18;40720:22:0::1;;;;;;;40630:120::o:0;40371:118::-;39380:19;:17;:19::i;:::-;40431:7:::1;:14:::0;;-1:-1:-1;;40431:14:0::1;40441:4;40431:14;::::0;;40461:20:::1;40468:12;4384:10:::0;;4304:98;31126:201;31215:22;31223:4;31229:7;31215;:22::i;:::-;31210:110;;31261:47;;-1:-1:-1;;;31261:47:0;;-1:-1:-1;;;;;8947:32:1;;31261:47:0;;;8929:51:1;8996:18;;;8989:34;;;8902:18;;31261:47:0;8755:274:1;17364:1135:0;-1:-1:-1;;;;;17454:18:0;;17450:552;;17608:5;17592:12;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;17450:552:0;;-1:-1:-1;17450:552:0;;-1:-1:-1;;;;;17668:15:0;;17646:19;17668:15;;;;;;;;;;;17702:19;;;17698:117;;;17749:50;;-1:-1:-1;;;17749:50:0;;-1:-1:-1;;;;;13206:32:1;;17749:50:0;;;13188:51:1;13255:18;;;13248:34;;;13298:18;;;13291:34;;;13161:18;;17749:50:0;12986:345:1;17698:117:0;-1:-1:-1;;;;;17938:15:0;;:9;:15;;;;;;;;;;17956:19;;;;17938:37;;17450:552;-1:-1:-1;;;;;18018:16:0;;18014:435;;18184:12;:21;;;;;;;18014:435;;;-1:-1:-1;;;;;18400:13:0;;:9;:13;;;;;;;;;;:22;;;;;;18014:435;18481:2;-1:-1:-1;;;;;18466:25:0;18475:4;-1:-1:-1;;;;;18466:25:0;;18485:5;18466:25;;;;643::1;;631:2;616:18;;497:177;18466:25:0;;;;;;;;17364:1135;;;:::o;21154:443::-;-1:-1:-1;;;;;21267:19:0;;21263:91;;21310:32;;-1:-1:-1;;;21310:32:0;;21339:1;21310:32;;;6339:51:1;6312:18;;21310:32:0;6193:203:1;21263:91:0;-1:-1:-1;;;;;21368:21:0;;21364:92;;21413:31;;-1:-1:-1;;;21413:31:0;;21441:1;21413:31;;;6339:51:1;6312:18;;21413:31:0;6193:203:1;21364:92:0;-1:-1:-1;;;;;21466:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;:35;;;21512:78;;;;21563:7;-1:-1:-1;;;;;21547:31:0;21556:5;-1:-1:-1;;;;;21547:31:0;;21572:5;21547:31;;;;643:25:1;;631:2;616:18;;497:177;21547:31:0;;;;;;;;21154:443;;;;:::o;40119:108::-;39846:7;;;;40178:41;;;;-1:-1:-1;;;40178:41:0;;13817:2:1;40178:41:0;;;13799:21:1;13856:2;13836:18;;;13829:30;-1:-1:-1;;;13875:18:1;;;13868:50;13935:18;;40178:41:0;13615:344:1;14:286;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:1;;209:43;;199:71;;266:1;263;256:12;199:71;289:5;14:286;-1:-1:-1;;;14:286:1:o;679:173::-;747:20;;-1:-1:-1;;;;;796:31:1;;786:42;;776:70;;842:1;839;832:12;776:70;679:173;;;:::o;857:254::-;925:6;933;986:2;974:9;965:7;961:23;957:32;954:52;;;1002:1;999;992:12;954:52;1025:29;1044:9;1025:29;:::i;:::-;1015:39;1101:2;1086:18;;;;1073:32;;-1:-1:-1;;;857:254:1:o;1116:423::-;1158:3;1196:5;1190:12;1223:6;1218:3;1211:19;1248:1;1258:162;1272:6;1269:1;1266:13;1258:162;;;1334:4;1390:13;;;1386:22;;1380:29;1362:11;;;1358:20;;1351:59;1287:12;1258:162;;;1262:3;1465:1;1458:4;1449:6;1444:3;1440:16;1436:27;1429:38;1528:4;1521:2;1517:7;1512:2;1504:6;1500:15;1496:29;1491:3;1487:39;1483:50;1476:57;;;1116:423;;;;:::o;1544:220::-;1693:2;1682:9;1675:21;1656:4;1713:45;1754:2;1743:9;1739:18;1731:6;1713:45;:::i;1769:180::-;1828:6;1881:2;1869:9;1860:7;1856:23;1852:32;1849:52;;;1897:1;1894;1887:12;1849:52;-1:-1:-1;1920:23:1;;1769:180;-1:-1:-1;1769:180:1:o;1954:186::-;2013:6;2066:2;2054:9;2045:7;2041:23;2037:32;2034:52;;;2082:1;2079;2072:12;2034:52;2105:29;2124:9;2105:29;:::i;2840:328::-;2917:6;2925;2933;2986:2;2974:9;2965:7;2961:23;2957:32;2954:52;;;3002:1;2999;2992:12;2954:52;3025:29;3044:9;3025:29;:::i;:::-;3015:39;;3073:38;3107:2;3096:9;3092:18;3073:38;:::i;:::-;3063:48;;3158:2;3147:9;3143:18;3130:32;3120:42;;2840:328;;;;;:::o;3540:163::-;3607:20;;3667:10;3656:22;;3646:33;;3636:61;;3693:1;3690;3683:12;3708:184;3766:6;3819:2;3807:9;3798:7;3794:23;3790:32;3787:52;;;3835:1;3832;3825:12;3787:52;3858:28;3876:9;3858:28;:::i;3897:488::-;4083:4;4112:10;4161:2;4153:6;4149:15;4138:9;4131:34;4201:3;4196:2;4185:9;4181:18;4174:31;4222:46;4263:3;4252:9;4248:19;4240:6;4222:46;:::i;:::-;4304:15;;4299:2;4284:18;;4277:43;-1:-1:-1;4363:14:1;;4356:22;4351:2;4336:18;;;4329:50;4214:54;3897:488;-1:-1:-1;;3897:488:1:o;4390:254::-;4458:6;4466;4519:2;4507:9;4498:7;4494:23;4490:32;4487:52;;;4535:1;4532;4525:12;4487:52;4571:9;4558:23;4548:33;;4600:38;4634:2;4623:9;4619:18;4600:38;:::i;:::-;4590:48;;4390:254;;;;;:::o;4838:291::-;5015:2;5004:9;4997:21;4978:4;5035:45;5076:2;5065:9;5061:18;5053:6;5035:45;:::i;:::-;5027:53;;5116:6;5111:2;5100:9;5096:18;5089:34;4838:291;;;;;:::o;5134:127::-;5195:10;5190:3;5186:20;5183:1;5176:31;5226:4;5223:1;5216:15;5250:4;5247:1;5240:15;5266:922;5335:6;5388:2;5376:9;5367:7;5363:23;5359:32;5356:52;;;5404:1;5401;5394:12;5356:52;5444:9;5431:23;5473:18;5514:2;5506:6;5503:14;5500:34;;;5530:1;5527;5520:12;5500:34;5568:6;5557:9;5553:22;5543:32;;5613:7;5606:4;5602:2;5598:13;5594:27;5584:55;;5635:1;5632;5625:12;5584:55;5671:2;5658:16;5693:2;5689;5686:10;5683:36;;;5699:18;;:::i;:::-;5774:2;5768:9;5742:2;5828:13;;-1:-1:-1;;5824:22:1;;;5848:2;5820:31;5816:40;5804:53;;;5872:18;;;5892:22;;;5869:46;5866:72;;;5918:18;;:::i;:::-;5958:10;5954:2;5947:22;5993:2;5985:6;5978:18;6033:7;6028:2;6023;6019;6015:11;6011:20;6008:33;6005:53;;;6054:1;6051;6044:12;6005:53;6110:2;6105;6101;6097:11;6092:2;6084:6;6080:15;6067:46;6155:1;6133:15;;;6150:2;6129:24;6122:35;;;;-1:-1:-1;6137:6:1;5266:922;-1:-1:-1;;;;;5266:922:1:o;6922:258::-;6989:6;6997;7050:2;7038:9;7029:7;7025:23;7021:32;7018:52;;;7066:1;7063;7056:12;7018:52;7089:28;7107:9;7089:28;:::i;:::-;7079:38;;7136;7170:2;7159:9;7155:18;7136:38;:::i;7185:260::-;7253:6;7261;7314:2;7302:9;7293:7;7289:23;7285:32;7282:52;;;7330:1;7327;7320:12;7282:52;7353:29;7372:9;7353:29;:::i;7450:387::-;7647:2;7636:9;7629:21;7610:4;7667:45;7708:2;7697:9;7693:18;7685:6;7667:45;:::i;:::-;7760:10;7748:23;;;;7743:2;7728:18;;7721:51;-1:-1:-1;7815:14:1;;7808:22;7803:2;7788:18;;;7781:50;7659:53;7450:387;-1:-1:-1;7450:387:1:o;7842:127::-;7903:10;7898:3;7894:20;7891:1;7884:31;7934:4;7931:1;7924:15;7958:4;7955:1;7948:15;7974:128;8041:9;;;8062:11;;;8059:37;;;8076:18;;:::i;8107:168::-;8180:9;;;8211;;8228:15;;;8222:22;;8208:37;8198:71;;8249:18;;:::i;8280:217::-;8320:1;8346;8336:132;;8390:10;8385:3;8381:20;8378:1;8371:31;8425:4;8422:1;8415:15;8453:4;8450:1;8443:15;8336:132;-1:-1:-1;8482:9:1;;8280:217::o;9034:380::-;9113:1;9109:12;;;;9156;;;9177:61;;9231:4;9223:6;9219:17;9209:27;;9177:61;9284:2;9276:6;9273:14;9253:18;9250:38;9247:161;;9330:10;9325:3;9321:20;9318:1;9311:31;9365:4;9362:1;9355:15;9393:4;9390:1;9383:15;9247:161;;9034:380;;;:::o;9419:125::-;9484:9;;;9505:10;;;9502:36;;;9518:18;;:::i;9549:201::-;9587:3;9615:10;9660:2;9653:5;9649:14;9687:2;9678:7;9675:15;9672:41;;9693:18;;:::i;:::-;9742:1;9729:15;;9549:201;-1:-1:-1;;;9549:201:1:o;9881:545::-;9983:2;9978:3;9975:11;9972:448;;;10019:1;10044:5;10040:2;10033:17;10089:4;10085:2;10075:19;10159:2;10147:10;10143:19;10140:1;10136:27;10130:4;10126:38;10195:4;10183:10;10180:20;10177:47;;;-1:-1:-1;10218:4:1;10177:47;10273:2;10268:3;10264:12;10261:1;10257:20;10251:4;10247:31;10237:41;;10328:82;10346:2;10339:5;10336:13;10328:82;;;10391:17;;;10372:1;10361:13;10328:82;;;10332:3;;;9881:545;;;:::o;10602:1352::-;10728:3;10722:10;10755:18;10747:6;10744:30;10741:56;;;10777:18;;:::i;:::-;10806:97;10896:6;10856:38;10888:4;10882:11;10856:38;:::i;:::-;10850:4;10806:97;:::i;:::-;10958:4;;11022:2;11011:14;;11039:1;11034:663;;;;11741:1;11758:6;11755:89;;;-1:-1:-1;11810:19:1;;;11804:26;11755:89;-1:-1:-1;;10559:1:1;10555:11;;;10551:24;10547:29;10537:40;10583:1;10579:11;;;10534:57;11857:81;;11004:944;;11034:663;9828:1;9821:14;;;9865:4;9852:18;;-1:-1:-1;;11070:20:1;;;11188:236;11202:7;11199:1;11196:14;11188:236;;;11291:19;;;11285:26;11270:42;;11383:27;;;;11351:1;11339:14;;;;11218:19;;11188:236;;;11192:3;11452:6;11443:7;11440:19;11437:201;;;11513:19;;;11507:26;-1:-1:-1;;11596:1:1;11592:14;;;11608:3;11588:24;11584:37;11580:42;11565:58;11550:74;;11437:201;-1:-1:-1;;;;;11684:1:1;11668:14;;;11664:22;11651:36;;-1:-1:-1;10602:1352:1:o;11959:317::-;12136:2;12125:9;12118:21;12099:4;12156:45;12197:2;12186:9;12182:18;12174:6;12156:45;:::i;:::-;12148:53;;12266:1;12262;12257:3;12253:11;12249:19;12241:6;12237:32;12232:2;12221:9;12217:18;12210:60;11959:317;;;;;:::o

Swarm Source

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