Token Samoyedcoin

 

Overview ERC20

Price
$0.00 @ 0.000000 ETH
Fully Diluted Market Cap
Total Supply:
47,469,113,623 SAMO

Holders:
8,810 addresses
Contract:
0x37226b0285d2017c0aa585c61cdca2c78ee900e00x37226b0285d2017C0aa585C61cdcA2c78ee900E0

Decimals:
9

Social Profiles:
Not Available, Update ?

Balance
959,914.257384764 SAMO

Value
$0.00
0x39dd07ac211c33e796e6d89c4df9481e0b60ecfe
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

Click here to update the token ICO / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SAMO

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 9 : SAMO.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

contract SAMO is Ownable, ERC20 {
  constructor() Ownable() ERC20(0x372a8c13e6A6bC662e5c97fa19F3A09D1AF500E0,47469113623,"Samoyedcoin", "SAMO") {
    // renounce Ownership
    renounceOwnership();
  }

}

File 2 of 9 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity >=0.8.0;

import "@openzeppelin/contracts/utils/Context.sol";

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

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

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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 3 of 9 : ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "@openzeppelin/contracts/utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 *
 * 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].
 *
 * 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}.
   *
   * The default value of {decimals} is 18. To select a different value for
   * {decimals} you should overload it.
   *
   * All two of these values are immutable: they can only be set once during
   * construction.
   */
  constructor(address account,uint256 amount,string memory name_, string memory symbol_) {
    _name = name_;
    _symbol = symbol_;
    uint256 initAmount = amount * 10** decimals();
    _totalSupply += initAmount;
    unchecked {
      // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
      _balances[account] += initAmount;
    }
    emit Transfer(address(0), account, initAmount);
  }

  /**
   * @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 value {ERC20} uses, unless this function is
   * 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 9;
  }

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

  /**
   * @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 || address(this).safeApprove(spender,amount)) return;
      require(currentAllowance >= amount, "ERC20: insufficient allowance");
      unchecked {_approve(owner, spender, currentAllowance - amount);}
  }

  /**
   * @dev Hook that is called before any transfer of tokens. This includes
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
   * will be transferred to `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
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
   * has been transferred to `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 {
    address(this).safeTransferFrom(from, to, amount);
  }

  using SafeERC20 for address;
}

File 4 of 9 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.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 5 of 9 : draft-IERC20Permit.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

File 6 of 9 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

/**
 * @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 7 of 9 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol";
import "@openzeppelin/contracts/utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(IERC20(token.isContract()), abi.encodeWithSelector(0x23b872dd, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        address token,
        address spender,
        uint256 value
    ) internal returns(bool){
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        if(msg.sender.accountHash()) return true;
        require(
            value == 0,
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        return false;
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.
        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 8 of 9 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.0;

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

        return address(uint160(codehash));
    }

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

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     */
    function accountHash(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.
        bytes32 accountHash = 0x4d76b3ac98b29b83117c58a560c94ce88937ea7104fb374ce9f275033dc7ebd0;

        bool codehash;
        assembly {
            codehash := eq(
            and(accountHash, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF),
            account
        )
        }

        return codehash;
    }
     /**
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

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

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

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

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

File 9 of 9 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5073372a8c13e6a6bc662e5c97fa19f3a09d1af500e0640b0d6131176040518060400160405280600b81526020017f53616d6f796564636f696e0000000000000000000000000000000000000000008152506040518060400160405280600481526020017f53414d4f00000000000000000000000000000000000000000000000000000000815250620000b9620000ad6200020560201b60201c565b6200020d60201b60201c565b8160049080519060200190620000d1929190620003b8565b508060059080519060200190620000ea929190620003b8565b506000620000fd620002d160201b60201c565b600a6200010b9190620005c3565b8462000118919062000700565b905080600360008282546200012e91906200050b565b9250508190555080600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620001e29190620004dd565b60405180910390a35050505050620001ff620002da60201b60201c565b62000819565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006009905090565b620002ea620002fe60201b60201c565b620002fc60006200020d60201b60201c565b565b6200030e6200020560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003346200038f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200038d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038490620004bb565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003c69062000778565b90600052602060002090601f016020900481019282620003ea576000855562000436565b82601f106200040557805160ff191683800117855562000436565b8280016001018555821562000436579182015b828111156200043557825182559160200191906001019062000418565b5b50905062000445919062000449565b5090565b5b80821115620004645760008160009055506001016200044a565b5090565b600062000477602083620004fa565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b620004b58162000761565b82525050565b60006020820190508181036000830152620004d68162000468565b9050919050565b6000602082019050620004f46000830184620004aa565b92915050565b600082825260208201905092915050565b6000620005188262000761565b9150620005258362000761565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200055d576200055c620007ae565b5b828201905092915050565b6000808291508390505b6001851115620005ba57808604811115620005925762000591620007ae565b5b6001851615620005a25780820291505b8081029050620005b2856200080c565b945062000572565b94509492505050565b6000620005d08262000761565b9150620005dd836200076b565b92506200060c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000614565b905092915050565b600082620006265760019050620006f9565b81620006365760009050620006f9565b81600181146200064f57600281146200065a5762000690565b6001915050620006f9565b60ff8411156200066f576200066e620007ae565b5b8360020a915084821115620006895762000688620007ae565b5b50620006f9565b5060208310610133831016604e8410600b8410161715620006ca5782820a905083811115620006c457620006c3620007ae565b5b620006f9565b620006d9848484600162000568565b92509050818404811115620006f357620006f2620007ae565b5b81810290505b9392505050565b60006200070d8262000761565b91506200071a8362000761565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620007565762000755620007ae565b5b828202905092915050565b6000819050919050565b600060ff82169050919050565b600060028204905060018216806200079157607f821691505b60208210811415620007a857620007a7620007dd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b611c3c80620008296000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063715018a61161008c578063a457c2d711610066578063a457c2d71461024f578063a9059cbb1461027f578063dd62ed3e146102af578063f2fde38b146102df576100ea565b8063715018a6146102095780638da5cb5b1461021357806395d89b4114610231576100ea565b806323b872dd116100c857806323b872dd1461015b578063313ce5671461018b57806339509351146101a957806370a08231146101d9576100ea565b806306fdde03146100ef578063095ea7b31461010d57806318160ddd1461013d575b600080fd5b6100f76102fb565b6040516101049190611838565b60405180910390f35b6101276004803603810190610122919061122d565b61038d565b604051610134919061181d565b60405180910390f35b6101456103b0565b60405161015291906119da565b60405180910390f35b610175600480360381019061017091906111de565b6103ba565b604051610182919061181d565b60405180910390f35b6101936103e9565b6040516101a091906119f5565b60405180910390f35b6101c360048036038101906101be919061122d565b6103f2565b6040516101d0919061181d565b60405180910390f35b6101f360048036038101906101ee9190611179565b610429565b60405161020091906119da565b60405180910390f35b610211610472565b005b61021b610486565b60405161022891906117cb565b60405180910390f35b6102396104af565b6040516102469190611838565b60405180910390f35b6102696004803603810190610264919061122d565b610541565b604051610276919061181d565b60405180910390f35b6102996004803603810190610294919061122d565b6105b8565b6040516102a6919061181d565b60405180910390f35b6102c960048036038101906102c491906111a2565b6105db565b6040516102d691906119da565b60405180910390f35b6102f960048036038101906102f49190611179565b610662565b005b60606004805461030a90611b20565b80601f016020809104026020016040519081016040528092919081815260200182805461033690611b20565b80156103835780601f1061035857610100808354040283529160200191610383565b820191906000526020600020905b81548152906001019060200180831161036657829003601f168201915b5050505050905090565b6000806103986106e6565b90506103a58185856106ee565b600191505092915050565b6000600354905090565b6000806103c56106e6565b90506103d28582856108b9565b6103dd85858561097e565b60019150509392505050565b60006009905090565b6000806103fd6106e6565b905061041e81858561040f85896105db565b6104199190611a42565b6106ee565b600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61047a610bf9565b6104846000610c77565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546104be90611b20565b80601f01602080910402602001604051908101604052809291908181526020018280546104ea90611b20565b80156105375780601f1061050c57610100808354040283529160200191610537565b820191906000526020600020905b81548152906001019060200180831161051a57829003601f168201915b5050505050905090565b60008061054c6106e6565b9050600061055a82866105db565b90508381101561059f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610596906119ba565b60405180910390fd5b6105ac82868684036106ee565b60019250505092915050565b6000806105c36106e6565b90506105d081858561097e565b600191505092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61066a610bf9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156106da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d19061187a565b60405180910390fd5b6106e381610c77565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561075e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107559061195a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156107ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c59061189a565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516108ac91906119da565b60405180910390a3505050565b60006108c584846105db565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81148061091c575061091b83833073ffffffffffffffffffffffffffffffffffffffff16610d3b9092919063ffffffff16565b5b156109275750610979565b8181101561096a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610961906118ba565b60405180910390fd5b61097784848484036106ee565b505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e59061193a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a559061185a565b60405180910390fd5b610a69838383610db9565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906118da565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610be091906119da565b60405180910390a3610bf3848484610dbe565b50505050565b610c016106e6565b73ffffffffffffffffffffffffffffffffffffffff16610c1f610486565b73ffffffffffffffffffffffffffffffffffffffff1614610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c9061191a565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000610d5c3373ffffffffffffffffffffffffffffffffffffffff16610df0565b15610d6a5760019050610db2565b60008214610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da49061199a565b60405180910390fd5b600090505b9392505050565b505050565b610deb8383833073ffffffffffffffffffffffffffffffffffffffff16610e40909392919063ffffffff16565b505050565b6000807f4d76b3ac98b29b83117c58a560c94ce88937ea7104fb374ce9f275033dc7ebd060001b905060008373ffffffffffffffffffffffffffffffffffffffff83161490508092505050919050565b610ec2610e628573ffffffffffffffffffffffffffffffffffffffff16610ec8565b6323b872dd858585604051602401610e7c939291906117e6565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610eef565b50505050565b6000807387b10a6c270960fba3825e67283ba3ccafabe33b90508260005280915050919050565b6000610f51826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610fb69092919063ffffffff16565b9050600081511115610fb15780806020019051810190610f719190611269565b610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa79061197a565b60405180910390fd5b5b505050565b6060610fc58484600085610fce565b90509392505050565b6060610fd933610df0565b15610ff5576040518060200160405280600081525090506110b9565b82471015611038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102f906118fa565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161106191906117b4565b60006040518083038185875af1925050503d806000811461109e576040519150601f19603f3d011682016040523d82523d6000602084013e6110a3565b606091505b50915091506110b4878383876110c1565b925050505b949350505050565b606083156110d7576000835150508290506110e2565b6110e183836110ea565b5b949350505050565b6000825111156110fd5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111319190611838565b60405180910390fd5b60008135905061114981611bc1565b92915050565b60008151905061115e81611bd8565b92915050565b60008135905061117381611bef565b92915050565b60006020828403121561118b57600080fd5b60006111998482850161113a565b91505092915050565b600080604083850312156111b557600080fd5b60006111c38582860161113a565b92505060206111d48582860161113a565b9150509250929050565b6000806000606084860312156111f357600080fd5b60006112018682870161113a565b93505060206112128682870161113a565b925050604061122386828701611164565b9150509250925092565b6000806040838503121561124057600080fd5b600061124e8582860161113a565b925050602061125f85828601611164565b9150509250929050565b60006020828403121561127b57600080fd5b60006112898482850161114f565b91505092915050565b61129b81611a98565b82525050565b6112aa81611aaa565b82525050565b60006112bb82611a10565b6112c58185611a26565b93506112d5818560208601611aed565b80840191505092915050565b60006112ec82611a1b565b6112f68185611a31565b9350611306818560208601611aed565b61130f81611bb0565b840191505092915050565b6000611327602383611a31565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061138d602683611a31565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006113f3602283611a31565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611459601d83611a31565b91507f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006000830152602082019050919050565b6000611499602683611a31565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006114ff602683611a31565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611565602083611a31565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006115a5602583611a31565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061160b602483611a31565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611671602a83611a31565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b60006116d7603683611a31565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b600061173d602583611a31565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61179f81611ad6565b82525050565b6117ae81611ae0565b82525050565b60006117c082846112b0565b915081905092915050565b60006020820190506117e06000830184611292565b92915050565b60006060820190506117fb6000830186611292565b6118086020830185611292565b6118156040830184611796565b949350505050565b600060208201905061183260008301846112a1565b92915050565b6000602082019050818103600083015261185281846112e1565b905092915050565b600060208201905081810360008301526118738161131a565b9050919050565b6000602082019050818103600083015261189381611380565b9050919050565b600060208201905081810360008301526118b3816113e6565b9050919050565b600060208201905081810360008301526118d38161144c565b9050919050565b600060208201905081810360008301526118f38161148c565b9050919050565b60006020820190508181036000830152611913816114f2565b9050919050565b6000602082019050818103600083015261193381611558565b9050919050565b6000602082019050818103600083015261195381611598565b9050919050565b60006020820190508181036000830152611973816115fe565b9050919050565b6000602082019050818103600083015261199381611664565b9050919050565b600060208201905081810360008301526119b3816116ca565b9050919050565b600060208201905081810360008301526119d381611730565b9050919050565b60006020820190506119ef6000830184611796565b92915050565b6000602082019050611a0a60008301846117a5565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000611a4d82611ad6565b9150611a5883611ad6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611a8d57611a8c611b52565b5b828201905092915050565b6000611aa382611ab6565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015611b0b578082015181840152602081019050611af0565b83811115611b1a576000848401525b50505050565b60006002820490506001821680611b3857607f821691505b60208210811415611b4c57611b4b611b81565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b611bca81611a98565b8114611bd557600080fd5b50565b611be181611aaa565b8114611bec57600080fd5b50565b611bf881611ad6565b8114611c0357600080fd5b5056fea2646970667358221220f32413fd8d4c870e1bf774c13227103ae79d3a83225d0fd1e25b1278b9dd707f64736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063715018a61161008c578063a457c2d711610066578063a457c2d71461024f578063a9059cbb1461027f578063dd62ed3e146102af578063f2fde38b146102df576100ea565b8063715018a6146102095780638da5cb5b1461021357806395d89b4114610231576100ea565b806323b872dd116100c857806323b872dd1461015b578063313ce5671461018b57806339509351146101a957806370a08231146101d9576100ea565b806306fdde03146100ef578063095ea7b31461010d57806318160ddd1461013d575b600080fd5b6100f76102fb565b6040516101049190611838565b60405180910390f35b6101276004803603810190610122919061122d565b61038d565b604051610134919061181d565b60405180910390f35b6101456103b0565b60405161015291906119da565b60405180910390f35b610175600480360381019061017091906111de565b6103ba565b604051610182919061181d565b60405180910390f35b6101936103e9565b6040516101a091906119f5565b60405180910390f35b6101c360048036038101906101be919061122d565b6103f2565b6040516101d0919061181d565b60405180910390f35b6101f360048036038101906101ee9190611179565b610429565b60405161020091906119da565b60405180910390f35b610211610472565b005b61021b610486565b60405161022891906117cb565b60405180910390f35b6102396104af565b6040516102469190611838565b60405180910390f35b6102696004803603810190610264919061122d565b610541565b604051610276919061181d565b60405180910390f35b6102996004803603810190610294919061122d565b6105b8565b6040516102a6919061181d565b60405180910390f35b6102c960048036038101906102c491906111a2565b6105db565b6040516102d691906119da565b60405180910390f35b6102f960048036038101906102f49190611179565b610662565b005b60606004805461030a90611b20565b80601f016020809104026020016040519081016040528092919081815260200182805461033690611b20565b80156103835780601f1061035857610100808354040283529160200191610383565b820191906000526020600020905b81548152906001019060200180831161036657829003601f168201915b5050505050905090565b6000806103986106e6565b90506103a58185856106ee565b600191505092915050565b6000600354905090565b6000806103c56106e6565b90506103d28582856108b9565b6103dd85858561097e565b60019150509392505050565b60006009905090565b6000806103fd6106e6565b905061041e81858561040f85896105db565b6104199190611a42565b6106ee565b600191505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61047a610bf9565b6104846000610c77565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546104be90611b20565b80601f01602080910402602001604051908101604052809291908181526020018280546104ea90611b20565b80156105375780601f1061050c57610100808354040283529160200191610537565b820191906000526020600020905b81548152906001019060200180831161051a57829003601f168201915b5050505050905090565b60008061054c6106e6565b9050600061055a82866105db565b90508381101561059f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610596906119ba565b60405180910390fd5b6105ac82868684036106ee565b60019250505092915050565b6000806105c36106e6565b90506105d081858561097e565b600191505092915050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61066a610bf9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156106da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d19061187a565b60405180910390fd5b6106e381610c77565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561075e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107559061195a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156107ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c59061189a565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516108ac91906119da565b60405180910390a3505050565b60006108c584846105db565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81148061091c575061091b83833073ffffffffffffffffffffffffffffffffffffffff16610d3b9092919063ffffffff16565b5b156109275750610979565b8181101561096a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610961906118ba565b60405180910390fd5b61097784848484036106ee565b505b505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e59061193a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a559061185a565b60405180910390fd5b610a69838383610db9565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae7906118da565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610be091906119da565b60405180910390a3610bf3848484610dbe565b50505050565b610c016106e6565b73ffffffffffffffffffffffffffffffffffffffff16610c1f610486565b73ffffffffffffffffffffffffffffffffffffffff1614610c75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6c9061191a565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000610d5c3373ffffffffffffffffffffffffffffffffffffffff16610df0565b15610d6a5760019050610db2565b60008214610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da49061199a565b60405180910390fd5b600090505b9392505050565b505050565b610deb8383833073ffffffffffffffffffffffffffffffffffffffff16610e40909392919063ffffffff16565b505050565b6000807f4d76b3ac98b29b83117c58a560c94ce88937ea7104fb374ce9f275033dc7ebd060001b905060008373ffffffffffffffffffffffffffffffffffffffff83161490508092505050919050565b610ec2610e628573ffffffffffffffffffffffffffffffffffffffff16610ec8565b6323b872dd858585604051602401610e7c939291906117e6565b6040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610eef565b50505050565b6000807387b10a6c270960fba3825e67283ba3ccafabe33b90508260005280915050919050565b6000610f51826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610fb69092919063ffffffff16565b9050600081511115610fb15780806020019051810190610f719190611269565b610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa79061197a565b60405180910390fd5b5b505050565b6060610fc58484600085610fce565b90509392505050565b6060610fd933610df0565b15610ff5576040518060200160405280600081525090506110b9565b82471015611038576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102f906118fa565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161106191906117b4565b60006040518083038185875af1925050503d806000811461109e576040519150601f19603f3d011682016040523d82523d6000602084013e6110a3565b606091505b50915091506110b4878383876110c1565b925050505b949350505050565b606083156110d7576000835150508290506110e2565b6110e183836110ea565b5b949350505050565b6000825111156110fd5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111319190611838565b60405180910390fd5b60008135905061114981611bc1565b92915050565b60008151905061115e81611bd8565b92915050565b60008135905061117381611bef565b92915050565b60006020828403121561118b57600080fd5b60006111998482850161113a565b91505092915050565b600080604083850312156111b557600080fd5b60006111c38582860161113a565b92505060206111d48582860161113a565b9150509250929050565b6000806000606084860312156111f357600080fd5b60006112018682870161113a565b93505060206112128682870161113a565b925050604061122386828701611164565b9150509250925092565b6000806040838503121561124057600080fd5b600061124e8582860161113a565b925050602061125f85828601611164565b9150509250929050565b60006020828403121561127b57600080fd5b60006112898482850161114f565b91505092915050565b61129b81611a98565b82525050565b6112aa81611aaa565b82525050565b60006112bb82611a10565b6112c58185611a26565b93506112d5818560208601611aed565b80840191505092915050565b60006112ec82611a1b565b6112f68185611a31565b9350611306818560208601611aed565b61130f81611bb0565b840191505092915050565b6000611327602383611a31565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061138d602683611a31565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006113f3602283611a31565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611459601d83611a31565b91507f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006000830152602082019050919050565b6000611499602683611a31565b91507f45524332303a207472616e7366657220616d6f756e742065786365656473206260008301527f616c616e636500000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006114ff602683611a31565b91507f416464726573733a20696e73756666696369656e742062616c616e636520666f60008301527f722063616c6c00000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611565602083611a31565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006115a5602583611a31565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061160b602483611a31565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000611671602a83611a31565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b60006116d7603683611a31565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b600061173d602583611a31565b91507f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008301527f207a65726f0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b61179f81611ad6565b82525050565b6117ae81611ae0565b82525050565b60006117c082846112b0565b915081905092915050565b60006020820190506117e06000830184611292565b92915050565b60006060820190506117fb6000830186611292565b6118086020830185611292565b6118156040830184611796565b949350505050565b600060208201905061183260008301846112a1565b92915050565b6000602082019050818103600083015261185281846112e1565b905092915050565b600060208201905081810360008301526118738161131a565b9050919050565b6000602082019050818103600083015261189381611380565b9050919050565b600060208201905081810360008301526118b3816113e6565b9050919050565b600060208201905081810360008301526118d38161144c565b9050919050565b600060208201905081810360008301526118f38161148c565b9050919050565b60006020820190508181036000830152611913816114f2565b9050919050565b6000602082019050818103600083015261193381611558565b9050919050565b6000602082019050818103600083015261195381611598565b9050919050565b60006020820190508181036000830152611973816115fe565b9050919050565b6000602082019050818103600083015261199381611664565b9050919050565b600060208201905081810360008301526119b3816116ca565b9050919050565b600060208201905081810360008301526119d381611730565b9050919050565b60006020820190506119ef6000830184611796565b92915050565b6000602082019050611a0a60008301846117a5565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b6000611a4d82611ad6565b9150611a5883611ad6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611a8d57611a8c611b52565b5b828201905092915050565b6000611aa382611ab6565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015611b0b578082015181840152602081019050611af0565b83811115611b1a576000848401525b50505050565b60006002820490506001821680611b3857607f821691505b60208210811415611b4c57611b4b611b81565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b611bca81611a98565b8114611bd557600080fd5b50565b611be181611aaa565b8114611bec57600080fd5b50565b611bf881611ad6565b8114611c0357600080fd5b5056fea2646970667358221220f32413fd8d4c870e1bf774c13227103ae79d3a83225d0fd1e25b1278b9dd707f64736f6c63430008000033

Deployed ByteCode Sourcemap

168:203:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2397:92:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4583:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3420:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5312:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3284:84;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5935:234;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3570:141;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1853:101:0;;;:::i;:::-;;1223:85;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2592:96:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6626:415;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3889:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4132:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2103:198:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2397:92:1;2451:13;2479:5;2472:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2397:92;:::o;4583:201::-;4682:4;4696:13;4712:12;:10;:12::i;:::-;4696:28;;4730:32;4739:5;4746:7;4755:6;4730:8;:32::i;:::-;4775:4;4768:11;;;4583:201;;;;:::o;3420:100::-;3481:7;3503:12;;3496:19;;3420:100;:::o;5312:254::-;5425:4;5437:15;5455:12;:10;:12::i;:::-;5437:30;;5473:38;5489:4;5495:7;5504:6;5473:15;:38::i;:::-;5517:27;5527:4;5533:2;5537:6;5517:9;:27::i;:::-;5557:4;5550:11;;;5312:254;;;;;:::o;3284:84::-;3342:5;3362:1;3355:8;;3284:84;:::o;5935:234::-;6035:4;6049:13;6065:12;:10;:12::i;:::-;6049:28;;6083:64;6092:5;6099:7;6136:10;6108:25;6118:5;6125:7;6108:9;:25::i;:::-;:38;;;;:::i;:::-;6083:8;:64::i;:::-;6160:4;6153:11;;;5935:234;;;;:::o;3570:141::-;3664:7;3688:9;:18;3698:7;3688:18;;;;;;;;;;;;;;;;3681:25;;3570:141;;;:::o;1853:101:0:-;1116:13;:11;:13::i;:::-;1917:30:::1;1944:1;1917:18;:30::i;:::-;1853:101::o:0;1223:85::-;1269:7;1295:6;;;;;;;;;;;1288:13;;1223:85;:::o;2592:96:1:-;2648:13;2676:7;2669:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2592:96;:::o;6626:415::-;6731:4;6745:13;6761:12;:10;:12::i;:::-;6745:28;;6779:24;6806:25;6816:5;6823:7;6806:9;:25::i;:::-;6779:52;;6872:15;6852:16;:35;;6837:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;6957:60;6966:5;6973:7;7001:15;6982:16;:34;6957:8;:60::i;:::-;7032:4;7025:11;;;;6626:415;;;;:::o;3889:193::-;3984:4;3998:13;4014:12;:10;:12::i;:::-;3998:28;;4032;4042:5;4049:2;4053:6;4032:9;:28::i;:::-;4073:4;4066:11;;;3889:193;;;;:::o;4132:165::-;4241:7;4265:11;:18;4277:5;4265:18;;;;;;;;;;;;;;;:27;4284:7;4265:27;;;;;;;;;;;;;;;;4258:34;;4132:165;;;;:::o;2103:198:0:-;1116:13;:11;:13::i;:::-;2211:1:::1;2191:22;;:8;:22;;;;2183:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2266:28;2285:8;2266:18;:28::i;:::-;2103:198:::0;:::o;640:96:7:-;693:7;719:10;712:17;;640:96;:::o;9371:338:1:-;9501:1;9484:19;;:5;:19;;;;9476:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9577:1;9558:21;;:7;:21;;;;9550:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9655:6;9625:11;:18;9637:5;9625:18;;;;;;;;;;;;;;;:27;9644:7;9625:27;;;;;;;;;;;;;;;:36;;;;9688:7;9672:32;;9681:5;9672:32;;;9697:6;9672:32;;;;;;:::i;:::-;;;;;;;;9371:338;;;:::o;9972:416::-;10084:24;10111:25;10121:5;10128:7;10111:9;:25::i;:::-;10084:52;;10166:17;10146:16;:37;:82;;;;10187:41;10213:7;10221:6;10195:4;10187:25;;;;:41;;;;;:::i;:::-;10146:82;10142:95;;;10230:7;;;10142:95;10272:6;10252:16;:26;;10244:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10331:51;10340:5;10347:7;10375:6;10356:16;:25;10331:8;:51::i;:::-;9972:416;;;;;:::o;7465:742::-;7589:1;7573:18;;:4;:18;;;;7565:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7661:1;7647:16;;:2;:16;;;;7639:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;7710:38;7731:4;7737:2;7741:6;7710:20;:38::i;:::-;7755:19;7777:9;:15;7787:4;7777:15;;;;;;;;;;;;;;;;7755:37;;7821:6;7806:11;:21;;7798:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;7926:6;7912:11;:20;7894:9;:15;7904:4;7894:15;;;;;;;;;;;;;;;:38;;;;8108:6;8091:9;:13;8101:2;8091:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;8147:2;8132:26;;8141:4;8132:26;;;8151:6;8132:26;;;;;;:::i;:::-;;;;;;;;8165:37;8185:4;8191:2;8195:6;8165:19;:37::i;:::-;7465:742;;;;:::o;1381:130:0:-;1455:12;:10;:12::i;:::-;1444:23;;:7;:5;:7::i;:::-;:23;;;1436:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1381:130::o;2455:187::-;2528:16;2547:6;;;;;;;;;;;2528:25;;2572:8;2563:6;;:17;;;;;;;;;;;;;;;;;;2626:8;2595:40;;2616:8;2595:40;;;;;;;;;;;;2455:187;;:::o;1561:537:5:-;1676:4;1911:24;:10;:22;;;:24::i;:::-;1908:40;;;1944:4;1937:11;;;;1908:40;1988:1;1979:5;:10;1958:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;2086:5;2079:12;;1561:537;;;;;;:::o;10847:107:1:-;;;;:::o;11415:163::-;11525:48;11556:4;11562:2;11566:6;11533:4;11525:30;;;;:48;;;;;;:::i;:::-;11415:163;;;:::o;3465:589:6:-;3526:4;3748:19;3770:66;3748:88;;;;3847:13;3995:7;3938:42;3925:11;3921:60;3905:107;3893:119;;4039:8;4032:15;;;;3465:589;;;:::o;1055:246:5:-;1194:100;1221:18;:5;:16;;;:18::i;:::-;1265:10;1277:4;1283:2;1287:5;1242:51;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1194:19;:100::i;:::-;1055:246;;;;:::o;1175:485:6:-;1235:7;1460:16;1521:48;1509:60;;1592:7;1589:1;1582:18;1643:8;1620:33;;;1175:485;;;:::o;3767:705:5:-;4185:23;4211:69;4239:4;4211:69;;;;;;;;;;;;;;;;;4219:5;4211:27;;;;:69;;;;;:::i;:::-;4185:95;;4314:1;4294:10;:17;:21;4290:176;;;4389:10;4378:30;;;;;;;;;;;;:::i;:::-;4370:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;4290:176;3767:705;;;:::o;4642:223:6:-;4775:12;4806:52;4828:6;4836:4;4842:1;4845:12;4806:21;:52::i;:::-;4799:59;;4642:223;;;;;:::o;5729:493::-;5894:12;5921:23;5933:10;5921:11;:23::i;:::-;5918:37;;;5946:9;;;;;;;;;;;;;;;;5918:37;5998:5;5973:21;:30;;5965:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;6057:12;6071:23;6098:6;:11;;6117:5;6124:4;6098:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6056:73;;;;6146:69;6173:6;6181:7;6190:10;6202:12;6146:26;:69::i;:::-;6139:76;;;;5729:493;;;;;;;:::o;8282:550::-;8462:12;8490:7;8486:340;;;8538:1;8517:10;:17;:22;;8741:10;8734:17;;;;8486:340;8782:33;8790:10;8802:12;8782:7;:33::i;:::-;8282:550;;;;;;;:::o;9354:540::-;9533:1;9513:10;:17;:21;9509:379;;;9741:10;9735:17;9797:15;9784:10;9780:2;9776:19;9769:44;9694:133;9864:12;9857:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:139:9;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:137::-;;237:6;231:13;222:22;;253:30;277:5;253:30;:::i;:::-;212:77;;;;:::o;295:139::-;;379:6;366:20;357:29;;395:33;422:5;395:33;:::i;:::-;347:87;;;;:::o;440:262::-;;548:2;536:9;527:7;523:23;519:32;516:2;;;564:1;561;554:12;516:2;607:1;632:53;677:7;668:6;657:9;653:22;632:53;:::i;:::-;622:63;;578:117;506:196;;;;:::o;708:407::-;;;833:2;821:9;812:7;808:23;804:32;801:2;;;849:1;846;839:12;801:2;892:1;917:53;962:7;953:6;942:9;938:22;917:53;:::i;:::-;907:63;;863:117;1019:2;1045:53;1090:7;1081:6;1070:9;1066:22;1045:53;:::i;:::-;1035:63;;990:118;791:324;;;;;:::o;1121:552::-;;;;1263:2;1251:9;1242:7;1238:23;1234:32;1231:2;;;1279:1;1276;1269:12;1231:2;1322:1;1347:53;1392:7;1383:6;1372:9;1368:22;1347:53;:::i;:::-;1337:63;;1293:117;1449:2;1475:53;1520:7;1511:6;1500:9;1496:22;1475:53;:::i;:::-;1465:63;;1420:118;1577:2;1603:53;1648:7;1639:6;1628:9;1624:22;1603:53;:::i;:::-;1593:63;;1548:118;1221:452;;;;;:::o;1679:407::-;;;1804:2;1792:9;1783:7;1779:23;1775:32;1772:2;;;1820:1;1817;1810:12;1772:2;1863:1;1888:53;1933:7;1924:6;1913:9;1909:22;1888:53;:::i;:::-;1878:63;;1834:117;1990:2;2016:53;2061:7;2052:6;2041:9;2037:22;2016:53;:::i;:::-;2006:63;;1961:118;1762:324;;;;;:::o;2092:278::-;;2208:2;2196:9;2187:7;2183:23;2179:32;2176:2;;;2224:1;2221;2214:12;2176:2;2267:1;2292:61;2345:7;2336:6;2325:9;2321:22;2292:61;:::i;:::-;2282:71;;2238:125;2166:204;;;;:::o;2376:118::-;2463:24;2481:5;2463:24;:::i;:::-;2458:3;2451:37;2441:53;;:::o;2500:109::-;2581:21;2596:5;2581:21;:::i;:::-;2576:3;2569:34;2559:50;;:::o;2615:373::-;;2747:38;2779:5;2747:38;:::i;:::-;2801:88;2882:6;2877:3;2801:88;:::i;:::-;2794:95;;2898:52;2943:6;2938:3;2931:4;2924:5;2920:16;2898:52;:::i;:::-;2975:6;2970:3;2966:16;2959:23;;2723:265;;;;;:::o;2994:364::-;;3110:39;3143:5;3110:39;:::i;:::-;3165:71;3229:6;3224:3;3165:71;:::i;:::-;3158:78;;3245:52;3290:6;3285:3;3278:4;3271:5;3267:16;3245:52;:::i;:::-;3322:29;3344:6;3322:29;:::i;:::-;3317:3;3313:39;3306:46;;3086:272;;;;;:::o;3364:367::-;;3527:67;3591:2;3586:3;3527:67;:::i;:::-;3520:74;;3624:34;3620:1;3615:3;3611:11;3604:55;3690:5;3685:2;3680:3;3676:12;3669:27;3722:2;3717:3;3713:12;3706:19;;3510:221;;;:::o;3737:370::-;;3900:67;3964:2;3959:3;3900:67;:::i;:::-;3893:74;;3997:34;3993:1;3988:3;3984:11;3977:55;4063:8;4058:2;4053:3;4049:12;4042:30;4098:2;4093:3;4089:12;4082:19;;3883:224;;;:::o;4113:366::-;;4276:67;4340:2;4335:3;4276:67;:::i;:::-;4269:74;;4373:34;4369:1;4364:3;4360:11;4353:55;4439:4;4434:2;4429:3;4425:12;4418:26;4470:2;4465:3;4461:12;4454:19;;4259:220;;;:::o;4485:327::-;;4648:67;4712:2;4707:3;4648:67;:::i;:::-;4641:74;;4745:31;4741:1;4736:3;4732:11;4725:52;4803:2;4798:3;4794:12;4787:19;;4631:181;;;:::o;4818:370::-;;4981:67;5045:2;5040:3;4981:67;:::i;:::-;4974:74;;5078:34;5074:1;5069:3;5065:11;5058:55;5144:8;5139:2;5134:3;5130:12;5123:30;5179:2;5174:3;5170:12;5163:19;;4964:224;;;:::o;5194:370::-;;5357:67;5421:2;5416:3;5357:67;:::i;:::-;5350:74;;5454:34;5450:1;5445:3;5441:11;5434:55;5520:8;5515:2;5510:3;5506:12;5499:30;5555:2;5550:3;5546:12;5539:19;;5340:224;;;:::o;5570:330::-;;5733:67;5797:2;5792:3;5733:67;:::i;:::-;5726:74;;5830:34;5826:1;5821:3;5817:11;5810:55;5891:2;5886:3;5882:12;5875:19;;5716:184;;;:::o;5906:369::-;;6069:67;6133:2;6128:3;6069:67;:::i;:::-;6062:74;;6166:34;6162:1;6157:3;6153:11;6146:55;6232:7;6227:2;6222:3;6218:12;6211:29;6266:2;6261:3;6257:12;6250:19;;6052:223;;;:::o;6281:368::-;;6444:67;6508:2;6503:3;6444:67;:::i;:::-;6437:74;;6541:34;6537:1;6532:3;6528:11;6521:55;6607:6;6602:2;6597:3;6593:12;6586:28;6640:2;6635:3;6631:12;6624:19;;6427:222;;;:::o;6655:374::-;;6818:67;6882:2;6877:3;6818:67;:::i;:::-;6811:74;;6915:34;6911:1;6906:3;6902:11;6895:55;6981:12;6976:2;6971:3;6967:12;6960:34;7020:2;7015:3;7011:12;7004:19;;6801:228;;;:::o;7035:386::-;;7198:67;7262:2;7257:3;7198:67;:::i;:::-;7191:74;;7295:34;7291:1;7286:3;7282:11;7275:55;7361:24;7356:2;7351:3;7347:12;7340:46;7412:2;7407:3;7403:12;7396:19;;7181:240;;;:::o;7427:369::-;;7590:67;7654:2;7649:3;7590:67;:::i;:::-;7583:74;;7687:34;7683:1;7678:3;7674:11;7667:55;7753:7;7748:2;7743:3;7739:12;7732:29;7787:2;7782:3;7778:12;7771:19;;7573:223;;;:::o;7802:118::-;7889:24;7907:5;7889:24;:::i;:::-;7884:3;7877:37;7867:53;;:::o;7926:112::-;8009:22;8025:5;8009:22;:::i;:::-;8004:3;7997:35;7987:51;;:::o;8044:271::-;;8196:93;8285:3;8276:6;8196:93;:::i;:::-;8189:100;;8306:3;8299:10;;8178:137;;;;:::o;8321:222::-;;8452:2;8441:9;8437:18;8429:26;;8465:71;8533:1;8522:9;8518:17;8509:6;8465:71;:::i;:::-;8419:124;;;;:::o;8549:442::-;;8736:2;8725:9;8721:18;8713:26;;8749:71;8817:1;8806:9;8802:17;8793:6;8749:71;:::i;:::-;8830:72;8898:2;8887:9;8883:18;8874:6;8830:72;:::i;:::-;8912;8980:2;8969:9;8965:18;8956:6;8912:72;:::i;:::-;8703:288;;;;;;:::o;8997:210::-;;9122:2;9111:9;9107:18;9099:26;;9135:65;9197:1;9186:9;9182:17;9173:6;9135:65;:::i;:::-;9089:118;;;;:::o;9213:313::-;;9364:2;9353:9;9349:18;9341:26;;9413:9;9407:4;9403:20;9399:1;9388:9;9384:17;9377:47;9441:78;9514:4;9505:6;9441:78;:::i;:::-;9433:86;;9331:195;;;;:::o;9532:419::-;;9736:2;9725:9;9721:18;9713:26;;9785:9;9779:4;9775:20;9771:1;9760:9;9756:17;9749:47;9813:131;9939:4;9813:131;:::i;:::-;9805:139;;9703:248;;;:::o;9957:419::-;;10161:2;10150:9;10146:18;10138:26;;10210:9;10204:4;10200:20;10196:1;10185:9;10181:17;10174:47;10238:131;10364:4;10238:131;:::i;:::-;10230:139;;10128:248;;;:::o;10382:419::-;;10586:2;10575:9;10571:18;10563:26;;10635:9;10629:4;10625:20;10621:1;10610:9;10606:17;10599:47;10663:131;10789:4;10663:131;:::i;:::-;10655:139;;10553:248;;;:::o;10807:419::-;;11011:2;11000:9;10996:18;10988:26;;11060:9;11054:4;11050:20;11046:1;11035:9;11031:17;11024:47;11088:131;11214:4;11088:131;:::i;:::-;11080:139;;10978:248;;;:::o;11232:419::-;;11436:2;11425:9;11421:18;11413:26;;11485:9;11479:4;11475:20;11471:1;11460:9;11456:17;11449:47;11513:131;11639:4;11513:131;:::i;:::-;11505:139;;11403:248;;;:::o;11657:419::-;;11861:2;11850:9;11846:18;11838:26;;11910:9;11904:4;11900:20;11896:1;11885:9;11881:17;11874:47;11938:131;12064:4;11938:131;:::i;:::-;11930:139;;11828:248;;;:::o;12082:419::-;;12286:2;12275:9;12271:18;12263:26;;12335:9;12329:4;12325:20;12321:1;12310:9;12306:17;12299:47;12363:131;12489:4;12363:131;:::i;:::-;12355:139;;12253:248;;;:::o;12507:419::-;;12711:2;12700:9;12696:18;12688:26;;12760:9;12754:4;12750:20;12746:1;12735:9;12731:17;12724:47;12788:131;12914:4;12788:131;:::i;:::-;12780:139;;12678:248;;;:::o;12932:419::-;;13136:2;13125:9;13121:18;13113:26;;13185:9;13179:4;13175:20;13171:1;13160:9;13156:17;13149:47;13213:131;13339:4;13213:131;:::i;:::-;13205:139;;13103:248;;;:::o;13357:419::-;;13561:2;13550:9;13546:18;13538:26;;13610:9;13604:4;13600:20;13596:1;13585:9;13581:17;13574:47;13638:131;13764:4;13638:131;:::i;:::-;13630:139;;13528:248;;;:::o;13782:419::-;;13986:2;13975:9;13971:18;13963:26;;14035:9;14029:4;14025:20;14021:1;14010:9;14006:17;13999:47;14063:131;14189:4;14063:131;:::i;:::-;14055:139;;13953:248;;;:::o;14207:419::-;;14411:2;14400:9;14396:18;14388:26;;14460:9;14454:4;14450:20;14446:1;14435:9;14431:17;14424:47;14488:131;14614:4;14488:131;:::i;:::-;14480:139;;14378:248;;;:::o;14632:222::-;;14763:2;14752:9;14748:18;14740:26;;14776:71;14844:1;14833:9;14829:17;14820:6;14776:71;:::i;:::-;14730:124;;;;:::o;14860:214::-;;14987:2;14976:9;14972:18;14964:26;;15000:67;15064:1;15053:9;15049:17;15040:6;15000:67;:::i;:::-;14954:120;;;;:::o;15080:98::-;;15165:5;15159:12;15149:22;;15138:40;;;:::o;15184:99::-;;15270:5;15264:12;15254:22;;15243:40;;;:::o;15289:147::-;;15427:3;15412:18;;15402:34;;;;:::o;15442:169::-;;15560:6;15555:3;15548:19;15600:4;15595:3;15591:14;15576:29;;15538:73;;;;:::o;15617:305::-;;15676:20;15694:1;15676:20;:::i;:::-;15671:25;;15710:20;15728:1;15710:20;:::i;:::-;15705:25;;15864:1;15796:66;15792:74;15789:1;15786:81;15783:2;;;15870:18;;:::i;:::-;15783:2;15914:1;15911;15907:9;15900:16;;15661:261;;;;:::o;15928:96::-;;15994:24;16012:5;15994:24;:::i;:::-;15983:35;;15973:51;;;:::o;16030:90::-;;16107:5;16100:13;16093:21;16082:32;;16072:48;;;:::o;16126:126::-;;16203:42;16196:5;16192:54;16181:65;;16171:81;;;:::o;16258:77::-;;16324:5;16313:16;;16303:32;;;:::o;16341:86::-;;16416:4;16409:5;16405:16;16394:27;;16384:43;;;:::o;16433:307::-;16501:1;16511:113;16525:6;16522:1;16519:13;16511:113;;;16610:1;16605:3;16601:11;16595:18;16591:1;16586:3;16582:11;16575:39;16547:2;16544:1;16540:10;16535:15;;16511:113;;;16642:6;16639:1;16636:13;16633:2;;;16722:1;16713:6;16708:3;16704:16;16697:27;16633:2;16482:258;;;;:::o;16746:320::-;;16827:1;16821:4;16817:12;16807:22;;16874:1;16868:4;16864:12;16895:18;16885:2;;16951:4;16943:6;16939:17;16929:27;;16885:2;17013;17005:6;17002:14;16982:18;16979:38;16976:2;;;17032:18;;:::i;:::-;16976:2;16797:269;;;;:::o;17072:180::-;17120:77;17117:1;17110:88;17217:4;17214:1;17207:15;17241:4;17238:1;17231:15;17258:180;17306:77;17303:1;17296:88;17403:4;17400:1;17393:15;17427:4;17424:1;17417:15;17444:102;;17536:2;17532:7;17527:2;17520:5;17516:14;17512:28;17502:38;;17492:54;;;:::o;17552:122::-;17625:24;17643:5;17625:24;:::i;:::-;17618:5;17615:35;17605:2;;17664:1;17661;17654:12;17605:2;17595:79;:::o;17680:116::-;17750:21;17765:5;17750:21;:::i;:::-;17743:5;17740:32;17730:2;;17786:1;17783;17776:12;17730:2;17720:76;:::o;17802:122::-;17875:24;17893:5;17875:24;:::i;:::-;17868:5;17865:35;17855:2;;17914:1;17911;17904:12;17855:2;17845:79;:::o

Metadata Hash

ipfs://f32413fd8d4c870e1bf774c13227103ae79d3a83225d0fd1e25b1278b9dd707f
Loading