MATIC Price: $0.537438 (+1.89%)
Gas: 30.9 GWei
 

Overview

Max Total Supply

360,000,000 Geld

Holders

255,531

Total Transfers

-

Market

Price

$0.00 @ 0.000000 MATIC

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
GeoCash

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2024-04-30
*/

// File: https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/v4.9.4/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                // Solidity will revert if denominator == 0, unlike the div opcode on its own.
                // The surrounding unchecked block does not change this fact.
                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1, "Math: mulDiv overflow");

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10 ** 64) {
                value /= 10 ** 64;
                result += 64;
            }
            if (value >= 10 ** 32) {
                value /= 10 ** 32;
                result += 32;
            }
            if (value >= 10 ** 16) {
                value /= 10 ** 16;
                result += 16;
            }
            if (value >= 10 ** 8) {
                value /= 10 ** 8;
                result += 8;
            }
            if (value >= 10 ** 4) {
                value /= 10 ** 4;
                result += 4;
            }
            if (value >= 10 ** 2) {
                value /= 10 ** 2;
                result += 2;
            }
            if (value >= 10 ** 1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
        }
    }
}

// File: https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/v4.9.4/contracts/utils/Context.sol


// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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

// File: https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/v4.9.4/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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 amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` 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 amount) external returns (bool);
}

