BNB Price: $615.43 (+3.06%)
 

Overview

Max Total Supply

41,998,668,655,977.2342TOCO (CSupply: 41,998,668,558,977.2342)

Holders

12,405 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
277,324.94 TOCO

Value
$0.00
0x063789e9daceae44996d1326a581611e19c20a77
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

TOCO Coin is a meme-inspired cryptocurrency combining fun and purpose. Designed with a transparent tokenomics model, it supports environmental initiatives through transaction taxes, dynamic burning, and staking rewards, aiming to promote sustainability and community-driven growth.


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

Contract Source Code Verified (Exact Match)

Contract Name:
TOCO

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

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

// 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.1.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/Ownable.sol


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

pragma solidity ^0.8.20;


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

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

// File: contracts/TOCO.sol


pragma solidity ^0.8.0;



contract TOCO is ERC20, Ownable {
    // Global variables for fees collection
    uint256 public charityBalance;
    uint256 public projectBalance;
    uint256 public rewardsBalance;
    uint256 public totalBurned;

    // Fee percentages (modifiable by owner)
    uint256 public charityFeePercent = 10; // Default: 1%
    uint256 public projectFeePercent = 5;  // Default: 0.5%
    uint256 public rewardsFeePercent = 10; // Default: 1%

    // Dynamic burn threshold
    uint256 public constant BURN_STOP_THRESHOLD = 5 * 10 ** 30; // 5 trillion
    uint256 public constant BURN_REDUCE_THRESHOLD_1 = 10 * 10 ** 30; // 10 trillion
    uint256 public constant BURN_REDUCE_THRESHOLD_2 = 21 * 10 ** 30; // 21 trillion

    // Mapping for staked balances
    mapping(address => uint256) public stakedBalances;

    // Mapping for tax exemption
    mapping(address => bool) private _isTaxExempt;

    constructor() ERC20("TOCO", "TOCO") Ownable(msg.sender) {
        _mint(msg.sender, 42 * 10 ** 30); // 42 trillion initial supply
    }

    function setFeePercentages(uint256 _charityFee, uint256 _projectFee, uint256 _rewardsFee) external onlyOwner {
        require(_charityFee + _projectFee + _rewardsFee < 500, "Total fee percentage exceeds 50%");
        charityFeePercent = _charityFee;
        projectFeePercent = _projectFee;
        rewardsFeePercent = _rewardsFee;
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        if (_isTaxExempt[msg.sender] || _isTaxExempt[recipient]) {
            return super.transfer(recipient, amount);
        }

        uint256 feeCharity = (amount * charityFeePercent) / 1000;
        uint256 feeProject = (amount * projectFeePercent) / 1000;
        uint256 feeRewards = (amount * rewardsFeePercent) / 1000;

        uint256 feeBurn = calculateBurnFee(amount);

        uint256 totalFees = feeCharity + feeProject + feeRewards + feeBurn;
        uint256 transferAmount = amount - totalFees;

        require(balanceOf(msg.sender) >= amount, "Insufficient balance");

        // Update balances for fees
        charityBalance += feeCharity;
        projectBalance += feeProject;
        rewardsBalance += feeRewards;

        // Burn tokens
        if (feeBurn > 0) {
            _burn(msg.sender, feeBurn);
            totalBurned += feeBurn;
        }
        // Charity  Project Rewards  transfer
        if (totalFees > feeBurn) {
            super.transfer(address(this), totalFees - feeBurn);
        }
        // Perform transfer
        return super.transfer(recipient, transferAmount);
    }

    function calculateBurnFee(uint256 amount) internal view returns (uint256) {
        uint256 totalSupplyAmount = totalSupply();
        if (totalSupplyAmount > BURN_REDUCE_THRESHOLD_2) {
            return (amount * 5) / 1000; // 0.5%
        } else if (totalSupplyAmount > BURN_REDUCE_THRESHOLD_1) {
            return (amount * 25) / 10000; // 0.25%
        } else if (totalSupplyAmount > BURN_STOP_THRESHOLD) {
            return (amount * 10) / 10000; // 0.1%
        }
        return 0; // No burn
    }

    function withdrawFees(address recipient, uint256 amount, uint8 accountType) external onlyOwner {
        require(accountType >= 1 && accountType <= 3, "Invalid account type");
        if (accountType == 1) {
            require(charityBalance >= amount, "Insufficient charity balance");
            charityBalance -= amount;
            _transfer(address(this), recipient, amount);
        } else if (accountType == 2) {
            require(projectBalance >= amount, "Insufficient project balance");
            projectBalance -= amount;
            _transfer(address(this), recipient, amount);
        } else if (accountType == 3) {
            require(rewardsBalance >= amount, "Insufficient rewards balance");
            rewardsBalance -= amount;
            _transfer(address(this), recipient, amount);
        }
    }

    function stake(uint256 amount) external {
        require(balanceOf(msg.sender) >= amount, "Insufficient balance to stake");
        _transfer(msg.sender, address(this), amount);
        stakedBalances[msg.sender] += amount;
    }

    function unstake(uint256 amount) external {
        require(stakedBalances[msg.sender] >= amount, "Insufficient staked balance to unstake");
        stakedBalances[msg.sender] -= amount;
        _transfer(address(this), msg.sender, amount);
    }

    function getStakedBalance(address account) external view returns (uint256) {
        return stakedBalances[account];
    }

    // Allowance-based transfer functionality
    function approve(address spender, uint256 amount) public override returns (bool) {
        return super.approve(spender, amount);
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return super.allowance(owner, spender);
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        if (_isTaxExempt[sender] || _isTaxExempt[recipient]) {
            return super.transferFrom(sender, recipient, amount);
        }

        uint256 feeCharity = (amount * charityFeePercent) / 1000;
        uint256 feeProject = (amount * projectFeePercent) / 1000;
        uint256 feeRewards = (amount * rewardsFeePercent) / 1000;

        uint256 feeBurn = calculateBurnFee(amount);

        uint256 totalFees = feeCharity + feeProject + feeRewards + feeBurn;
        uint256 transferAmount = amount - totalFees;

        require(balanceOf(sender) >= amount, "Insufficient balance");

        // Update balances for fees
        charityBalance += feeCharity;
        projectBalance += feeProject;
        rewardsBalance += feeRewards;

        // Burn tokens
        if (feeBurn > 0) {
            _burn(sender, feeBurn);
            totalBurned += feeBurn;
        }
        // Charity  Project Rewards  transfer
        if (totalFees > feeBurn) {
            super._transfer(sender, address(this), totalFees - feeBurn);
        }

        // Perform transfer from sender to recipient
        super.transferFrom(sender, recipient, transferAmount);

        // Adjust spender's allowance
        uint256 currentAllowance = allowance(sender, msg.sender);
        require(currentAllowance >= amount, "Transfer amount exceeds allowance");
        _approve(sender, msg.sender, currentAllowance - amount);

        return true;
    }

    // Add or remove tax exemption for an address
    function setTaxExempt(address account, bool exempt) external onlyOwner {
        _isTaxExempt[account] = exempt;
    }

    // Check if an address is tax-exempt
    function isTaxExempt(address account) external view returns (bool) {
        return _isTaxExempt[account];
    }

    // Permanently renounce ownership to increase trust
    function renounceOwnershipPermanently() external onlyOwner {
        transferOwnership(address(0));
    }

    // Query functions
    function getCharityBalance() external view returns (uint256) {
        return charityBalance;
    }

    function getProjectBalance() external view returns (uint256) {
        return projectBalance;
    }

    function getRewardsBalance() external view returns (uint256) {
        return rewardsBalance;
    }

    function getTotalBurned() external view returns (uint256) {
        return totalBurned;
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[],"name":"BURN_REDUCE_THRESHOLD_1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_REDUCE_THRESHOLD_2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BURN_STOP_THRESHOLD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"amount","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":[],"name":"charityBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCharityBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProjectBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getStakedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isTaxExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnershipPermanently","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_charityFee","type":"uint256"},{"internalType":"uint256","name":"_projectFee","type":"uint256"},{"internalType":"uint256","name":"_rewardsFee","type":"uint256"}],"name":"setFeePercentages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setTaxExempt","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":"stakedBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"accountType","type":"uint8"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a80556005600b55600a600c5534801561001d575f80fd5b50336040518060400160405280600481526020017f544f434f000000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f544f434f00000000000000000000000000000000000000000000000000000000815250816003908161009a91906106eb565b5080600490816100aa91906106eb565b5050505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361011d575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161011491906107f9565b60405180910390fd5b61012c8161015060201b60201c565b5061014b336d02121d51ba2b8f2f086e8000000061021360201b60201c565b6108cf565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610283575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161027a91906107f9565b60405180910390fd5b6102945f838361029860201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036102e8578060025f8282546102dc919061083f565b925050819055506103b6565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610371578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161036893929190610881565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036103fd578060025f8282540392505081905550610447565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516104a491906108b6565b60405180910390a3505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061052c57607f821691505b60208210810361053f5761053e6104e8565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026105a17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610566565b6105ab8683610566565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6105ef6105ea6105e5846105c3565b6105cc565b6105c3565b9050919050565b5f819050919050565b610608836105d5565b61061c610614826105f6565b848454610572565b825550505050565b5f90565b610630610624565b61063b8184846105ff565b505050565b5b8181101561065e576106535f82610628565b600181019050610641565b5050565b601f8211156106a35761067481610545565b61067d84610557565b8101602085101561068c578190505b6106a061069885610557565b830182610640565b50505b505050565b5f82821c905092915050565b5f6106c35f19846008026106a8565b1980831691505092915050565b5f6106db83836106b4565b9150826002028217905092915050565b6106f4826104b1565b67ffffffffffffffff81111561070d5761070c6104bb565b5b6107178254610515565b610722828285610662565b5f60209050601f831160018114610753575f8415610741578287015190505b61074b85826106d0565b8655506107b2565b601f19841661076186610545565b5f5b8281101561078857848901518255600182019150602085019450602081019050610763565b868310156107a557848901516107a1601f8916826106b4565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6107e3826107ba565b9050919050565b6107f3816107d9565b82525050565b5f60208201905061080c5f8301846107ea565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610849826105c3565b9150610854836105c3565b925082820190508082111561086c5761086b610812565b5b92915050565b61087b816105c3565b82525050565b5f6060820190506108945f8301866107ea565b6108a16020830185610872565b6108ae6040830184610872565b949350505050565b5f6020820190506108c95f830184610872565b92915050565b61265f806108dc5f395ff3fe608060405234801561000f575f80fd5b506004361061020f575f3560e01c806370a0823111610123578063a9059cbb116100ab578063d89135cd1161007a578063d89135cd146105e3578063dd62ed3e14610601578063e1593ffb14610631578063f2fde38b1461064f578063f5d7abb31461066b5761020f565b8063a9059cbb1461055b578063b4b081df1461058b578063b55cd04b146105a7578063d840fd06146105c55761020f565b80638da5cb5b116100f25780638da5cb5b146104c757806395d89b41146104e557806399b8a3f0146105035780639a274fff14610521578063a694fc3a1461053f5761020f565b806370a0823114610451578063715018a614610481578063858a135d1461048b57806387c0365e146104a95761020f565b80632e17de78116101a65780633a02a42d116101755780633a02a42d146103ab5780633b540996146103db57806344b7eda1146103f957806368b323df146104175780636c597aff146104355761020f565b80632e17de7814610349578063313ce56714610365578063333006dd1461038357806334d2c0a3146103a15761020f565b806316c2be6b116101e257806316c2be6b146102af57806318160ddd146102df5780631dc61040146102fd57806323b872dd146103195761020f565b806306fdde0314610213578063095ea7b314610231578063131f2e53146102615780631460fa871461027f575b5f80fd5b61021b610689565b6040516102289190611cb6565b60405180910390f35b61024b60048036038101906102469190611d67565b610719565b6040516102589190611dbf565b60405180910390f35b61026961072c565b6040516102769190611de7565b60405180910390f35b61029960048036038101906102949190611e00565b610732565b6040516102a69190611de7565b60405180910390f35b6102c960048036038101906102c49190611e00565b610747565b6040516102d69190611dbf565b60405180910390f35b6102e7610799565b6040516102f49190611de7565b60405180910390f35b61031760048036038101906103129190611e55565b6107a2565b005b610333600480360381019061032e9190611e93565b610802565b6040516103409190611dbf565b60405180910390f35b610363600480360381019061035e9190611ee3565b610ab1565b005b61036d610b92565b60405161037a9190611f29565b60405180910390f35b61038b610b9a565b6040516103989190611de7565b60405180910390f35b6103a9610ba0565b005b6103c560048036038101906103c09190611e00565b610bb3565b6040516103d29190611de7565b60405180910390f35b6103e3610bf9565b6040516103f09190611de7565b60405180910390f35b610401610bff565b60405161040e9190611de7565b60405180910390f35b61041f610c08565b60405161042c9190611de7565b60405180910390f35b61044f600480360381019061044a9190611f6c565b610c0e565b005b61046b60048036038101906104669190611e00565b610dd8565b6040516104789190611de7565b60405180910390f35b610489610e1d565b005b610493610e30565b6040516104a09190611de7565b60405180910390f35b6104b1610e39565b6040516104be9190611de7565b60405180910390f35b6104cf610e4a565b6040516104dc9190611fcb565b60405180910390f35b6104ed610e72565b6040516104fa9190611cb6565b60405180910390f35b61050b610f02565b6040516105189190611de7565b60405180910390f35b610529610f08565b6040516105369190611de7565b60405180910390f35b61055960048036038101906105549190611ee3565b610f11565b005b61057560048036038101906105709190611d67565b610fbd565b6040516105829190611dbf565b60405180910390f35b6105a560048036038101906105a09190611fe4565b6111ff565b005b6105af61127b565b6040516105bc9190611de7565b60405180910390f35b6105cd611284565b6040516105da9190611de7565b60405180910390f35b6105eb61128a565b6040516105f89190611de7565b60405180910390f35b61061b60048036038101906106169190612034565b611290565b6040516106289190611de7565b60405180910390f35b6106396112a3565b6040516106469190611de7565b60405180910390f35b61066960048036038101906106649190611e00565b6112b5565b005b610673611339565b6040516106809190611de7565b60405180910390f35b6060600380546106989061209f565b80601f01602080910402602001604051908101604052809291908181526020018280546106c49061209f565b801561070f5780601f106106e65761010080835404028352916020019161070f565b820191905f5260205f20905b8154815290600101906020018083116106f257829003601f168201915b5050505050905090565b5f610724838361134a565b905092915050565b60085481565b600d602052805f5260405f205f915090505481565b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f600254905090565b6107aa61136c565b80600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168061089e5750600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156108b5576108ae8484846113f3565b9050610aaa565b5f6103e8600a54846108c791906120fc565b6108d1919061216a565b90505f6103e8600b54856108e591906120fc565b6108ef919061216a565b90505f6103e8600c548661090391906120fc565b61090d919061216a565b90505f61091986611421565b90505f8183858761092a919061219a565b610934919061219a565b61093e919061219a565b90505f818861094d91906121cd565b9050876109598b610dd8565b101561099a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109919061224a565b60405180910390fd5b8560065f8282546109ab919061219a565b925050819055508460075f8282546109c3919061219a565b925050819055508360085f8282546109db919061219a565b925050819055505f831115610a0d576109f48a846114dd565b8260095f828254610a05919061219a565b925050819055505b82821115610a2c57610a2b8a308585610a2691906121cd565b61155c565b5b610a378a8a836113f3565b505f610a438b33611290565b905088811015610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f906122d8565b60405180910390fd5b610a9e8b338b84610a9991906121cd565b61164c565b60019750505050505050505b9392505050565b80600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890612366565b60405180910390fd5b80600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610b7d91906121cd565b92505081905550610b8f30338361155c565b50565b5f6012905090565b600c5481565b610ba861136c565b610bb15f6112b5565b565b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b600a5481565b5f600654905090565b600b5481565b610c1661136c565b60018160ff1610158015610c2e575060038160ff1611155b610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c64906123ce565b60405180910390fd5b60018160ff1603610ce557816006541015610cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb490612436565b60405180910390fd5b8160065f828254610cce91906121cd565b92505081905550610ce030848461155c565b610dd3565b60028160ff1603610d5d57816007541015610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c9061249e565b60405180910390fd5b8160075f828254610d4691906121cd565b92505081905550610d5830848461155c565b610dd2565b60038160ff1603610dd157816008541015610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da490612506565b60405180910390fd5b8160085f828254610dbe91906121cd565b92505081905550610dd030848461155c565b5b5b5b505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610e2561136c565b610e2e5f61165e565b565b5f600854905090565b6c7e37be2022c0914b268000000081565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e819061209f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ead9061209f565b8015610ef85780601f10610ecf57610100808354040283529160200191610ef8565b820191905f5260205f20905b815481529060010190602001808311610edb57829003601f168201915b5050505050905090565b60065481565b5f600754905090565b80610f1b33610dd8565b1015610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f539061256e565b60405180910390fd5b610f6733308361155c565b80600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610fb3919061219a565b9250508190555050565b5f600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806110595750600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b1561106f576110688383611721565b90506111f9565b5f6103e8600a548461108191906120fc565b61108b919061216a565b90505f6103e8600b548561109f91906120fc565b6110a9919061216a565b90505f6103e8600c54866110bd91906120fc565b6110c7919061216a565b90505f6110d386611421565b90505f818385876110e4919061219a565b6110ee919061219a565b6110f8919061219a565b90505f818861110791906121cd565b90508761111333610dd8565b1015611154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114b9061224a565b60405180910390fd5b8560065f828254611165919061219a565b925050819055508460075f82825461117d919061219a565b925050819055508360085f828254611195919061219a565b925050819055505f8311156111c7576111ae33846114dd565b8260095f8282546111bf919061219a565b925050819055505b828211156111e6576111e43084846111df91906121cd565b611721565b505b6111f08982611721565b96505050505050505b92915050565b61120761136c565b6101f4818385611217919061219a565b611221919061219a565b10611261576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611258906125d6565b60405180910390fd5b82600a8190555081600b8190555080600c81905550505050565b5f600954905090565b60075481565b60095481565b5f61129b8383611743565b905092915050565b6d01090ea8dd15c79784374000000081565b6112bd61136c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361132d575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016113249190611fcb565b60405180910390fd5b6113368161165e565b50565b6c3f1bdf10116048a5934000000081565b5f806113546117c5565b905061136181858561164c565b600191505092915050565b6113746117c5565b73ffffffffffffffffffffffffffffffffffffffff16611392610e4a565b73ffffffffffffffffffffffffffffffffffffffff16146113f1576113b56117c5565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016113e89190611fcb565b60405180910390fd5b565b5f806113fd6117c5565b905061140a8582856117cc565b61141585858561155c565b60019150509392505050565b5f8061142b610799565b90506d01090ea8dd15c797843740000000811115611465576103e860058461145391906120fc565b61145d919061216a565b9150506114d8565b6c7e37be2022c0914b268000000081111561149c5761271060198461148a91906120fc565b611494919061216a565b9150506114d8565b6c3f1bdf10116048a593400000008111156114d357612710600a846114c191906120fc565b6114cb919061216a565b9150506114d8565b5f9150505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361154d575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016115449190611fcb565b60405180910390fd5b611558825f8361185e565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115cc575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016115c39190611fcb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361163c575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016116339190611fcb565b60405180910390fd5b61164783838361185e565b505050565b6116598383836001611a77565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f8061172b6117c5565b905061173881858561155c565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b5f6117d78484611290565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118585781811015611849578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611840939291906125f4565b60405180910390fd5b61185784848484035f611a77565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118ae578060025f8282546118a2919061219a565b9250508190555061197c565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611937578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161192e939291906125f4565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119c3578060025f8282540392505081905550611a0d565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a6a9190611de7565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ae7575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611ade9190611fcb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b57575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611b4e9190611fcb565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611c40578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611c379190611de7565b60405180910390a35b50505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611c8882611c46565b611c928185611c50565b9350611ca2818560208601611c60565b611cab81611c6e565b840191505092915050565b5f6020820190508181035f830152611cce8184611c7e565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611d0382611cda565b9050919050565b611d1381611cf9565b8114611d1d575f80fd5b50565b5f81359050611d2e81611d0a565b92915050565b5f819050919050565b611d4681611d34565b8114611d50575f80fd5b50565b5f81359050611d6181611d3d565b92915050565b5f8060408385031215611d7d57611d7c611cd6565b5b5f611d8a85828601611d20565b9250506020611d9b85828601611d53565b9150509250929050565b5f8115159050919050565b611db981611da5565b82525050565b5f602082019050611dd25f830184611db0565b92915050565b611de181611d34565b82525050565b5f602082019050611dfa5f830184611dd8565b92915050565b5f60208284031215611e1557611e14611cd6565b5b5f611e2284828501611d20565b91505092915050565b611e3481611da5565b8114611e3e575f80fd5b50565b5f81359050611e4f81611e2b565b92915050565b5f8060408385031215611e6b57611e6a611cd6565b5b5f611e7885828601611d20565b9250506020611e8985828601611e41565b9150509250929050565b5f805f60608486031215611eaa57611ea9611cd6565b5b5f611eb786828701611d20565b9350506020611ec886828701611d20565b9250506040611ed986828701611d53565b9150509250925092565b5f60208284031215611ef857611ef7611cd6565b5b5f611f0584828501611d53565b91505092915050565b5f60ff82169050919050565b611f2381611f0e565b82525050565b5f602082019050611f3c5f830184611f1a565b92915050565b611f4b81611f0e565b8114611f55575f80fd5b50565b5f81359050611f6681611f42565b92915050565b5f805f60608486031215611f8357611f82611cd6565b5b5f611f9086828701611d20565b9350506020611fa186828701611d53565b9250506040611fb286828701611f58565b9150509250925092565b611fc581611cf9565b82525050565b5f602082019050611fde5f830184611fbc565b92915050565b5f805f60608486031215611ffb57611ffa611cd6565b5b5f61200886828701611d53565b935050602061201986828701611d53565b925050604061202a86828701611d53565b9150509250925092565b5f806040838503121561204a57612049611cd6565b5b5f61205785828601611d20565b925050602061206885828601611d20565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806120b657607f821691505b6020821081036120c9576120c8612072565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61210682611d34565b915061211183611d34565b925082820261211f81611d34565b91508282048414831517612136576121356120cf565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61217482611d34565b915061217f83611d34565b92508261218f5761218e61213d565b5b828204905092915050565b5f6121a482611d34565b91506121af83611d34565b92508282019050808211156121c7576121c66120cf565b5b92915050565b5f6121d782611d34565b91506121e283611d34565b92508282039050818111156121fa576121f96120cf565b5b92915050565b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f612234601483611c50565b915061223f82612200565b602082019050919050565b5f6020820190508181035f83015261226181612228565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320616c6c6f77616e635f8201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b5f6122c2602183611c50565b91506122cd82612268565b604082019050919050565b5f6020820190508181035f8301526122ef816122b6565b9050919050565b7f496e73756666696369656e74207374616b65642062616c616e636520746f20755f8201527f6e7374616b650000000000000000000000000000000000000000000000000000602082015250565b5f612350602683611c50565b915061235b826122f6565b604082019050919050565b5f6020820190508181035f83015261237d81612344565b9050919050565b7f496e76616c6964206163636f756e7420747970650000000000000000000000005f82015250565b5f6123b8601483611c50565b91506123c382612384565b602082019050919050565b5f6020820190508181035f8301526123e5816123ac565b9050919050565b7f496e73756666696369656e7420636861726974792062616c616e6365000000005f82015250565b5f612420601c83611c50565b915061242b826123ec565b602082019050919050565b5f6020820190508181035f83015261244d81612414565b9050919050565b7f496e73756666696369656e742070726f6a6563742062616c616e6365000000005f82015250565b5f612488601c83611c50565b915061249382612454565b602082019050919050565b5f6020820190508181035f8301526124b58161247c565b9050919050565b7f496e73756666696369656e7420726577617264732062616c616e6365000000005f82015250565b5f6124f0601c83611c50565b91506124fb826124bc565b602082019050919050565b5f6020820190508181035f83015261251d816124e4565b9050919050565b7f496e73756666696369656e742062616c616e636520746f207374616b650000005f82015250565b5f612558601d83611c50565b915061256382612524565b602082019050919050565b5f6020820190508181035f8301526125858161254c565b9050919050565b7f546f74616c206665652070657263656e746167652065786365656473203530255f82015250565b5f6125c0602083611c50565b91506125cb8261258c565b602082019050919050565b5f6020820190508181035f8301526125ed816125b4565b9050919050565b5f6060820190506126075f830186611fbc565b6126146020830185611dd8565b6126216040830184611dd8565b94935050505056fea26469706673582212204cc2b3708dd7ab3d87b04899e297aab8e32f930260d8b48201d88ec2e44d445d64736f6c634300081a0033

Deployed Bytecode

0x608060405234801561000f575f80fd5b506004361061020f575f3560e01c806370a0823111610123578063a9059cbb116100ab578063d89135cd1161007a578063d89135cd146105e3578063dd62ed3e14610601578063e1593ffb14610631578063f2fde38b1461064f578063f5d7abb31461066b5761020f565b8063a9059cbb1461055b578063b4b081df1461058b578063b55cd04b146105a7578063d840fd06146105c55761020f565b80638da5cb5b116100f25780638da5cb5b146104c757806395d89b41146104e557806399b8a3f0146105035780639a274fff14610521578063a694fc3a1461053f5761020f565b806370a0823114610451578063715018a614610481578063858a135d1461048b57806387c0365e146104a95761020f565b80632e17de78116101a65780633a02a42d116101755780633a02a42d146103ab5780633b540996146103db57806344b7eda1146103f957806368b323df146104175780636c597aff146104355761020f565b80632e17de7814610349578063313ce56714610365578063333006dd1461038357806334d2c0a3146103a15761020f565b806316c2be6b116101e257806316c2be6b146102af57806318160ddd146102df5780631dc61040146102fd57806323b872dd146103195761020f565b806306fdde0314610213578063095ea7b314610231578063131f2e53146102615780631460fa871461027f575b5f80fd5b61021b610689565b6040516102289190611cb6565b60405180910390f35b61024b60048036038101906102469190611d67565b610719565b6040516102589190611dbf565b60405180910390f35b61026961072c565b6040516102769190611de7565b60405180910390f35b61029960048036038101906102949190611e00565b610732565b6040516102a69190611de7565b60405180910390f35b6102c960048036038101906102c49190611e00565b610747565b6040516102d69190611dbf565b60405180910390f35b6102e7610799565b6040516102f49190611de7565b60405180910390f35b61031760048036038101906103129190611e55565b6107a2565b005b610333600480360381019061032e9190611e93565b610802565b6040516103409190611dbf565b60405180910390f35b610363600480360381019061035e9190611ee3565b610ab1565b005b61036d610b92565b60405161037a9190611f29565b60405180910390f35b61038b610b9a565b6040516103989190611de7565b60405180910390f35b6103a9610ba0565b005b6103c560048036038101906103c09190611e00565b610bb3565b6040516103d29190611de7565b60405180910390f35b6103e3610bf9565b6040516103f09190611de7565b60405180910390f35b610401610bff565b60405161040e9190611de7565b60405180910390f35b61041f610c08565b60405161042c9190611de7565b60405180910390f35b61044f600480360381019061044a9190611f6c565b610c0e565b005b61046b60048036038101906104669190611e00565b610dd8565b6040516104789190611de7565b60405180910390f35b610489610e1d565b005b610493610e30565b6040516104a09190611de7565b60405180910390f35b6104b1610e39565b6040516104be9190611de7565b60405180910390f35b6104cf610e4a565b6040516104dc9190611fcb565b60405180910390f35b6104ed610e72565b6040516104fa9190611cb6565b60405180910390f35b61050b610f02565b6040516105189190611de7565b60405180910390f35b610529610f08565b6040516105369190611de7565b60405180910390f35b61055960048036038101906105549190611ee3565b610f11565b005b61057560048036038101906105709190611d67565b610fbd565b6040516105829190611dbf565b60405180910390f35b6105a560048036038101906105a09190611fe4565b6111ff565b005b6105af61127b565b6040516105bc9190611de7565b60405180910390f35b6105cd611284565b6040516105da9190611de7565b60405180910390f35b6105eb61128a565b6040516105f89190611de7565b60405180910390f35b61061b60048036038101906106169190612034565b611290565b6040516106289190611de7565b60405180910390f35b6106396112a3565b6040516106469190611de7565b60405180910390f35b61066960048036038101906106649190611e00565b6112b5565b005b610673611339565b6040516106809190611de7565b60405180910390f35b6060600380546106989061209f565b80601f01602080910402602001604051908101604052809291908181526020018280546106c49061209f565b801561070f5780601f106106e65761010080835404028352916020019161070f565b820191905f5260205f20905b8154815290600101906020018083116106f257829003601f168201915b5050505050905090565b5f610724838361134a565b905092915050565b60085481565b600d602052805f5260405f205f915090505481565b5f600e5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f600254905090565b6107aa61136c565b80600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f600e5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168061089e5750600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b156108b5576108ae8484846113f3565b9050610aaa565b5f6103e8600a54846108c791906120fc565b6108d1919061216a565b90505f6103e8600b54856108e591906120fc565b6108ef919061216a565b90505f6103e8600c548661090391906120fc565b61090d919061216a565b90505f61091986611421565b90505f8183858761092a919061219a565b610934919061219a565b61093e919061219a565b90505f818861094d91906121cd565b9050876109598b610dd8565b101561099a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109919061224a565b60405180910390fd5b8560065f8282546109ab919061219a565b925050819055508460075f8282546109c3919061219a565b925050819055508360085f8282546109db919061219a565b925050819055505f831115610a0d576109f48a846114dd565b8260095f828254610a05919061219a565b925050819055505b82821115610a2c57610a2b8a308585610a2691906121cd565b61155c565b5b610a378a8a836113f3565b505f610a438b33611290565b905088811015610a88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7f906122d8565b60405180910390fd5b610a9e8b338b84610a9991906121cd565b61164c565b60019750505050505050505b9392505050565b80600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890612366565b60405180910390fd5b80600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610b7d91906121cd565b92505081905550610b8f30338361155c565b50565b5f6012905090565b600c5481565b610ba861136c565b610bb15f6112b5565b565b5f600d5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b600a5481565b5f600654905090565b600b5481565b610c1661136c565b60018160ff1610158015610c2e575060038160ff1611155b610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c64906123ce565b60405180910390fd5b60018160ff1603610ce557816006541015610cbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb490612436565b60405180910390fd5b8160065f828254610cce91906121cd565b92505081905550610ce030848461155c565b610dd3565b60028160ff1603610d5d57816007541015610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c9061249e565b60405180910390fd5b8160075f828254610d4691906121cd565b92505081905550610d5830848461155c565b610dd2565b60038160ff1603610dd157816008541015610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da490612506565b60405180910390fd5b8160085f828254610dbe91906121cd565b92505081905550610dd030848461155c565b5b5b5b505050565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610e2561136c565b610e2e5f61165e565b565b5f600854905090565b6c7e37be2022c0914b268000000081565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610e819061209f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ead9061209f565b8015610ef85780601f10610ecf57610100808354040283529160200191610ef8565b820191905f5260205f20905b815481529060010190602001808311610edb57829003601f168201915b5050505050905090565b60065481565b5f600754905090565b80610f1b33610dd8565b1015610f5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f539061256e565b60405180910390fd5b610f6733308361155c565b80600d5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610fb3919061219a565b9250508190555050565b5f600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16806110595750600e5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b1561106f576110688383611721565b90506111f9565b5f6103e8600a548461108191906120fc565b61108b919061216a565b90505f6103e8600b548561109f91906120fc565b6110a9919061216a565b90505f6103e8600c54866110bd91906120fc565b6110c7919061216a565b90505f6110d386611421565b90505f818385876110e4919061219a565b6110ee919061219a565b6110f8919061219a565b90505f818861110791906121cd565b90508761111333610dd8565b1015611154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114b9061224a565b60405180910390fd5b8560065f828254611165919061219a565b925050819055508460075f82825461117d919061219a565b925050819055508360085f828254611195919061219a565b925050819055505f8311156111c7576111ae33846114dd565b8260095f8282546111bf919061219a565b925050819055505b828211156111e6576111e43084846111df91906121cd565b611721565b505b6111f08982611721565b96505050505050505b92915050565b61120761136c565b6101f4818385611217919061219a565b611221919061219a565b10611261576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611258906125d6565b60405180910390fd5b82600a8190555081600b8190555080600c81905550505050565b5f600954905090565b60075481565b60095481565b5f61129b8383611743565b905092915050565b6d01090ea8dd15c79784374000000081565b6112bd61136c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361132d575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016113249190611fcb565b60405180910390fd5b6113368161165e565b50565b6c3f1bdf10116048a5934000000081565b5f806113546117c5565b905061136181858561164c565b600191505092915050565b6113746117c5565b73ffffffffffffffffffffffffffffffffffffffff16611392610e4a565b73ffffffffffffffffffffffffffffffffffffffff16146113f1576113b56117c5565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016113e89190611fcb565b60405180910390fd5b565b5f806113fd6117c5565b905061140a8582856117cc565b61141585858561155c565b60019150509392505050565b5f8061142b610799565b90506d01090ea8dd15c797843740000000811115611465576103e860058461145391906120fc565b61145d919061216a565b9150506114d8565b6c7e37be2022c0914b268000000081111561149c5761271060198461148a91906120fc565b611494919061216a565b9150506114d8565b6c3f1bdf10116048a593400000008111156114d357612710600a846114c191906120fc565b6114cb919061216a565b9150506114d8565b5f9150505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361154d575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016115449190611fcb565b60405180910390fd5b611558825f8361185e565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036115cc575f6040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016115c39190611fcb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361163c575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016116339190611fcb565b60405180910390fd5b61164783838361185e565b505050565b6116598383836001611a77565b505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f8061172b6117c5565b905061173881858561155c565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b5f6117d78484611290565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146118585781811015611849578281836040517ffb8f41b2000000000000000000000000000000000000000000000000000000008152600401611840939291906125f4565b60405180910390fd5b61185784848484035f611a77565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036118ae578060025f8282546118a2919061219a565b9250508190555061197c565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015611937578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161192e939291906125f4565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119c3578060025f8282540392505081905550611a0d565b805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611a6a9190611de7565b60405180910390a3505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ae7575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401611ade9190611fcb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611b57575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401611b4e9190611fcb565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015611c40578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611c379190611de7565b60405180910390a35b50505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611c8882611c46565b611c928185611c50565b9350611ca2818560208601611c60565b611cab81611c6e565b840191505092915050565b5f6020820190508181035f830152611cce8184611c7e565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611d0382611cda565b9050919050565b611d1381611cf9565b8114611d1d575f80fd5b50565b5f81359050611d2e81611d0a565b92915050565b5f819050919050565b611d4681611d34565b8114611d50575f80fd5b50565b5f81359050611d6181611d3d565b92915050565b5f8060408385031215611d7d57611d7c611cd6565b5b5f611d8a85828601611d20565b9250506020611d9b85828601611d53565b9150509250929050565b5f8115159050919050565b611db981611da5565b82525050565b5f602082019050611dd25f830184611db0565b92915050565b611de181611d34565b82525050565b5f602082019050611dfa5f830184611dd8565b92915050565b5f60208284031215611e1557611e14611cd6565b5b5f611e2284828501611d20565b91505092915050565b611e3481611da5565b8114611e3e575f80fd5b50565b5f81359050611e4f81611e2b565b92915050565b5f8060408385031215611e6b57611e6a611cd6565b5b5f611e7885828601611d20565b9250506020611e8985828601611e41565b9150509250929050565b5f805f60608486031215611eaa57611ea9611cd6565b5b5f611eb786828701611d20565b9350506020611ec886828701611d20565b9250506040611ed986828701611d53565b9150509250925092565b5f60208284031215611ef857611ef7611cd6565b5b5f611f0584828501611d53565b91505092915050565b5f60ff82169050919050565b611f2381611f0e565b82525050565b5f602082019050611f3c5f830184611f1a565b92915050565b611f4b81611f0e565b8114611f55575f80fd5b50565b5f81359050611f6681611f42565b92915050565b5f805f60608486031215611f8357611f82611cd6565b5b5f611f9086828701611d20565b9350506020611fa186828701611d53565b9250506040611fb286828701611f58565b9150509250925092565b611fc581611cf9565b82525050565b5f602082019050611fde5f830184611fbc565b92915050565b5f805f60608486031215611ffb57611ffa611cd6565b5b5f61200886828701611d53565b935050602061201986828701611d53565b925050604061202a86828701611d53565b9150509250925092565b5f806040838503121561204a57612049611cd6565b5b5f61205785828601611d20565b925050602061206885828601611d20565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806120b657607f821691505b6020821081036120c9576120c8612072565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61210682611d34565b915061211183611d34565b925082820261211f81611d34565b91508282048414831517612136576121356120cf565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61217482611d34565b915061217f83611d34565b92508261218f5761218e61213d565b5b828204905092915050565b5f6121a482611d34565b91506121af83611d34565b92508282019050808211156121c7576121c66120cf565b5b92915050565b5f6121d782611d34565b91506121e283611d34565b92508282039050818111156121fa576121f96120cf565b5b92915050565b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f612234601483611c50565b915061223f82612200565b602082019050919050565b5f6020820190508181035f83015261226181612228565b9050919050565b7f5472616e7366657220616d6f756e74206578636565647320616c6c6f77616e635f8201527f6500000000000000000000000000000000000000000000000000000000000000602082015250565b5f6122c2602183611c50565b91506122cd82612268565b604082019050919050565b5f6020820190508181035f8301526122ef816122b6565b9050919050565b7f496e73756666696369656e74207374616b65642062616c616e636520746f20755f8201527f6e7374616b650000000000000000000000000000000000000000000000000000602082015250565b5f612350602683611c50565b915061235b826122f6565b604082019050919050565b5f6020820190508181035f83015261237d81612344565b9050919050565b7f496e76616c6964206163636f756e7420747970650000000000000000000000005f82015250565b5f6123b8601483611c50565b91506123c382612384565b602082019050919050565b5f6020820190508181035f8301526123e5816123ac565b9050919050565b7f496e73756666696369656e7420636861726974792062616c616e6365000000005f82015250565b5f612420601c83611c50565b915061242b826123ec565b602082019050919050565b5f6020820190508181035f83015261244d81612414565b9050919050565b7f496e73756666696369656e742070726f6a6563742062616c616e6365000000005f82015250565b5f612488601c83611c50565b915061249382612454565b602082019050919050565b5f6020820190508181035f8301526124b58161247c565b9050919050565b7f496e73756666696369656e7420726577617264732062616c616e6365000000005f82015250565b5f6124f0601c83611c50565b91506124fb826124bc565b602082019050919050565b5f6020820190508181035f83015261251d816124e4565b9050919050565b7f496e73756666696369656e742062616c616e636520746f207374616b650000005f82015250565b5f612558601d83611c50565b915061256382612524565b602082019050919050565b5f6020820190508181035f8301526125858161254c565b9050919050565b7f546f74616c206665652070657263656e746167652065786365656473203530255f82015250565b5f6125c0602083611c50565b91506125cb8261258c565b602082019050919050565b5f6020820190508181035f8301526125ed816125b4565b9050919050565b5f6060820190506126075f830186611fbc565b6126146020830185611dd8565b6126216040830184611dd8565b94935050505056fea26469706673582212204cc2b3708dd7ab3d87b04899e297aab8e32f930260d8b48201d88ec2e44d445d64736f6c634300081a0033

Deployed Bytecode Sourcemap

25628:7601:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13005:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30341:137;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25784:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26400:49;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32486:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14107:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32316:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30641:1616;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29904:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13958:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26021:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32665:107;;;:::i;:::-;;30162:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25901:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32804:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25960:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28816:838;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14269:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24728:103;;;:::i;:::-;;33022:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26192:63;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24053:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13215:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25712:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32913:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29662:234;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27043:1240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26691:344;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33131:95;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25748:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25820:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30486:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26277:63;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24986:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26113:58;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13005:91;13050:13;13083:5;13076:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13005:91;:::o;30341:137::-;30416:4;30440:30;30454:7;30463:6;30440:13;:30::i;:::-;30433:37;;30341:137;;;;:::o;25784:29::-;;;;:::o;26400:49::-;;;;;;;;;;;;;;;;;:::o;32486:114::-;32547:4;32571:12;:21;32584:7;32571:21;;;;;;;;;;;;;;;;;;;;;;;;;32564:28;;32486:114;;;:::o;14107:99::-;14159:7;14186:12;;14179:19;;14107:99;:::o;32316:120::-;23939:13;:11;:13::i;:::-;32422:6:::1;32398:12;:21;32411:7;32398:21;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;32316:120:::0;;:::o;30641:1616::-;30773:4;30794:12;:20;30807:6;30794:20;;;;;;;;;;;;;;;;;;;;;;;;;:47;;;;30818:12;:23;30831:9;30818:23;;;;;;;;;;;;;;;;;;;;;;;;;30794:47;30790:132;;;30865:45;30884:6;30892:9;30903:6;30865:18;:45::i;:::-;30858:52;;;;30790:132;30934:18;30986:4;30965:17;;30956:6;:26;;;;:::i;:::-;30955:35;;;;:::i;:::-;30934:56;;31001:18;31053:4;31032:17;;31023:6;:26;;;;:::i;:::-;31022:35;;;;:::i;:::-;31001:56;;31068:18;31120:4;31099:17;;31090:6;:26;;;;:::i;:::-;31089:35;;;;:::i;:::-;31068:56;;31137:15;31155:24;31172:6;31155:16;:24::i;:::-;31137:42;;31192:17;31251:7;31238:10;31225;31212;:23;;;;:::i;:::-;:36;;;;:::i;:::-;:46;;;;:::i;:::-;31192:66;;31269:22;31303:9;31294:6;:18;;;;:::i;:::-;31269:43;;31354:6;31333:17;31343:6;31333:9;:17::i;:::-;:27;;31325:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;31453:10;31435:14;;:28;;;;;;;:::i;:::-;;;;;;;;31492:10;31474:14;;:28;;;;;;;:::i;:::-;;;;;;;;31531:10;31513:14;;:28;;;;;;;:::i;:::-;;;;;;;;31592:1;31582:7;:11;31578:103;;;31610:22;31616:6;31624:7;31610:5;:22::i;:::-;31662:7;31647:11;;:22;;;;;;;:::i;:::-;;;;;;;;31578:103;31754:7;31742:9;:19;31738:111;;;31778:59;31794:6;31810:4;31829:7;31817:9;:19;;;;:::i;:::-;31778:15;:59::i;:::-;31738:111;31915:53;31934:6;31942:9;31953:14;31915:18;:53::i;:::-;;32020:24;32047:29;32057:6;32065:10;32047:9;:29::i;:::-;32020:56;;32115:6;32095:16;:26;;32087:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;32170:55;32179:6;32187:10;32218:6;32199:16;:25;;;;:::i;:::-;32170:8;:55::i;:::-;32245:4;32238:11;;;;;;;;;30641:1616;;;;;;:::o;29904:250::-;29995:6;29965:14;:26;29980:10;29965:26;;;;;;;;;;;;;;;;:36;;29957:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;30085:6;30055:14;:26;30070:10;30055:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;30102:44;30120:4;30127:10;30139:6;30102:9;:44::i;:::-;29904:250;:::o;13958:84::-;14007:5;14032:2;14025:9;;13958:84;:::o;26021:37::-;;;;:::o;32665:107::-;23939:13;:11;:13::i;:::-;32735:29:::1;32761:1;32735:17;:29::i;:::-;32665:107::o:0;30162:124::-;30228:7;30255:14;:23;30270:7;30255:23;;;;;;;;;;;;;;;;30248:30;;30162:124;;;:::o;25901:37::-;;;;:::o;32804:101::-;32856:7;32883:14;;32876:21;;32804:101;:::o;25960:36::-;;;;:::o;28816:838::-;23939:13;:11;:13::i;:::-;28945:1:::1;28930:11;:16;;;;:36;;;;;28965:1;28950:11;:16;;;;28930:36;28922:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;29021:1;29006:11;:16;;::::0;29002:645:::1;;29065:6;29047:14;;:24;;29039:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29137:6;29119:14;;:24;;;;;;;:::i;:::-;;;;;;;;29158:43;29176:4;29183:9;29194:6;29158:9;:43::i;:::-;29002:645;;;29238:1;29223:11;:16;;::::0;29219:428:::1;;29282:6;29264:14;;:24;;29256:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29354:6;29336:14;;:24;;;;;;;:::i;:::-;;;;;;;;29375:43;29393:4;29400:9;29411:6;29375:9;:43::i;:::-;29219:428;;;29455:1;29440:11;:16;;::::0;29436:211:::1;;29499:6;29481:14;;:24;;29473:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29571:6;29553:14;;:24;;;;;;;:::i;:::-;;;;;;;;29592:43;29610:4;29617:9;29628:6;29592:9;:43::i;:::-;29436:211;29219:428;29002:645;28816:838:::0;;;:::o;14269:118::-;14334:7;14361:9;:18;14371:7;14361:18;;;;;;;;;;;;;;;;14354:25;;14269:118;;;:::o;24728:103::-;23939:13;:11;:13::i;:::-;24793:30:::1;24820:1;24793:18;:30::i;:::-;24728:103::o:0;33022:101::-;33074:7;33101:14;;33094:21;;33022:101;:::o;26192:63::-;26242:13;26192:63;:::o;24053:87::-;24099:7;24126:6;;;;;;;;;;;24119:13;;24053:87;:::o;13215:95::-;13262:13;13295:7;13288:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13215:95;:::o;25712:29::-;;;;:::o;32913:101::-;32965:7;32992:14;;32985:21;;32913:101;:::o;29662:234::-;29746:6;29721:21;29731:10;29721:9;:21::i;:::-;:31;;29713:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29797:44;29807:10;29827:4;29834:6;29797:9;:44::i;:::-;29882:6;29852:14;:26;29867:10;29852:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;29662:234;:::o;27043:1240::-;27121:4;27142:12;:24;27155:10;27142:24;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;27170:12;:23;27183:9;27170:23;;;;;;;;;;;;;;;;;;;;;;;;;27142:51;27138:124;;;27217:33;27232:9;27243:6;27217:14;:33::i;:::-;27210:40;;;;27138:124;27274:18;27326:4;27305:17;;27296:6;:26;;;;:::i;:::-;27295:35;;;;:::i;:::-;27274:56;;27341:18;27393:4;27372:17;;27363:6;:26;;;;:::i;:::-;27362:35;;;;:::i;:::-;27341:56;;27408:18;27460:4;27439:17;;27430:6;:26;;;;:::i;:::-;27429:35;;;;:::i;:::-;27408:56;;27477:15;27495:24;27512:6;27495:16;:24::i;:::-;27477:42;;27532:17;27591:7;27578:10;27565;27552;:23;;;;:::i;:::-;:36;;;;:::i;:::-;:46;;;;:::i;:::-;27532:66;;27609:22;27643:9;27634:6;:18;;;;:::i;:::-;27609:43;;27698:6;27673:21;27683:10;27673:9;:21::i;:::-;:31;;27665:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;27797:10;27779:14;;:28;;;;;;;:::i;:::-;;;;;;;;27836:10;27818:14;;:28;;;;;;;:::i;:::-;;;;;;;;27875:10;27857:14;;:28;;;;;;;:::i;:::-;;;;;;;;27936:1;27926:7;:11;27922:107;;;27954:26;27960:10;27972:7;27954:5;:26::i;:::-;28010:7;27995:11;;:22;;;;;;;:::i;:::-;;;;;;;;27922:107;28102:7;28090:9;:19;28086:102;;;28126:50;28149:4;28168:7;28156:9;:19;;;;:::i;:::-;28126:14;:50::i;:::-;;28086:102;28234:41;28249:9;28260:14;28234;:41::i;:::-;28227:48;;;;;;;;27043:1240;;;;;:::o;26691:344::-;23939:13;:11;:13::i;:::-;26861:3:::1;26847:11;26833;26819;:25;;;;:::i;:::-;:39;;;;:::i;:::-;:45;26811:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;26932:11;26912:17;:31;;;;26974:11;26954:17;:31;;;;27016:11;26996:17;:31;;;;26691:344:::0;;;:::o;33131:95::-;33180:7;33207:11;;33200:18;;33131:95;:::o;25748:29::-;;;;:::o;25820:26::-;;;;:::o;30486:147::-;30567:7;30594:31;30610:5;30617:7;30594:15;:31::i;:::-;30587:38;;30486:147;;;;:::o;26277:63::-;26327:13;26277:63;:::o;24986:220::-;23939:13;:11;:13::i;:::-;25091:1:::1;25071:22;;:8;:22;;::::0;25067:93:::1;;25145:1;25117:31;;;;;;;;;;;:::i;:::-;;;;;;;;25067:93;25170:28;25189:8;25170:18;:28::i;:::-;24986:220:::0;:::o;26113:58::-;26159:12;26113:58;:::o;15298:190::-;15371:4;15388:13;15404:12;:10;:12::i;:::-;15388:28;;15427:31;15436:5;15443:7;15452:5;15427:8;:31::i;:::-;15476:4;15469:11;;;15298:190;;;;:::o;24218:166::-;24289:12;:10;:12::i;:::-;24278:23;;:7;:5;:7::i;:::-;:23;;;24274:103;;24352:12;:10;:12::i;:::-;24325:40;;;;;;;;;;;:::i;:::-;;;;;;;;24274:103;24218:166::o;16098:249::-;16185:4;16202:15;16220:12;:10;:12::i;:::-;16202:30;;16243:37;16259:4;16265:7;16274:5;16243:15;:37::i;:::-;16291:26;16301:4;16307:2;16311:5;16291:9;:26::i;:::-;16335:4;16328:11;;;16098:249;;;;;:::o;28291:517::-;28356:7;28376:25;28404:13;:11;:13::i;:::-;28376:41;;26327:13;28432:17;:43;28428:343;;;28514:4;28509:1;28500:6;:10;;;;:::i;:::-;28499:19;;;;:::i;:::-;28492:26;;;;;28428:343;26242:13;28548:17;:43;28544:227;;;28631:5;28625:2;28616:6;:11;;;;:::i;:::-;28615:21;;;;:::i;:::-;28608:28;;;;;28544:227;26159:12;28667:17;:39;28663:108;;;28746:5;28740:2;28731:6;:11;;;;:::i;:::-;28730:21;;;;:::i;:::-;28723:28;;;;;28663:108;28788:1;28781:8;;;28291:517;;;;:::o;19393:211::-;19483:1;19464:21;;:7;:21;;;19460:91;;19536:1;19509:30;;;;;;;;;;;:::i;:::-;;;;;;;;19460:91;19561:35;19569:7;19586:1;19590:5;19561:7;:35::i;:::-;19393:211;;:::o;16732:308::-;16832:1;16816:18;;:4;:18;;;16812:88;;16885:1;16858:30;;;;;;;;;;;:::i;:::-;;;;;;;;16812:88;16928:1;16914:16;;:2;:16;;;16910:88;;16983:1;16954:32;;;;;;;;;;;:::i;:::-;;;;;;;;16910:88;17008:24;17016:4;17022:2;17026:5;17008:7;:24::i;:::-;16732:308;;;:::o;20157:130::-;20242:37;20251:5;20258:7;20267:5;20274:4;20242:8;:37::i;:::-;20157:130;;;:::o;25366:191::-;25440:16;25459:6;;;;;;;;;;;25440:25;;25485:8;25476:6;;:17;;;;;;;;;;;;;;;;;;25540:8;25509:40;;25530:8;25509:40;;;;;;;;;;;;25429:128;25366:191;:::o;14592:182::-;14661:4;14678:13;14694:12;:10;:12::i;:::-;14678:28;;14717:27;14727:5;14734:2;14738:5;14717:9;:27::i;:::-;14762:4;14755:11;;;14592:182;;;;:::o;14837:142::-;14917:7;14944:11;:18;14956:5;14944:18;;;;;;;;;;;;;;;:27;14963:7;14944:27;;;;;;;;;;;;;;;;14937:34;;14837:142;;;;:::o;4304:98::-;4357:7;4384:10;4377:17;;4304:98;:::o;21889:487::-;21989:24;22016:25;22026:5;22033:7;22016:9;:25::i;:::-;21989:52;;22076:17;22056:16;:37;22052:317;;22133:5;22114:16;:24;22110:132;;;22193:7;22202:16;22220:5;22166:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;22110:132;22285:57;22294:5;22301:7;22329:5;22310:16;:24;22336:5;22285:8;:57::i;:::-;22052:317;21978:398;21889:487;;;:::o;17364:1135::-;17470:1;17454:18;;:4;:18;;;17450:552;;17608:5;17592:12;;:21;;;;;;;:::i;:::-;;;;;;;;17450:552;;;17646:19;17668:9;:15;17678:4;17668:15;;;;;;;;;;;;;;;;17646:37;;17716:5;17702:11;:19;17698:117;;;17774:4;17780:11;17793:5;17749:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;17698:117;17970:5;17956:11;:19;17938:9;:15;17948:4;17938:15;;;;;;;;;;;;;;;:37;;;;17631:371;17450:552;18032:1;18018:16;;:2;:16;;;18014:435;;18200:5;18184:12;;:21;;;;;;;;;;;18014:435;;;18417:5;18400:9;:13;18410:2;18400:13;;;;;;;;;;;;;;;;:22;;;;;;;;;;;18014:435;18481:2;18466:25;;18475:4;18466:25;;;18485:5;18466:25;;;;;;:::i;:::-;;;;;;;;17364:1135;;;:::o;21154:443::-;21284:1;21267:19;;:5;:19;;;21263:91;;21339:1;21310:32;;;;;;;;;;;:::i;:::-;;;;;;;;21263:91;21387:1;21368:21;;:7;:21;;;21364:92;;21441:1;21413:31;;;;;;;;;;;:::i;:::-;;;;;;;;21364:92;21496:5;21466:11;:18;21478:5;21466:18;;;;;;;;;;;;;;;:27;21485:7;21466:27;;;;;;;;;;;;;;;:35;;;;21516:9;21512:78;;;21563:7;21547:31;;21556:5;21547:31;;;21572:5;21547:31;;;;;;:::i;:::-;;;;;;;;21512:78;21154:443;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:139::-;376:6;371:3;366;360:23;417:1;408:6;403:3;399:16;392:27;287:139;;;:::o;432:102::-;473:6;524:2;520:7;515:2;508:5;504:14;500:28;490:38;;432:102;;;:::o;540:377::-;628:3;656:39;689:5;656:39;:::i;:::-;711:71;775:6;770:3;711:71;:::i;:::-;704:78;;791:65;849:6;844:3;837:4;830:5;826:16;791:65;:::i;:::-;881:29;903:6;881:29;:::i;:::-;876:3;872:39;865:46;;632:285;540:377;;;;:::o;923:313::-;1036:4;1074:2;1063:9;1059:18;1051:26;;1123:9;1117:4;1113:20;1109:1;1098:9;1094:17;1087:47;1151:78;1224:4;1215:6;1151:78;:::i;:::-;1143:86;;923:313;;;;:::o;1323:117::-;1432:1;1429;1422:12;1569:126;1606:7;1646:42;1639:5;1635:54;1624:65;;1569:126;;;:::o;1701:96::-;1738:7;1767:24;1785:5;1767:24;:::i;:::-;1756:35;;1701:96;;;:::o;1803:122::-;1876:24;1894:5;1876:24;:::i;:::-;1869:5;1866:35;1856:63;;1915:1;1912;1905:12;1856:63;1803:122;:::o;1931:139::-;1977:5;2015:6;2002:20;1993:29;;2031:33;2058:5;2031:33;:::i;:::-;1931:139;;;;:::o;2076:77::-;2113:7;2142:5;2131:16;;2076:77;;;:::o;2159:122::-;2232:24;2250:5;2232:24;:::i;:::-;2225:5;2222:35;2212:63;;2271:1;2268;2261:12;2212:63;2159:122;:::o;2287:139::-;2333:5;2371:6;2358:20;2349:29;;2387:33;2414:5;2387:33;:::i;:::-;2287:139;;;;:::o;2432:474::-;2500:6;2508;2557:2;2545:9;2536:7;2532:23;2528:32;2525:119;;;2563:79;;:::i;:::-;2525:119;2683:1;2708:53;2753:7;2744:6;2733:9;2729:22;2708:53;:::i;:::-;2698:63;;2654:117;2810:2;2836:53;2881:7;2872:6;2861:9;2857:22;2836:53;:::i;:::-;2826:63;;2781:118;2432:474;;;;;:::o;2912:90::-;2946:7;2989:5;2982:13;2975:21;2964:32;;2912:90;;;:::o;3008:109::-;3089:21;3104:5;3089:21;:::i;:::-;3084:3;3077:34;3008:109;;:::o;3123:210::-;3210:4;3248:2;3237:9;3233:18;3225:26;;3261:65;3323:1;3312:9;3308:17;3299:6;3261:65;:::i;:::-;3123:210;;;;:::o;3339:118::-;3426:24;3444:5;3426:24;:::i;:::-;3421:3;3414:37;3339:118;;:::o;3463:222::-;3556:4;3594:2;3583:9;3579:18;3571:26;;3607:71;3675:1;3664:9;3660:17;3651:6;3607:71;:::i;:::-;3463:222;;;;:::o;3691:329::-;3750:6;3799:2;3787:9;3778:7;3774:23;3770:32;3767:119;;;3805:79;;:::i;:::-;3767:119;3925:1;3950:53;3995:7;3986:6;3975:9;3971:22;3950:53;:::i;:::-;3940:63;;3896:117;3691:329;;;;:::o;4026:116::-;4096:21;4111:5;4096:21;:::i;:::-;4089:5;4086:32;4076:60;;4132:1;4129;4122:12;4076:60;4026:116;:::o;4148:133::-;4191:5;4229:6;4216:20;4207:29;;4245:30;4269:5;4245:30;:::i;:::-;4148:133;;;;:::o;4287:468::-;4352:6;4360;4409:2;4397:9;4388:7;4384:23;4380:32;4377:119;;;4415:79;;:::i;:::-;4377:119;4535:1;4560:53;4605:7;4596:6;4585:9;4581:22;4560:53;:::i;:::-;4550:63;;4506:117;4662:2;4688:50;4730:7;4721:6;4710:9;4706:22;4688:50;:::i;:::-;4678:60;;4633:115;4287:468;;;;;:::o;4761:619::-;4838:6;4846;4854;4903:2;4891:9;4882:7;4878:23;4874:32;4871:119;;;4909:79;;:::i;:::-;4871:119;5029:1;5054:53;5099:7;5090:6;5079:9;5075:22;5054:53;:::i;:::-;5044:63;;5000:117;5156:2;5182:53;5227:7;5218:6;5207:9;5203:22;5182:53;:::i;:::-;5172:63;;5127:118;5284:2;5310:53;5355:7;5346:6;5335:9;5331:22;5310:53;:::i;:::-;5300:63;;5255:118;4761:619;;;;;:::o;5386:329::-;5445:6;5494:2;5482:9;5473:7;5469:23;5465:32;5462:119;;;5500:79;;:::i;:::-;5462:119;5620:1;5645:53;5690:7;5681:6;5670:9;5666:22;5645:53;:::i;:::-;5635:63;;5591:117;5386:329;;;;:::o;5721:86::-;5756:7;5796:4;5789:5;5785:16;5774:27;;5721:86;;;:::o;5813:112::-;5896:22;5912:5;5896:22;:::i;:::-;5891:3;5884:35;5813:112;;:::o;5931:214::-;6020:4;6058:2;6047:9;6043:18;6035:26;;6071:67;6135:1;6124:9;6120:17;6111:6;6071:67;:::i;:::-;5931:214;;;;:::o;6151:118::-;6222:22;6238:5;6222:22;:::i;:::-;6215:5;6212:33;6202:61;;6259:1;6256;6249:12;6202:61;6151:118;:::o;6275:135::-;6319:5;6357:6;6344:20;6335:29;;6373:31;6398:5;6373:31;:::i;:::-;6275:135;;;;:::o;6416:615::-;6491:6;6499;6507;6556:2;6544:9;6535:7;6531:23;6527:32;6524:119;;;6562:79;;:::i;:::-;6524:119;6682:1;6707:53;6752:7;6743:6;6732:9;6728:22;6707:53;:::i;:::-;6697:63;;6653:117;6809:2;6835:53;6880:7;6871:6;6860:9;6856:22;6835:53;:::i;:::-;6825:63;;6780:118;6937:2;6963:51;7006:7;6997:6;6986:9;6982:22;6963:51;:::i;:::-;6953:61;;6908:116;6416:615;;;;;:::o;7037:118::-;7124:24;7142:5;7124:24;:::i;:::-;7119:3;7112:37;7037:118;;:::o;7161:222::-;7254:4;7292:2;7281:9;7277:18;7269:26;;7305:71;7373:1;7362:9;7358:17;7349:6;7305:71;:::i;:::-;7161:222;;;;:::o;7389:619::-;7466:6;7474;7482;7531:2;7519:9;7510:7;7506:23;7502:32;7499:119;;;7537:79;;:::i;:::-;7499:119;7657:1;7682:53;7727:7;7718:6;7707:9;7703:22;7682:53;:::i;:::-;7672:63;;7628:117;7784:2;7810:53;7855:7;7846:6;7835:9;7831:22;7810:53;:::i;:::-;7800:63;;7755:118;7912:2;7938:53;7983:7;7974:6;7963:9;7959:22;7938:53;:::i;:::-;7928:63;;7883:118;7389:619;;;;;:::o;8014:474::-;8082:6;8090;8139:2;8127:9;8118:7;8114:23;8110:32;8107:119;;;8145:79;;:::i;:::-;8107:119;8265:1;8290:53;8335:7;8326:6;8315:9;8311:22;8290:53;:::i;:::-;8280:63;;8236:117;8392:2;8418:53;8463:7;8454:6;8443:9;8439:22;8418:53;:::i;:::-;8408:63;;8363:118;8014:474;;;;;:::o;8494:180::-;8542:77;8539:1;8532:88;8639:4;8636:1;8629:15;8663:4;8660:1;8653:15;8680:320;8724:6;8761:1;8755:4;8751:12;8741:22;;8808:1;8802:4;8798:12;8829:18;8819:81;;8885:4;8877:6;8873:17;8863:27;;8819:81;8947:2;8939:6;8936:14;8916:18;8913:38;8910:84;;8966:18;;:::i;:::-;8910:84;8731:269;8680:320;;;:::o;9006:180::-;9054:77;9051:1;9044:88;9151:4;9148:1;9141:15;9175:4;9172:1;9165:15;9192:410;9232:7;9255:20;9273:1;9255:20;:::i;:::-;9250:25;;9289:20;9307:1;9289:20;:::i;:::-;9284:25;;9344:1;9341;9337:9;9366:30;9384:11;9366:30;:::i;:::-;9355:41;;9545:1;9536:7;9532:15;9529:1;9526:22;9506:1;9499:9;9479:83;9456:139;;9575:18;;:::i;:::-;9456:139;9240:362;9192:410;;;;:::o;9608:180::-;9656:77;9653:1;9646:88;9753:4;9750:1;9743:15;9777:4;9774:1;9767:15;9794:185;9834:1;9851:20;9869:1;9851:20;:::i;:::-;9846:25;;9885:20;9903:1;9885:20;:::i;:::-;9880:25;;9924:1;9914:35;;9929:18;;:::i;:::-;9914:35;9971:1;9968;9964:9;9959:14;;9794:185;;;;:::o;9985:191::-;10025:3;10044:20;10062:1;10044:20;:::i;:::-;10039:25;;10078:20;10096:1;10078:20;:::i;:::-;10073:25;;10121:1;10118;10114:9;10107:16;;10142:3;10139:1;10136:10;10133:36;;;10149:18;;:::i;:::-;10133:36;9985:191;;;;:::o;10182:194::-;10222:4;10242:20;10260:1;10242:20;:::i;:::-;10237:25;;10276:20;10294:1;10276:20;:::i;:::-;10271:25;;10320:1;10317;10313:9;10305:17;;10344:1;10338:4;10335:11;10332:37;;;10349:18;;:::i;:::-;10332:37;10182:194;;;;:::o;10382:170::-;10522:22;10518:1;10510:6;10506:14;10499:46;10382:170;:::o;10558:366::-;10700:3;10721:67;10785:2;10780:3;10721:67;:::i;:::-;10714:74;;10797:93;10886:3;10797:93;:::i;:::-;10915:2;10910:3;10906:12;10899:19;;10558:366;;;:::o;10930:419::-;11096:4;11134:2;11123:9;11119:18;11111:26;;11183:9;11177:4;11173:20;11169:1;11158:9;11154:17;11147:47;11211:131;11337:4;11211:131;:::i;:::-;11203:139;;10930:419;;;:::o;11355:220::-;11495:34;11491:1;11483:6;11479:14;11472:58;11564:3;11559:2;11551:6;11547:15;11540:28;11355:220;:::o;11581:366::-;11723:3;11744:67;11808:2;11803:3;11744:67;:::i;:::-;11737:74;;11820:93;11909:3;11820:93;:::i;:::-;11938:2;11933:3;11929:12;11922:19;;11581:366;;;:::o;11953:419::-;12119:4;12157:2;12146:9;12142:18;12134:26;;12206:9;12200:4;12196:20;12192:1;12181:9;12177:17;12170:47;12234:131;12360:4;12234:131;:::i;:::-;12226:139;;11953:419;;;:::o;12378:225::-;12518:34;12514:1;12506:6;12502:14;12495:58;12587:8;12582:2;12574:6;12570:15;12563:33;12378:225;:::o;12609:366::-;12751:3;12772:67;12836:2;12831:3;12772:67;:::i;:::-;12765:74;;12848:93;12937:3;12848:93;:::i;:::-;12966:2;12961:3;12957:12;12950:19;;12609:366;;;:::o;12981:419::-;13147:4;13185:2;13174:9;13170:18;13162:26;;13234:9;13228:4;13224:20;13220:1;13209:9;13205:17;13198:47;13262:131;13388:4;13262:131;:::i;:::-;13254:139;;12981:419;;;:::o;13406:170::-;13546:22;13542:1;13534:6;13530:14;13523:46;13406:170;:::o;13582:366::-;13724:3;13745:67;13809:2;13804:3;13745:67;:::i;:::-;13738:74;;13821:93;13910:3;13821:93;:::i;:::-;13939:2;13934:3;13930:12;13923:19;;13582:366;;;:::o;13954:419::-;14120:4;14158:2;14147:9;14143:18;14135:26;;14207:9;14201:4;14197:20;14193:1;14182:9;14178:17;14171:47;14235:131;14361:4;14235:131;:::i;:::-;14227:139;;13954:419;;;:::o;14379:178::-;14519:30;14515:1;14507:6;14503:14;14496:54;14379:178;:::o;14563:366::-;14705:3;14726:67;14790:2;14785:3;14726:67;:::i;:::-;14719:74;;14802:93;14891:3;14802:93;:::i;:::-;14920:2;14915:3;14911:12;14904:19;;14563:366;;;:::o;14935:419::-;15101:4;15139:2;15128:9;15124:18;15116:26;;15188:9;15182:4;15178:20;15174:1;15163:9;15159:17;15152:47;15216:131;15342:4;15216:131;:::i;:::-;15208:139;;14935:419;;;:::o;15360:178::-;15500:30;15496:1;15488:6;15484:14;15477:54;15360:178;:::o;15544:366::-;15686:3;15707:67;15771:2;15766:3;15707:67;:::i;:::-;15700:74;;15783:93;15872:3;15783:93;:::i;:::-;15901:2;15896:3;15892:12;15885:19;;15544:366;;;:::o;15916:419::-;16082:4;16120:2;16109:9;16105:18;16097:26;;16169:9;16163:4;16159:20;16155:1;16144:9;16140:17;16133:47;16197:131;16323:4;16197:131;:::i;:::-;16189:139;;15916:419;;;:::o;16341:178::-;16481:30;16477:1;16469:6;16465:14;16458:54;16341:178;:::o;16525:366::-;16667:3;16688:67;16752:2;16747:3;16688:67;:::i;:::-;16681:74;;16764:93;16853:3;16764:93;:::i;:::-;16882:2;16877:3;16873:12;16866:19;;16525:366;;;:::o;16897:419::-;17063:4;17101:2;17090:9;17086:18;17078:26;;17150:9;17144:4;17140:20;17136:1;17125:9;17121:17;17114:47;17178:131;17304:4;17178:131;:::i;:::-;17170:139;;16897:419;;;:::o;17322:179::-;17462:31;17458:1;17450:6;17446:14;17439:55;17322:179;:::o;17507:366::-;17649:3;17670:67;17734:2;17729:3;17670:67;:::i;:::-;17663:74;;17746:93;17835:3;17746:93;:::i;:::-;17864:2;17859:3;17855:12;17848:19;;17507:366;;;:::o;17879:419::-;18045:4;18083:2;18072:9;18068:18;18060:26;;18132:9;18126:4;18122:20;18118:1;18107:9;18103:17;18096:47;18160:131;18286:4;18160:131;:::i;:::-;18152:139;;17879:419;;;:::o;18304:182::-;18444:34;18440:1;18432:6;18428:14;18421:58;18304:182;:::o;18492:366::-;18634:3;18655:67;18719:2;18714:3;18655:67;:::i;:::-;18648:74;;18731:93;18820:3;18731:93;:::i;:::-;18849:2;18844:3;18840:12;18833:19;;18492:366;;;:::o;18864:419::-;19030:4;19068:2;19057:9;19053:18;19045:26;;19117:9;19111:4;19107:20;19103:1;19092:9;19088:17;19081:47;19145:131;19271:4;19145:131;:::i;:::-;19137:139;;18864:419;;;:::o;19289:442::-;19438:4;19476:2;19465:9;19461:18;19453:26;;19489:71;19557:1;19546:9;19542:17;19533:6;19489:71;:::i;:::-;19570:72;19638:2;19627:9;19623:18;19614:6;19570:72;:::i;:::-;19652;19720:2;19709:9;19705:18;19696:6;19652:72;:::i;:::-;19289:442;;;;;;:::o

Swarm Source

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