// File: https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/v4.9.4/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
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: https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-contracts/v4.9.4/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @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}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * 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 ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => 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 override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override 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 `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` 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 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * 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 `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `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.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` 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.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

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

// File: geo-cash.sol



// We fund freedom.
// We stop state criminals.
// We make crypto cypherpunk again.
// We love Geo Caching with Geo Cash.
// We foster Freedom, Justice and Peace.
// We combine Crypto Education with Geo Caching.
// We foster sustainable liquidity infrastructures.
// We separate money from state criminals like religion has been separated from state.
// We foster ever emerging architectures of freedom by rewarding those who help themselves and others to be free.

pragma solidity 0.8.19;



contract GeoCash is ERC20 {

    uint256 public logEntryCounter = 0;

    mapping(uint256 => ITraceOfFreedom) public tracesOfFreedom; 
    mapping(uint256 => uint256) public logToCacheID; 

    struct ITraceOfFreedom {
        address from; 
        uint256 priority;
        string freedomMessage;
        uint256 refersTo;
    }
    
    error CheckInput();
    error TransferFailed();   
    error GeoCashRequired();

    constructor() ERC20("Geo Cash", "Geld") {
        _mint(msg.sender, 360000000 * 10 ** decimals()); 
    }
  
    function distributeMatic(uint256 amountPerWallet, address[] memory receivers) public payable {
        if ((amountPerWallet * receivers.length) != msg.value) { revert CheckInput(); }
        for (uint256 i = 0; i < receivers.length; i++) {
            (bool sent, ) = receivers[i].call{value: amountPerWallet}("Geo Cash");
            if (sent == false || amountPerWallet == 0) { revert TransferFailed(); }
        }
    }
    
    function distributeGeoCash(uint256 amountPerWallet, address[] memory receivers) public {
        if (IERC20(address(this)).allowance(msg.sender, address(this)) < (receivers.length * amountPerWallet)) {
            revert CheckInput();
        } 
        for (uint256 i = 0; i < receivers.length; i++) {
            IERC20(address(this)).transferFrom(msg.sender, receivers[i], amountPerWallet);
        }
    }

    function log(uint256 donationAmount, string memory freedomMessage, uint256 refersTo, bool newHideout) public {
        if (donationAmount == 0) { revert GeoCashRequired(); }
        if (newHideout && refersTo != 0) { revert CheckInput(); }
        tracesOfFreedom[logEntryCounter] = ITraceOfFreedom(msg.sender, donationAmount, freedomMessage, refersTo);
        IERC20(address(this)).transferFrom(msg.sender, tracesOfFreedom[refersTo].from, donationAmount);
        logEntryCounter++;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CheckInput","type":"error"},{"inputs":[],"name":"GeoCashRequired","type":"error"},{"inputs":[],"name":"TransferFailed","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"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":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountPerWallet","type":"uint256"},{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"distributeGeoCash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountPerWallet","type":"uint256"},{"internalType":"address[]","name":"receivers","type":"address[]"}],"name":"distributeMatic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"donationAmount","type":"uint256"},{"internalType":"string","name":"freedomMessage","type":"string"},{"internalType":"uint256","name":"refersTo","type":"uint256"},{"internalType":"bool","name":"newHideout","type":"bool"}],"name":"log","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"logEntryCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"logToCacheID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tracesOfFreedom","outputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"priority","type":"uint256"},{"internalType":"string","name":"freedomMessage","type":"string"},{"internalType":"uint256","name":"refersTo","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

608060405260006005553480156200001657600080fd5b506040518060400160405280600881526020017f47656f20436173680000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f47656c64000000000000000000000000000000000000000000000000000000008152508160039081620000949190620004e9565b508060049081620000a69190620004e9565b505050620000e933620000be620000ef60201b60201c565b600a620000cc919062000760565b6315752a00620000dd9190620007b1565b620000f860201b60201c565b620008e8565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200016a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000161906200085d565b60405180910390fd5b6200017e600083836200026560201b60201c565b80600260008282546200019291906200087f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620002459190620008cb565b60405180910390a362000261600083836200026a60201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002f157607f821691505b602082108103620003075762000306620002a9565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003717fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000332565b6200037d868362000332565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003ca620003c4620003be8462000395565b6200039f565b62000395565b9050919050565b6000819050919050565b620003e683620003a9565b620003fe620003f582620003d1565b8484546200033f565b825550505050565b600090565b6200041562000406565b62000422818484620003db565b505050565b5b818110156200044a576200043e6000826200040b565b60018101905062000428565b5050565b601f821115620004995762000463816200030d565b6200046e8462000322565b810160208510156200047e578190505b620004966200048d8562000322565b83018262000427565b50505b505050565b600082821c905092915050565b6000620004be600019846008026200049e565b1980831691505092915050565b6000620004d98383620004ab565b9150826002028217905092915050565b620004f4826200026f565b67ffffffffffffffff81111562000510576200050f6200027a565b5b6200051c8254620002d8565b620005298282856200044e565b600060209050601f8311600181146200056157600084156200054c578287015190505b620005588582620004cb565b865550620005c8565b601f19841662000571866200030d565b60005b828110156200059b5784890151825560018201915060208501945060208101905062000574565b86831015620005bb5784890151620005b7601f891682620004ab565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b60018511156200065e57808604811115620006365762000635620005d0565b5b6001851615620006465780820291505b80810290506200065685620005ff565b945062000616565b94509492505050565b6000826200067957600190506200074c565b816200068957600090506200074c565b8160018114620006a25760028114620006ad57620006e3565b60019150506200074c565b60ff841115620006c257620006c1620005d0565b5b8360020a915084821115620006dc57620006db620005d0565b5b506200074c565b5060208310610133831016604e8410600b84101617156200071d5782820a905083811115620007175762000716620005d0565b5b6200074c565b6200072c84848460016200060c565b92509050818404811115620007465762000745620005d0565b5b81810290505b9392505050565b600060ff82169050919050565b60006200076d8262000395565b91506200077a8362000753565b9250620007a97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000667565b905092915050565b6000620007be8262000395565b9150620007cb8362000395565b9250828202620007db8162000395565b91508282048414831517620007f557620007f4620005d0565b5b5092915050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000845601f83620007fc565b915062000852826200080d565b602082019050919050565b60006020820190508181036000830152620008788162000836565b9050919050565b60006200088c8262000395565b9150620008998362000395565b9250828201905080821115620008b457620008b3620005d0565b5b92915050565b620008c58162000395565b82525050565b6000602082019050620008e26000830184620008ba565b92915050565b61221380620008f86000396000f3fe6080604052600436106100fe5760003560e01c8063691a8f741161009557806395d89b411161006457806395d89b4114610363578063a457c2d71461038e578063a9059cbb146103cb578063b9c34e5514610408578063dd62ed3e14610433576100fe565b8063691a8f74146102a45780636d3b5b96146102cd57806370a08231146102e957806380c0cc7614610326576100fe565b8063313ce567116100d1578063313ce567146101d357806339509351146101fe5780634a441f1f1461023b5780635e5d59291461027b576100fe565b806306fdde0314610103578063095ea7b31461012e57806318160ddd1461016b57806323b872dd14610196575b600080fd5b34801561010f57600080fd5b50610118610470565b60405161012591906112ca565b60405180910390f35b34801561013a57600080fd5b5061015560048036038101906101509190611394565b610502565b60405161016291906113ef565b60405180910390f35b34801561017757600080fd5b50610180610525565b60405161018d9190611419565b60405180910390f35b3480156101a257600080fd5b506101bd60048036038101906101b89190611434565b61052f565b6040516101ca91906113ef565b60405180910390f35b3480156101df57600080fd5b506101e861055e565b6040516101f591906114a3565b60405180910390f35b34801561020a57600080fd5b5061022560048036038101906102209190611394565b610567565b60405161023291906113ef565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d91906114be565b61059e565b60405161027294939291906114fa565b60405180910390f35b34801561028757600080fd5b506102a2600480360381019061029d919061168e565b610676565b005b3480156102b057600080fd5b506102cb60048036038101906102c691906117cb565b6107f6565b005b6102e760048036038101906102e2919061168e565b610a0a565b005b3480156102f557600080fd5b50610310600480360381019061030b919061184e565b610b44565b60405161031d9190611419565b60405180910390f35b34801561033257600080fd5b5061034d600480360381019061034891906114be565b610b8c565b60405161035a9190611419565b60405180910390f35b34801561036f57600080fd5b50610378610ba4565b60405161038591906112ca565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190611394565b610c36565b6040516103c291906113ef565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190611394565b610cad565b6040516103ff91906113ef565b60405180910390f35b34801561041457600080fd5b5061041d610cd0565b60405161042a9190611419565b60405180910390f35b34801561043f57600080fd5b5061045a6004803603810190610455919061187b565b610cd6565b6040516104679190611419565b60405180910390f35b60606003805461047f906118ea565b80601f01602080910402602001604051908101604052809291908181526020018280546104ab906118ea565b80156104f85780601f106104cd576101008083540402835291602001916104f8565b820191906000526020600020905b8154815290600101906020018083116104db57829003601f168201915b5050505050905090565b60008061050d610d5d565b905061051a818585610d65565b600191505092915050565b6000600254905090565b60008061053a610d5d565b9050610547858285610f2e565b610552858585610fba565b60019150509392505050565b60006012905090565b600080610572610d5d565b90506105938185856105848589610cd6565b61058e919061194a565b610d65565b600191505092915050565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020180546105ed906118ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610619906118ea565b80156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b5050505050908060030154905084565b818151610683919061197e565b3073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016106be9291906119c0565b602060405180830381865afa1580156106db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ff91906119fe565b1015610737576040517f1a23505e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81518110156107f1573073ffffffffffffffffffffffffffffffffffffffff166323b872dd3384848151811061077357610772611a2b565b5b6020026020010151866040518463ffffffff1660e01b815260040161079a93929190611a5a565b6020604051808303816000875af11580156107b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107dd9190611aa6565b5080806107e990611ad3565b91505061073a565b505050565b60008403610830576040517f6210b64900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80801561083e575060008214155b15610875576040517f1a23505e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180608001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381525060066000600554815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190816109279190611cc7565b50606082015181600301559050503073ffffffffffffffffffffffffffffffffffffffff166323b872dd336006600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518463ffffffff1660e01b81526004016109a893929190611a5a565b6020604051808303816000875af11580156109c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109eb9190611aa6565b50600560008154809291906109ff90611ad3565b919050555050505050565b34815183610a18919061197e565b14610a4f576040517f1a23505e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8151811015610b3f576000828281518110610a7057610a6f611a2b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1684604051610a9b90611df0565b60006040518083038185875af1925050503d8060008114610ad8576040519150601f19603f3d011682016040523d82523d6000602084013e610add565b606091505b50509050600015158115151480610af45750600084145b15610b2b576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b508080610b3790611ad3565b915050610a52565b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60076020528060005260406000206000915090505481565b606060048054610bb3906118ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdf906118ea565b8015610c2c5780601f10610c0157610100808354040283529160200191610c2c565b820191906000526020600020905b815481529060010190602001808311610c0f57829003601f168201915b5050505050905090565b600080610c41610d5d565b90506000610c4f8286610cd6565b905083811015610c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8b90611e77565b60405180910390fd5b610ca18286868403610d65565b60019250505092915050565b600080610cb8610d5d565b9050610cc5818585610fba565b600191505092915050565b60055481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90611f09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a90611f9b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f219190611419565b60405180910390a3505050565b6000610f3a8484610cd6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610fb45781811015610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90612007565b60405180910390fd5b610fb38484848403610d65565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102090612099565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108f9061212b565b60405180910390fd5b6110a3838383611230565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611120906121bd565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112179190611419565b60405180910390a361122a848484611235565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611274578082015181840152602081019050611259565b60008484015250505050565b6000601f19601f8301169050919050565b600061129c8261123a565b6112a68185611245565b93506112b6818560208601611256565b6112bf81611280565b840191505092915050565b600060208201905081810360008301526112e48184611291565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061132b82611300565b9050919050565b61133b81611320565b811461134657600080fd5b50565b60008135905061135881611332565b92915050565b6000819050919050565b6113718161135e565b811461137c57600080fd5b50565b60008135905061138e81611368565b92915050565b600080604083850312156113ab576113aa6112f6565b5b60006113b985828601611349565b92505060206113ca8582860161137f565b9150509250929050565b60008115159050919050565b6113e9816113d4565b82525050565b600060208201905061140460008301846113e0565b92915050565b6114138161135e565b82525050565b600060208201905061142e600083018461140a565b92915050565b60008060006060848603121561144d5761144c6112f6565b5b600061145b86828701611349565b935050602061146c86828701611349565b925050604061147d8682870161137f565b9150509250925092565b600060ff82169050919050565b61149d81611487565b82525050565b60006020820190506114b86000830184611494565b92915050565b6000602082840312156114d4576114d36112f6565b5b60006114e28482850161137f565b91505092915050565b6114f481611320565b82525050565b600060808201905061150f60008301876114eb565b61151c602083018661140a565b818103604083015261152e8185611291565b905061153d606083018461140a565b95945050505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61158382611280565b810181811067ffffffffffffffff821117156115a2576115a161154b565b5b80604052505050565b60006115b56112ec565b90506115c1828261157a565b919050565b600067ffffffffffffffff8211156115e1576115e061154b565b5b602082029050602081019050919050565b600080fd5b600061160a611605846115c6565b6115ab565b9050808382526020820190506020840283018581111561162d5761162c6115f2565b5b835b8181101561165657806116428882611349565b84526020840193505060208101905061162f565b5050509392505050565b600082601f83011261167557611674611546565b5b81356116858482602086016115f7565b91505092915050565b600080604083850312156116a5576116a46112f6565b5b60006116b38582860161137f565b925050602083013567ffffffffffffffff8111156116d4576116d36112fb565b5b6116e085828601611660565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561170a5761170961154b565b5b61171382611280565b9050602081019050919050565b82818337600083830152505050565b600061174261173d846116ef565b6115ab565b90508281526020810184848401111561175e5761175d6116ea565b5b611769848285611720565b509392505050565b600082601f83011261178657611785611546565b5b813561179684826020860161172f565b91505092915050565b6117a8816113d4565b81146117b357600080fd5b50565b6000813590506117c58161179f565b92915050565b600080600080608085870312156117e5576117e46112f6565b5b60006117f38782880161137f565b945050602085013567ffffffffffffffff811115611814576118136112fb565b5b61182087828801611771565b93505060406118318782880161137f565b9250506060611842878288016117b6565b91505092959194509250565b600060208284031215611864576118636112f6565b5b600061187284828501611349565b91505092915050565b60008060408385031215611892576118916112f6565b5b60006118a085828601611349565b92505060206118b185828601611349565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061190257607f821691505b602082108103611915576119146118bb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006119558261135e565b91506119608361135e565b92508282019050808211156119785761197761191b565b5b92915050565b60006119898261135e565b91506119948361135e565b92508282026119a28161135e565b915082820484148315176119b9576119b861191b565b5b5092915050565b60006040820190506119d560008301856114eb565b6119e260208301846114eb565b9392505050565b6000815190506119f881611368565b92915050565b600060208284031215611a1457611a136112f6565b5b6000611a22848285016119e9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000606082019050611a6f60008301866114eb565b611a7c60208301856114eb565b611a89604083018461140a565b949350505050565b600081519050611aa08161179f565b92915050565b600060208284031215611abc57611abb6112f6565b5b6000611aca84828501611a91565b91505092915050565b6000611ade8261135e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611b1057611b0f61191b565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611b7d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611b40565b611b878683611b40565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611bc4611bbf611bba8461135e565b611b9f565b61135e565b9050919050565b6000819050919050565b611bde83611ba9565b611bf2611bea82611bcb565b848454611b4d565b825550505050565b600090565b611c07611bfa565b611c12818484611bd5565b505050565b5b81811015611c3657611c2b600082611bff565b600181019050611c18565b5050565b601f821115611c7b57611c4c81611b1b565b611c5584611b30565b81016020851015611c64578190505b611c78611c7085611b30565b830182611c17565b50505b505050565b600082821c905092915050565b6000611c9e60001984600802611c80565b1980831691505092915050565b6000611cb78383611c8d565b9150826002028217905092915050565b611cd08261123a565b67ffffffffffffffff811115611ce957611ce861154b565b5b611cf382546118ea565b611cfe828285611c3a565b600060209050601f831160018114611d315760008415611d1f578287015190505b611d298582611cab565b865550611d91565b601f198416611d3f86611b1b565b60005b82811015611d6757848901518255600182019150602085019450602081019050611d42565b86831015611d845784890151611d80601f891682611c8d565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b7f47656f2043617368000000000000000000000000000000000000000000000000600082015250565b6000611dda600883611d99565b9150611de582611da4565b600882019050919050565b6000611dfb82611dcd565b9150819050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611e61602583611245565b9150611e6c82611e05565b604082019050919050565b60006020820190508181036000830152611e9081611e54565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611ef3602483611245565b9150611efe82611e97565b604082019050919050565b60006020820190508181036000830152611f2281611ee6565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000611f85602283611245565b9150611f9082611f29565b604082019050919050565b60006020820190508181036000830152611fb481611f78565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611ff1601d83611245565b9150611ffc82611fbb565b602082019050919050565b6000602082019050818103600083015261202081611fe4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612083602583611245565b915061208e82612027565b604082019050919050565b600060208201905081810360008301526120b281612076565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612115602383611245565b9150612120826120b9565b604082019050919050565b6000602082019050818103600083015261214481612108565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006121a7602683611245565b91506121b28261214b565b604082019050919050565b600060208201905081810360008301526121d68161219a565b905091905056fea2646970667358221220a1d15fbe58bca5a52e77c4c436d0e20ae08b4f5f9764107e1bc9b686024846b664736f6c63430008130033

Deployed Bytecode

0x6080604052600436106100fe5760003560e01c8063691a8f741161009557806395d89b411161006457806395d89b4114610363578063a457c2d71461038e578063a9059cbb146103cb578063b9c34e5514610408578063dd62ed3e14610433576100fe565b8063691a8f74146102a45780636d3b5b96146102cd57806370a08231146102e957806380c0cc7614610326576100fe565b8063313ce567116100d1578063313ce567146101d357806339509351146101fe5780634a441f1f1461023b5780635e5d59291461027b576100fe565b806306fdde0314610103578063095ea7b31461012e57806318160ddd1461016b57806323b872dd14610196575b600080fd5b34801561010f57600080fd5b50610118610470565b60405161012591906112ca565b60405180910390f35b34801561013a57600080fd5b5061015560048036038101906101509190611394565b610502565b60405161016291906113ef565b60405180910390f35b34801561017757600080fd5b50610180610525565b60405161018d9190611419565b60405180910390f35b3480156101a257600080fd5b506101bd60048036038101906101b89190611434565b61052f565b6040516101ca91906113ef565b60405180910390f35b3480156101df57600080fd5b506101e861055e565b6040516101f591906114a3565b60405180910390f35b34801561020a57600080fd5b5061022560048036038101906102209190611394565b610567565b60405161023291906113ef565b60405180910390f35b34801561024757600080fd5b50610262600480360381019061025d91906114be565b61059e565b60405161027294939291906114fa565b60405180910390f35b34801561028757600080fd5b506102a2600480360381019061029d919061168e565b610676565b005b3480156102b057600080fd5b506102cb60048036038101906102c691906117cb565b6107f6565b005b6102e760048036038101906102e2919061168e565b610a0a565b005b3480156102f557600080fd5b50610310600480360381019061030b919061184e565b610b44565b60405161031d9190611419565b60405180910390f35b34801561033257600080fd5b5061034d600480360381019061034891906114be565b610b8c565b60405161035a9190611419565b60405180910390f35b34801561036f57600080fd5b50610378610ba4565b60405161038591906112ca565b60405180910390f35b34801561039a57600080fd5b506103b560048036038101906103b09190611394565b610c36565b6040516103c291906113ef565b60405180910390f35b3480156103d757600080fd5b506103f260048036038101906103ed9190611394565b610cad565b6040516103ff91906113ef565b60405180910390f35b34801561041457600080fd5b5061041d610cd0565b60405161042a9190611419565b60405180910390f35b34801561043f57600080fd5b5061045a6004803603810190610455919061187b565b610cd6565b6040516104679190611419565b60405180910390f35b60606003805461047f906118ea565b80601f01602080910402602001604051908101604052809291908181526020018280546104ab906118ea565b80156104f85780601f106104cd576101008083540402835291602001916104f8565b820191906000526020600020905b8154815290600101906020018083116104db57829003601f168201915b5050505050905090565b60008061050d610d5d565b905061051a818585610d65565b600191505092915050565b6000600254905090565b60008061053a610d5d565b9050610547858285610f2e565b610552858585610fba565b60019150509392505050565b60006012905090565b600080610572610d5d565b90506105938185856105848589610cd6565b61058e919061194a565b610d65565b600191505092915050565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020180546105ed906118ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610619906118ea565b80156106665780601f1061063b57610100808354040283529160200191610666565b820191906000526020600020905b81548152906001019060200180831161064957829003601f168201915b5050505050908060030154905084565b818151610683919061197e565b3073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b81526004016106be9291906119c0565b602060405180830381865afa1580156106db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ff91906119fe565b1015610737576040517f1a23505e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81518110156107f1573073ffffffffffffffffffffffffffffffffffffffff166323b872dd3384848151811061077357610772611a2b565b5b6020026020010151866040518463ffffffff1660e01b815260040161079a93929190611a5a565b6020604051808303816000875af11580156107b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107dd9190611aa6565b5080806107e990611ad3565b91505061073a565b505050565b60008403610830576040517f6210b64900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80801561083e575060008214155b15610875576040517f1a23505e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180608001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018381525060066000600554815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020190816109279190611cc7565b50606082015181600301559050503073ffffffffffffffffffffffffffffffffffffffff166323b872dd336006600086815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16876040518463ffffffff1660e01b81526004016109a893929190611a5a565b6020604051808303816000875af11580156109c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109eb9190611aa6565b50600560008154809291906109ff90611ad3565b919050555050505050565b34815183610a18919061197e565b14610a4f576040517f1a23505e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8151811015610b3f576000828281518110610a7057610a6f611a2b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1684604051610a9b90611df0565b60006040518083038185875af1925050503d8060008114610ad8576040519150601f19603f3d011682016040523d82523d6000602084013e610add565b606091505b50509050600015158115151480610af45750600084145b15610b2b576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b508080610b3790611ad3565b915050610a52565b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60076020528060005260406000206000915090505481565b606060048054610bb3906118ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610bdf906118ea565b8015610c2c5780601f10610c0157610100808354040283529160200191610c2c565b820191906000526020600020905b815481529060010190602001808311610c0f57829003601f168201915b5050505050905090565b600080610c41610d5d565b90506000610c4f8286610cd6565b905083811015610c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8b90611e77565b60405180910390fd5b610ca18286868403610d65565b60019250505092915050565b600080610cb8610d5d565b9050610cc5818585610fba565b600191505092915050565b60055481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcb90611f09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a90611f9b565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f219190611419565b60405180910390a3505050565b6000610f3a8484610cd6565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610fb45781811015610fa6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9d90612007565b60405180910390fd5b610fb38484848403610d65565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102090612099565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108f9061212b565b60405180910390fd5b6110a3838383611230565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611129576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611120906121bd565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112179190611419565b60405180910390a361122a848484611235565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611274578082015181840152602081019050611259565b60008484015250505050565b6000601f19601f8301169050919050565b600061129c8261123a565b6112a68185611245565b93506112b6818560208601611256565b6112bf81611280565b840191505092915050565b600060208201905081810360008301526112e48184611291565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061132b82611300565b9050919050565b61133b81611320565b811461134657600080fd5b50565b60008135905061135881611332565b92915050565b6000819050919050565b6113718161135e565b811461137c57600080fd5b50565b60008135905061138e81611368565b92915050565b600080604083850312156113ab576113aa6112f6565b5b60006113b985828601611349565b92505060206113ca8582860161137f565b9150509250929050565b60008115159050919050565b6113e9816113d4565b82525050565b600060208201905061140460008301846113e0565b92915050565b6114138161135e565b82525050565b600060208201905061142e600083018461140a565b92915050565b60008060006060848603121561144d5761144c6112f6565b5b600061145b86828701611349565b935050602061146c86828701611349565b925050604061147d8682870161137f565b9150509250925092565b600060ff82169050919050565b61149d81611487565b82525050565b60006020820190506114b86000830184611494565b92915050565b6000602082840312156114d4576114d36112f6565b5b60006114e28482850161137f565b91505092915050565b6114f481611320565b82525050565b600060808201905061150f60008301876114eb565b61151c602083018661140a565b818103604083015261152e8185611291565b905061153d606083018461140a565b95945050505050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61158382611280565b810181811067ffffffffffffffff821117156115a2576115a161154b565b5b80604052505050565b60006115b56112ec565b90506115c1828261157a565b919050565b600067ffffffffffffffff8211156115e1576115e061154b565b5b602082029050602081019050919050565b600080fd5b600061160a611605846115c6565b6115ab565b9050808382526020820190506020840283018581111561162d5761162c6115f2565b5b835b8181101561165657806116428882611349565b84526020840193505060208101905061162f565b5050509392505050565b600082601f83011261167557611674611546565b5b81356116858482602086016115f7565b91505092915050565b600080604083850312156116a5576116a46112f6565b5b60006116b38582860161137f565b925050602083013567ffffffffffffffff8111156116d4576116d36112fb565b5b6116e085828601611660565b9150509250929050565b600080fd5b600067ffffffffffffffff82111561170a5761170961154b565b5b61171382611280565b9050602081019050919050565b82818337600083830152505050565b600061174261173d846116ef565b6115ab565b90508281526020810184848401111561175e5761175d6116ea565b5b611769848285611720565b509392505050565b600082601f83011261178657611785611546565b5b813561179684826020860161172f565b91505092915050565b6117a8816113d4565b81146117b357600080fd5b50565b6000813590506117c58161179f565b92915050565b600080600080608085870312156117e5576117e46112f6565b5b60006117f38782880161137f565b945050602085013567ffffffffffffffff811115611814576118136112fb565b5b61182087828801611771565b93505060406118318782880161137f565b9250506060611842878288016117b6565b91505092959194509250565b600060208284031215611864576118636112f6565b5b600061187284828501611349565b91505092915050565b60008060408385031215611892576118916112f6565b5b60006118a085828601611349565b92505060206118b185828601611349565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061190257607f821691505b602082108103611915576119146118bb565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006119558261135e565b91506119608361135e565b92508282019050808211156119785761197761191b565b5b92915050565b60006119898261135e565b91506119948361135e565b92508282026119a28161135e565b915082820484148315176119b9576119b861191b565b5b5092915050565b60006040820190506119d560008301856114eb565b6119e260208301846114eb565b9392505050565b6000815190506119f881611368565b92915050565b600060208284031215611a1457611a136112f6565b5b6000611a22848285016119e9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000606082019050611a6f60008301866114eb565b611a7c60208301856114eb565b611a89604083018461140a565b949350505050565b600081519050611aa08161179f565b92915050565b600060208284031215611abc57611abb6112f6565b5b6000611aca84828501611a91565b91505092915050565b6000611ade8261135e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611b1057611b0f61191b565b5b600182019050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302611b7d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611b40565b611b878683611b40565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611bc4611bbf611bba8461135e565b611b9f565b61135e565b9050919050565b6000819050919050565b611bde83611ba9565b611bf2611bea82611bcb565b848454611b4d565b825550505050565b600090565b611c07611bfa565b611c12818484611bd5565b505050565b5b81811015611c3657611c2b600082611bff565b600181019050611c18565b5050565b601f821115611c7b57611c4c81611b1b565b611c5584611b30565b81016020851015611c64578190505b611c78611c7085611b30565b830182611c17565b50505b505050565b600082821c905092915050565b6000611c9e60001984600802611c80565b1980831691505092915050565b6000611cb78383611c8d565b9150826002028217905092915050565b611cd08261123a565b67ffffffffffffffff811115611ce957611ce861154b565b5b611cf382546118ea565b611cfe828285611c3a565b600060209050601f831160018114611d315760008415611d1f578287015190505b611d298582611cab565b865550611d91565b601f198416611d3f86611b1b565b60005b82811015611d6757848901518255600182019150602085019450602081019050611d42565b86831015611d845784890151611d80601f891682611c8d565b8355505b6001600288020188555050505b505050505050565b600081905092915050565b7f47656f2043617368000000000000000000000000000000000000000000000000600082015250565b6000611dda600883611d99565b9150611de582611da4565b600882019050919050565b6000611dfb82611dcd565b9150819050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611e61602583611245565b9150611e6c82611e05565b604082019050919050565b60006020820190508181036000830152611e9081611e54565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611ef3602483611245565b9150611efe82611e97565b604082019050919050565b60006020820190508181036000830152611f2281611ee6565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000611f85602283611245565b9150611f9082611f29565b604082019050919050565b60006020820190508181036000830152611fb481611f78565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611ff1601d83611245565b9150611ffc82611fbb565b602082019050919050565b6000602082019050818103600083015261202081611fe4565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612083602583611245565b915061208e82612027565b604082019050919050565b600060208201905081810360008301526120b281612076565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612115602383611245565b9150612120826120b9565b604082019050919050565b6000602082019050818103600083015261214481612108565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006121a7602683611245565b91506121b28261214b565b604082019050919050565b600060208201905081810360008301526121d68161219a565b905091905056fea2646970667358221220a1d15fbe58bca5a52e77c4c436d0e20ae08b4f5f9764107e1bc9b686024846b664736f6c63430008130033

Deployed Bytecode Sourcemap

31738:1923:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20209:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22569:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21338:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23350:261;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21180:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24020:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31816:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;32738:416;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33162:496;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32298:428;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21509:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31882:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20428:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24761:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21842:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31773:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22098:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20209:100;20263:13;20296:5;20289:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20209:100;:::o;22569:201::-;22652:4;22669:13;22685:12;:10;:12::i;:::-;22669:28;;22708:32;22717:5;22724:7;22733:6;22708:8;:32::i;:::-;22758:4;22751:11;;;22569:201;;;;:::o;21338:108::-;21399:7;21426:12;;21419:19;;21338:108;:::o;23350:261::-;23447:4;23464:15;23482:12;:10;:12::i;:::-;23464:30;;23505:38;23521:4;23527:7;23536:6;23505:15;:38::i;:::-;23554:27;23564:4;23570:2;23574:6;23554:9;:27::i;:::-;23599:4;23592:11;;;23350:261;;;;;:::o;21180:93::-;21238:5;21263:2;21256:9;;21180:93;:::o;24020:238::-;24108:4;24125:13;24141:12;:10;:12::i;:::-;24125:28;;24164:64;24173:5;24180:7;24217:10;24189:25;24199:5;24206:7;24189:9;:25::i;:::-;:38;;;;:::i;:::-;24164:8;:64::i;:::-;24246:4;24239:11;;;24020:238;;;;:::o;31816:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32738:416::-;32921:15;32902:9;:16;:34;;;;:::i;:::-;32855:4;32840:31;;;32872:10;32892:4;32840:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:97;32836:149;;;32961:12;;;;;;;;;;;;;;32836:149;33001:9;32996:151;33020:9;:16;33016:1;:20;32996:151;;;33073:4;33058:34;;;33093:10;33105:9;33115:1;33105:12;;;;;;;;:::i;:::-;;;;;;;;33119:15;33058:77;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33038:3;;;;;:::i;:::-;;;;32996:151;;;;32738:416;;:::o;33162:496::-;33304:1;33286:14;:19;33282:54;;33316:17;;;;;;;;;;;;;;33282:54;33350:10;:27;;;;;33376:1;33364:8;:13;;33350:27;33346:57;;;33388:12;;;;;;;;;;;;;;33346:57;33448:69;;;;;;;;33464:10;33448:69;;;;;;33476:14;33448:69;;;;33492:14;33448:69;;;;33508:8;33448:69;;;33413:15;:32;33429:15;;33413:32;;;;;;;;;;;:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33543:4;33528:34;;;33563:10;33575:15;:25;33591:8;33575:25;;;;;;;;;;;:30;;;;;;;;;;;;33607:14;33528:94;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33633:15;;:17;;;;;;;;;:::i;:::-;;;;;;33162:496;;;;:::o;32298:428::-;32446:9;32425;:16;32407:15;:34;;;;:::i;:::-;32406:49;32402:79;;32466:12;;;;;;;;;;;;;;32402:79;32496:9;32491:228;32515:9;:16;32511:1;:20;32491:228;;;32554:9;32569;32579:1;32569:12;;;;;;;;:::i;:::-;;;;;;;;:17;;32594:15;32569:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32553:69;;;32649:5;32641:13;;:4;:13;;;:37;;;;32677:1;32658:15;:20;32641:37;32637:71;;;32689:16;;;;;;;;;;;;;;32637:71;32538:181;32533:3;;;;;:::i;:::-;;;;32491:228;;;;32298:428;;:::o;21509:127::-;21583:7;21610:9;:18;21620:7;21610:18;;;;;;;;;;;;;;;;21603:25;;21509:127;;;:::o;31882:47::-;;;;;;;;;;;;;;;;;:::o;20428:104::-;20484:13;20517:7;20510:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20428:104;:::o;24761:436::-;24854:4;24871:13;24887:12;:10;:12::i;:::-;24871:28;;24910:24;24937:25;24947:5;24954:7;24937:9;:25::i;:::-;24910:52;;25001:15;24981:16;:35;;24973:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;25094:60;25103:5;25110:7;25138:15;25119:16;:34;25094:8;:60::i;:::-;25185:4;25178:11;;;;24761:436;;;;:::o;21842:193::-;21921:4;21938:13;21954:12;:10;:12::i;:::-;21938:28;;21977;21987:5;21994:2;21998:6;21977:9;:28::i;:::-;22023:4;22016:11;;;21842:193;;;;:::o;31773:34::-;;;;:::o;22098:151::-;22187:7;22214:11;:18;22226:5;22214:18;;;;;;;;;;;;;;;:27;22233:7;22214:27;;;;;;;;;;;;;;;;22207:34;;22098:151;;;;:::o;13971:98::-;14024:7;14051:10;14044:17;;13971:98;:::o;28754:346::-;28873:1;28856:19;;:5;:19;;;28848:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28954:1;28935:21;;:7;:21;;;28927:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29038:6;29008:11;:18;29020:5;29008:18;;;;;;;;;;;;;;;:27;29027:7;29008:27;;;;;;;;;;;;;;;:36;;;;29076:7;29060:32;;29069:5;29060:32;;;29085:6;29060:32;;;;;;:::i;:::-;;;;;;;;28754:346;;;:::o;29391:419::-;29492:24;29519:25;29529:5;29536:7;29519:9;:25::i;:::-;29492:52;;29579:17;29559:16;:37;29555:248;;29641:6;29621:16;:26;;29613:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29725:51;29734:5;29741:7;29769:6;29750:16;:25;29725:8;:51::i;:::-;29555:248;29481:329;29391:419;;;:::o;25667:806::-;25780:1;25764:18;;:4;:18;;;25756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25857:1;25843:16;;:2;:16;;;25835:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;25912:38;25933:4;25939:2;25943:6;25912:20;:38::i;:::-;25963:19;25985:9;:15;25995:4;25985:15;;;;;;;;;;;;;;;;25963:37;;26034:6;26019:11;:21;;26011:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;26151:6;26137:11;:20;26119:9;:15;26129:4;26119:15;;;;;;;;;;;;;;;:38;;;;26354:6;26337:9;:13;26347:2;26337:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;26404:2;26389:26;;26398:4;26389:26;;;26408:6;26389:26;;;;;;:::i;:::-;;;;;;;;26428:37;26448:4;26454:2;26458:6;26428:19;:37::i;:::-;25745:728;25667:806;;;:::o;30410:91::-;;;;:::o;31105:90::-;;;;:::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:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:329::-;4912:6;4961:2;4949:9;4940:7;4936:23;4932:32;4929:119;;;4967:79;;:::i;:::-;4929:119;5087:1;5112:53;5157:7;5148:6;5137:9;5133:22;5112:53;:::i;:::-;5102:63;;5058:117;4853:329;;;;:::o;5188:118::-;5275:24;5293:5;5275:24;:::i;:::-;5270:3;5263:37;5188:118;;:::o;5312:644::-;5509:4;5547:3;5536:9;5532:19;5524:27;;5561:71;5629:1;5618:9;5614:17;5605:6;5561:71;:::i;:::-;5642:72;5710:2;5699:9;5695:18;5686:6;5642:72;:::i;:::-;5761:9;5755:4;5751:20;5746:2;5735:9;5731:18;5724:48;5789:78;5862:4;5853:6;5789:78;:::i;:::-;5781:86;;5877:72;5945:2;5934:9;5930:18;5921:6;5877:72;:::i;:::-;5312:644;;;;;;;:::o;5962:117::-;6071:1;6068;6061:12;6085:180;6133:77;6130:1;6123:88;6230:4;6227:1;6220:15;6254:4;6251:1;6244:15;6271:281;6354:27;6376:4;6354:27;:::i;:::-;6346:6;6342:40;6484:6;6472:10;6469:22;6448:18;6436:10;6433:34;6430:62;6427:88;;;6495:18;;:::i;:::-;6427:88;6535:10;6531:2;6524:22;6314:238;6271:281;;:::o;6558:129::-;6592:6;6619:20;;:::i;:::-;6609:30;;6648:33;6676:4;6668:6;6648:33;:::i;:::-;6558:129;;;:::o;6693:311::-;6770:4;6860:18;6852:6;6849:30;6846:56;;;6882:18;;:::i;:::-;6846:56;6932:4;6924:6;6920:17;6912:25;;6992:4;6986;6982:15;6974:23;;6693:311;;;:::o;7010:117::-;7119:1;7116;7109:12;7150:710;7246:5;7271:81;7287:64;7344:6;7287:64;:::i;:::-;7271:81;:::i;:::-;7262:90;;7372:5;7401:6;7394:5;7387:21;7435:4;7428:5;7424:16;7417:23;;7488:4;7480:6;7476:17;7468:6;7464:30;7517:3;7509:6;7506:15;7503:122;;;7536:79;;:::i;:::-;7503:122;7651:6;7634:220;7668:6;7663:3;7660:15;7634:220;;;7743:3;7772:37;7805:3;7793:10;7772:37;:::i;:::-;7767:3;7760:50;7839:4;7834:3;7830:14;7823:21;;7710:144;7694:4;7689:3;7685:14;7678:21;;7634:220;;;7638:21;7252:608;;7150:710;;;;;:::o;7883:370::-;7954:5;8003:3;7996:4;7988:6;7984:17;7980:27;7970:122;;8011:79;;:::i;:::-;7970:122;8128:6;8115:20;8153:94;8243:3;8235:6;8228:4;8220:6;8216:17;8153:94;:::i;:::-;8144:103;;7960:293;7883:370;;;;:::o;8259:684::-;8352:6;8360;8409:2;8397:9;8388:7;8384:23;8380:32;8377:119;;;8415:79;;:::i;:::-;8377:119;8535:1;8560:53;8605:7;8596:6;8585:9;8581:22;8560:53;:::i;:::-;8550:63;;8506:117;8690:2;8679:9;8675:18;8662:32;8721:18;8713:6;8710:30;8707:117;;;8743:79;;:::i;:::-;8707:117;8848:78;8918:7;8909:6;8898:9;8894:22;8848:78;:::i;:::-;8838:88;;8633:303;8259:684;;;;;:::o;8949:117::-;9058:1;9055;9048:12;9072:308;9134:4;9224:18;9216:6;9213:30;9210:56;;;9246:18;;:::i;:::-;9210:56;9284:29;9306:6;9284:29;:::i;:::-;9276:37;;9368:4;9362;9358:15;9350:23;;9072:308;;;:::o;9386:146::-;9483:6;9478:3;9473;9460:30;9524:1;9515:6;9510:3;9506:16;9499:27;9386:146;;;:::o;9538:425::-;9616:5;9641:66;9657:49;9699:6;9657:49;:::i;:::-;9641:66;:::i;:::-;9632:75;;9730:6;9723:5;9716:21;9768:4;9761:5;9757:16;9806:3;9797:6;9792:3;9788:16;9785:25;9782:112;;;9813:79;;:::i;:::-;9782:112;9903:54;9950:6;9945:3;9940;9903:54;:::i;:::-;9622:341;9538:425;;;;;:::o;9983:340::-;10039:5;10088:3;10081:4;10073:6;10069:17;10065:27;10055:122;;10096:79;;:::i;:::-;10055:122;10213:6;10200:20;10238:79;10313:3;10305:6;10298:4;10290:6;10286:17;10238:79;:::i;:::-;10229:88;;10045:278;9983:340;;;;:::o;10329:116::-;10399:21;10414:5;10399:21;:::i;:::-;10392:5;10389:32;10379:60;;10435:1;10432;10425:12;10379:60;10329:116;:::o;10451:133::-;10494:5;10532:6;10519:20;10510:29;;10548:30;10572:5;10548:30;:::i;:::-;10451:133;;;;:::o;10590:939::-;10683:6;10691;10699;10707;10756:3;10744:9;10735:7;10731:23;10727:33;10724:120;;;10763:79;;:::i;:::-;10724:120;10883:1;10908:53;10953:7;10944:6;10933:9;10929:22;10908:53;:::i;:::-;10898:63;;10854:117;11038:2;11027:9;11023:18;11010:32;11069:18;11061:6;11058:30;11055:117;;;11091:79;;:::i;:::-;11055:117;11196:63;11251:7;11242:6;11231:9;11227:22;11196:63;:::i;:::-;11186:73;;10981:288;11308:2;11334:53;11379:7;11370:6;11359:9;11355:22;11334:53;:::i;:::-;11324:63;;11279:118;11436:2;11462:50;11504:7;11495:6;11484:9;11480:22;11462:50;:::i;:::-;11452:60;;11407:115;10590:939;;;;;;;:::o;11535:329::-;11594:6;11643:2;11631:9;11622:7;11618:23;11614:32;11611:119;;;11649:79;;:::i;:::-;11611:119;11769:1;11794:53;11839:7;11830:6;11819:9;11815:22;11794:53;:::i;:::-;11784:63;;11740:117;11535:329;;;;:::o;11870:474::-;11938:6;11946;11995:2;11983:9;11974:7;11970:23;11966:32;11963:119;;;12001:79;;:::i;:::-;11963:119;12121:1;12146:53;12191:7;12182:6;12171:9;12167:22;12146:53;:::i;:::-;12136:63;;12092:117;12248:2;12274:53;12319:7;12310:6;12299:9;12295:22;12274:53;:::i;:::-;12264:63;;12219:118;11870:474;;;;;:::o;12350:180::-;12398:77;12395:1;12388:88;12495:4;12492:1;12485:15;12519:4;12516:1;12509:15;12536:320;12580:6;12617:1;12611:4;12607:12;12597:22;;12664:1;12658:4;12654:12;12685:18;12675:81;;12741:4;12733:6;12729:17;12719:27;;12675:81;12803:2;12795:6;12792:14;12772:18;12769:38;12766:84;;12822:18;;:::i;:::-;12766:84;12587:269;12536:320;;;:::o;12862:180::-;12910:77;12907:1;12900:88;13007:4;13004:1;12997:15;13031:4;13028:1;13021:15;13048:191;13088:3;13107:20;13125:1;13107:20;:::i;:::-;13102:25;;13141:20;13159:1;13141:20;:::i;:::-;13136:25;;13184:1;13181;13177:9;13170:16;;13205:3;13202:1;13199:10;13196:36;;;13212:18;;:::i;:::-;13196:36;13048:191;;;;:::o;13245:410::-;13285:7;13308:20;13326:1;13308:20;:::i;:::-;13303:25;;13342:20;13360:1;13342:20;:::i;:::-;13337:25;;13397:1;13394;13390:9;13419:30;13437:11;13419:30;:::i;:::-;13408:41;;13598:1;13589:7;13585:15;13582:1;13579:22;13559:1;13552:9;13532:83;13509:139;;13628:18;;:::i;:::-;13509:139;13293:362;13245:410;;;;:::o;13661:332::-;13782:4;13820:2;13809:9;13805:18;13797:26;;13833:71;13901:1;13890:9;13886:17;13877:6;13833:71;:::i;:::-;13914:72;13982:2;13971:9;13967:18;13958:6;13914:72;:::i;:::-;13661:332;;;;;:::o;13999:143::-;14056:5;14087:6;14081:13;14072:22;;14103:33;14130:5;14103:33;:::i;:::-;13999:143;;;;:::o;14148:351::-;14218:6;14267:2;14255:9;14246:7;14242:23;14238:32;14235:119;;;14273:79;;:::i;:::-;14235:119;14393:1;14418:64;14474:7;14465:6;14454:9;14450:22;14418:64;:::i;:::-;14408:74;;14364:128;14148:351;;;;:::o;14505:180::-;14553:77;14550:1;14543:88;14650:4;14647:1;14640:15;14674:4;14671:1;14664:15;14691:442;14840:4;14878:2;14867:9;14863:18;14855:26;;14891:71;14959:1;14948:9;14944:17;14935:6;14891:71;:::i;:::-;14972:72;15040:2;15029:9;15025:18;15016:6;14972:72;:::i;:::-;15054;15122:2;15111:9;15107:18;15098:6;15054:72;:::i;:::-;14691:442;;;;;;:::o;15139:137::-;15193:5;15224:6;15218:13;15209:22;;15240:30;15264:5;15240:30;:::i;:::-;15139:137;;;;:::o;15282:345::-;15349:6;15398:2;15386:9;15377:7;15373:23;15369:32;15366:119;;;15404:79;;:::i;:::-;15366:119;15524:1;15549:61;15602:7;15593:6;15582:9;15578:22;15549:61;:::i;:::-;15539:71;;15495:125;15282:345;;;;:::o;15633:233::-;15672:3;15695:24;15713:5;15695:24;:::i;:::-;15686:33;;15741:66;15734:5;15731:77;15728:103;;15811:18;;:::i;:::-;15728:103;15858:1;15851:5;15847:13;15840:20;;15633:233;;;:::o;15872:141::-;15921:4;15944:3;15936:11;;15967:3;15964:1;15957:14;16001:4;15998:1;15988:18;15980:26;;15872:141;;;:::o;16019:93::-;16056:6;16103:2;16098;16091:5;16087:14;16083:23;16073:33;;16019:93;;;:::o;16118:107::-;16162:8;16212:5;16206:4;16202:16;16181:37;;16118:107;;;;:::o;16231:393::-;16300:6;16350:1;16338:10;16334:18;16373:97;16403:66;16392:9;16373:97;:::i;:::-;16491:39;16521:8;16510:9;16491:39;:::i;:::-;16479:51;;16563:4;16559:9;16552:5;16548:21;16539:30;;16612:4;16602:8;16598:19;16591:5;16588:30;16578:40;;16307:317;;16231:393;;;;;:::o;16630:60::-;16658:3;16679:5;16672:12;;16630:60;;;:::o;16696:142::-;16746:9;16779:53;16797:34;16806:24;16824:5;16806:24;:::i;:::-;16797:34;:::i;:::-;16779:53;:::i;:::-;16766:66;;16696:142;;;:::o;16844:75::-;16887:3;16908:5;16901:12;;16844:75;;;:::o;16925:269::-;17035:39;17066:7;17035:39;:::i;:::-;17096:91;17145:41;17169:16;17145:41;:::i;:::-;17137:6;17130:4;17124:11;17096:91;:::i;:::-;17090:4;17083:105;17001:193;16925:269;;;:::o;17200:73::-;17245:3;17200:73;:::o;17279:189::-;17356:32;;:::i;:::-;17397:65;17455:6;17447;17441:4;17397:65;:::i;:::-;17332:136;17279:189;;:::o;17474:186::-;17534:120;17551:3;17544:5;17541:14;17534:120;;;17605:39;17642:1;17635:5;17605:39;:::i;:::-;17578:1;17571:5;17567:13;17558:22;;17534:120;;;17474:186;;:::o;17666:543::-;17767:2;17762:3;17759:11;17756:446;;;17801:38;17833:5;17801:38;:::i;:::-;17885:29;17903:10;17885:29;:::i;:::-;17875:8;17871:44;18068:2;18056:10;18053:18;18050:49;;;18089:8;18074:23;;18050:49;18112:80;18168:22;18186:3;18168:22;:::i;:::-;18158:8;18154:37;18141:11;18112:80;:::i;:::-;17771:431;;17756:446;17666:543;;;:::o;18215:117::-;18269:8;18319:5;18313:4;18309:16;18288:37;;18215:117;;;;:::o;18338:169::-;18382:6;18415:51;18463:1;18459:6;18451:5;18448:1;18444:13;18415:51;:::i;:::-;18411:56;18496:4;18490;18486:15;18476:25;;18389:118;18338:169;;;;:::o;18512:295::-;18588:4;18734:29;18759:3;18753:4;18734:29;:::i;:::-;18726:37;;18796:3;18793:1;18789:11;18783:4;18780:21;18772:29;;18512:295;;;;:::o;18812:1395::-;18929:37;18962:3;18929:37;:::i;:::-;19031:18;19023:6;19020:30;19017:56;;;19053:18;;:::i;:::-;19017:56;19097:38;19129:4;19123:11;19097:38;:::i;:::-;19182:67;19242:6;19234;19228:4;19182:67;:::i;:::-;19276:1;19300:4;19287:17;;19332:2;19324:6;19321:14;19349:1;19344:618;;;;20006:1;20023:6;20020:77;;;20072:9;20067:3;20063:19;20057:26;20048:35;;20020:77;20123:67;20183:6;20176:5;20123:67;:::i;:::-;20117:4;20110:81;19979:222;19314:887;;19344:618;19396:4;19392:9;19384:6;19380:22;19430:37;19462:4;19430:37;:::i;:::-;19489:1;19503:208;19517:7;19514:1;19511:14;19503:208;;;19596:9;19591:3;19587:19;19581:26;19573:6;19566:42;19647:1;19639:6;19635:14;19625:24;;19694:2;19683:9;19679:18;19666:31;;19540:4;19537:1;19533:12;19528:17;;19503:208;;;19739:6;19730:7;19727:19;19724:179;;;19797:9;19792:3;19788:19;19782:26;19840:48;19882:4;19874:6;19870:17;19859:9;19840:48;:::i;:::-;19832:6;19825:64;19747:156;19724:179;19949:1;19945;19937:6;19933:14;19929:22;19923:4;19916:36;19351:611;;;19314:887;;18904:1303;;;18812:1395;;:::o;20213:147::-;20314:11;20351:3;20336:18;;20213:147;;;;:::o;20366:158::-;20506:10;20502:1;20494:6;20490:14;20483:34;20366:158;:::o;20530:398::-;20689:3;20710:83;20791:1;20786:3;20710:83;:::i;:::-;20703:90;;20802:93;20891:3;20802:93;:::i;:::-;20920:1;20915:3;20911:11;20904:18;;20530:398;;;:::o;20934:379::-;21118:3;21140:147;21283:3;21140:147;:::i;:::-;21133:154;;21304:3;21297:10;;20934:379;;;:::o;21319:224::-;21459:34;21455:1;21447:6;21443:14;21436:58;21528:7;21523:2;21515:6;21511:15;21504:32;21319:224;:::o;21549:366::-;21691:3;21712:67;21776:2;21771:3;21712:67;:::i;:::-;21705:74;;21788:93;21877:3;21788:93;:::i;:::-;21906:2;21901:3;21897:12;21890:19;;21549:366;;;:::o;21921:419::-;22087:4;22125:2;22114:9;22110:18;22102:26;;22174:9;22168:4;22164:20;22160:1;22149:9;22145:17;22138:47;22202:131;22328:4;22202:131;:::i;:::-;22194:139;;21921:419;;;:::o;22346:223::-;22486:34;22482:1;22474:6;22470:14;22463:58;22555:6;22550:2;22542:6;22538:15;22531:31;22346:223;:::o;22575:366::-;22717:3;22738:67;22802:2;22797:3;22738:67;:::i;:::-;22731:74;;22814:93;22903:3;22814:93;:::i;:::-;22932:2;22927:3;22923:12;22916:19;;22575:366;;;:::o;22947:419::-;23113:4;23151:2;23140:9;23136:18;23128:26;;23200:9;23194:4;23190:20;23186:1;23175:9;23171:17;23164:47;23228:131;23354:4;23228:131;:::i;:::-;23220:139;;22947:419;;;:::o;23372:221::-;23512:34;23508:1;23500:6;23496:14;23489:58;23581:4;23576:2;23568:6;23564:15;23557:29;23372:221;:::o;23599:366::-;23741:3;23762:67;23826:2;23821:3;23762:67;:::i;:::-;23755:74;;23838:93;23927:3;23838:93;:::i;:::-;23956:2;23951:3;23947:12;23940:19;;23599:366;;;:::o;23971:419::-;24137:4;24175:2;24164:9;24160:18;24152:26;;24224:9;24218:4;24214:20;24210:1;24199:9;24195:17;24188:47;24252:131;24378:4;24252:131;:::i;:::-;24244:139;;23971:419;;;:::o;24396:179::-;24536:31;24532:1;24524:6;24520:14;24513:55;24396:179;:::o;24581:366::-;24723:3;24744:67;24808:2;24803:3;24744:67;:::i;:::-;24737:74;;24820:93;24909:3;24820:93;:::i;:::-;24938:2;24933:3;24929:12;24922:19;;24581:366;;;:::o;24953:419::-;25119:4;25157:2;25146:9;25142:18;25134:26;;25206:9;25200:4;25196:20;25192:1;25181:9;25177:17;25170:47;25234:131;25360:4;25234:131;:::i;:::-;25226:139;;24953:419;;;:::o;25378:224::-;25518:34;25514:1;25506:6;25502:14;25495:58;25587:7;25582:2;25574:6;25570:15;25563:32;25378:224;:::o;25608:366::-;25750:3;25771:67;25835:2;25830:3;25771:67;:::i;:::-;25764:74;;25847:93;25936:3;25847:93;:::i;:::-;25965:2;25960:3;25956:12;25949:19;;25608:366;;;:::o;25980:419::-;26146:4;26184:2;26173:9;26169:18;26161:26;;26233:9;26227:4;26223:20;26219:1;26208:9;26204:17;26197:47;26261:131;26387:4;26261:131;:::i;:::-;26253:139;;25980:419;;;:::o;26405:222::-;26545:34;26541:1;26533:6;26529:14;26522:58;26614:5;26609:2;26601:6;26597:15;26590:30;26405:222;:::o;26633:366::-;26775:3;26796:67;26860:2;26855:3;26796:67;:::i;:::-;26789:74;;26872:93;26961:3;26872:93;:::i;:::-;26990:2;26985:3;26981:12;26974:19;;26633:366;;;:::o;27005:419::-;27171:4;27209:2;27198:9;27194:18;27186:26;;27258:9;27252:4;27248:20;27244:1;27233:9;27229:17;27222:47;27286:131;27412:4;27286:131;:::i;:::-;27278:139;;27005:419;;;:::o;27430:225::-;27570:34;27566:1;27558:6;27554:14;27547:58;27639:8;27634:2;27626:6;27622:15;27615:33;27430:225;:::o;27661:366::-;27803:3;27824:67;27888:2;27883:3;27824:67;:::i;:::-;27817:74;;27900:93;27989:3;27900:93;:::i;:::-;28018:2;28013:3;28009:12;28002:19;;27661:366;;;:::o;28033:419::-;28199:4;28237:2;28226:9;28222:18;28214:26;;28286:9;28280:4;28276:20;28272:1;28261:9;28257:17;28250:47;28314:131;28440:4;28314:131;:::i;:::-;28306:139;;28033:419;;;:::o

Swarm Source

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