ETH Price: $3,962.61 (+2.31%)

Token

Heroes of Mavia (MAVIA)
 

Overview

Max Total Supply

250,000,000 MAVIA

Holders

36,250 ( 0.003%)

Market

Price

$1.44 @ 0.000363 ETH (+4.61%)

Onchain Market Cap

$360,000,000.00

Circulating Supply Market Cap

$45,694,643.00

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 MAVIA

Value
$0.00
0x78ce6533fa6eb3b0d3879659095a1a3ddab1a0da
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Heroes of Mavia is a mobile multiplayer Web3 strategy game where players use their base and army to battle other players. Players can earn in-game Legendary Items” through our “Mass Ownership” model, powered by Ruby flagship premium earn-only currency.

Market

Volume (24H):$8,790,960.00
Market Capitalization:$45,694,643.00
Circulating Supply:31,531,000.00 MAVIA
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
1
Gate.io
MAVIA-USDT$1.45
0.0003656 Eth
$2,343,654.00
1,619,442.480 MAVIA
26.4070%
2
Bybit
MAVIA-USDT$1.45
0.0003658 Eth
$1,654,848.00
1,142,895.720 MAVIA
18.6363%
3
BTSE
MAVIA-USDT$1.44
0.0003633 Eth
$694,037.00
482,188.800 MAVIA
7.8627%
4
Bitget
MAVIA-USDT$1.45
0.0003661 Eth
$679,247.00
472,766.040 MAVIA
7.7090%
5
OrangeX
MAVIA-USDT$1.44
0.0003638 Eth
$460,268.00
319,602.800 MAVIA
5.2115%
6
BitMart
MAVIA-USDT$1.44
0.0003640 Eth
$438,655.00
303,997.300 MAVIA
4.9571%
7
KuCoin
MAVIA-USDT$1.45
0.0003648 Eth
$420,012.00
290,439.364 MAVIA
4.7360%
8
MEXC
MAVIA-USDT$1.44
0.0003645 Eth
$270,319.00
187,246.610 MAVIA
3.0533%
9
Hotcoin
MAVIA-USDT$1.46
0.0003678 Eth
$251,804.00
172,618.784 MAVIA
2.8148%
10
Bitrue
MAVIA-USDT$1.45
0.0003661 Eth
$240,674.00
165,761.000 MAVIA
2.7029%
11
Uniswap V3 (Ethereum)
0X24FCFC492C1393274B6BCD568AC9E225BEC93584-0XC02AAA39B223FE8D0A0E5C4F27EAD9083C756CC2$1.44
0.0003636 Eth
$224,994.00
152,969.373 0X24FCFC492C1393274B6BCD568AC9E225BEC93584
2.4944%
12
BingX
MAVIA-USDT$1.45
0.0003661 Eth
$208,469.00
143,984.329 MAVIA
2.3478%
13
Aerodrome (Base)
0X24FCFC492C1393274B6BCD568AC9E225BEC93584-0X4200000000000000000000000000000000000006$1.45
0.0003650 Eth
$204,615.00
139,330.105 0X24FCFC492C1393274B6BCD568AC9E225BEC93584
2.2720%
14
Ourbit
MAVIA-USDT$1.44
0.0003638 Eth
$148,405.00
102,480.070 MAVIA
1.6711%
15
AscendEX (BitMax)
MAVIA-USDT$1.44
0.0003631 Eth
$148,062.00
102,874.000 MAVIA
1.6775%
16
Bitunix
MAVIA-USDT$1.44
0.0003645 Eth
$95,946.00
66,465.320 MAVIA
1.0838%
17
Bitvavo
MAVIA-EUR$1.44
0.0003635 Eth
$79,863.00
55,466.140 MAVIA
0.9044%
18
HTX
MAVIA-USDT$1.46
0.0003676 Eth
$76,696.00
53,213.071 MAVIA
0.8677%
19
Bilaxy
MAVIA-ETH$1.55
0.0003904 Eth
$71,099.00
45,938.400 MAVIA
0.7491%
20
Hibt
MAVIA-USDT$1.45
0.0003645 Eth
$34,493.00
23,836.107 MAVIA
0.3887%
21
Bitkub
MAVIA-THB$1.45
0.0003659 Eth
$33,305.00
22,967.619 MAVIA
0.3745%
22
Phemex
MAVIA-USDT$1.44
0.0003630 Eth
$32,459.00
22,572.602 MAVIA
0.3681%
23
LATOKEN
MAVIA-USDT$1.44
0.0003643 Eth
$28,410.00
19,696.638 MAVIA
0.3212%
24
Crypto.com Exchange
MAVIA-USD$1.45
0.0003659 Eth
$27,357.00
18,865.400 MAVIA
0.3076%
25
CoinEx
MAVIA-USDT$1.46
0.0003670 Eth
$22,166.00
15,466.262 MAVIA
0.2522%
26
WOO X
MAVIA-USDT$1.45
0.0003667 Eth
$14,340.32
9,861.300 MAVIA
0.1608%
27
Uniswap V3 (Base)
0X24FCFC492C1393274B6BCD568AC9E225BEC93584-0X4200000000000000000000000000000000000006$1.45
0.0003650 Eth
$12,962.23
8,748.691 0X24FCFC492C1393274B6BCD568AC9E225BEC93584
0.1427%
28
WEEX
MAVIA-USDT$1.46
0.0003668 Eth
$6,575.16
4,554.300 MAVIA
0.0743%
29
Kanga
MAVIA-USDT$1.44
0.0003647 Eth
$5,843.51
0.000 MAVIA
0.0000%
30
Coinone
MAVIA-KRW$1.43
0.0003613 Eth
$5,827.98
4,070.051 MAVIA
0.0664%
31
CoinDCX
MAVIA-INR$1.59
0.0003997 Eth
$4,928.31
0.000 MAVIA
0.0000%
32
Tothemoon
MAVIA-USDT$1.45
0.0003653 Eth
$4,038.68
2,788.712 MAVIA
0.0455%
33
ProBit Global
MAVIA-USDT$1.48
0.0003724 Eth
$3,210.28
2,174.602 MAVIA
0.0355%
34
XT.COM
MAVIA-USDT$1.48
0.0003722 Eth
$2,892.67
2,139.590 MAVIA
0.0349%
35
Crypto.com Exchange
MAVIA-USDT$1.51
0.0003807 Eth
$1,376.35
912.100 MAVIA
0.0149%
36
Coins.ph
MAVIA-PHP$1.48
0.0003727 Eth
$1,058.30
737.780 MAVIA
0.0120%
37
Mudrex
MAVIA-USDT$1.45
0.0003654 Eth
$432.44
298.702 MAVIA
0.0049%
38
NovaDAX
MAVIA-BRL$1.49
0.0003773 Eth
$117.98
78.970 MAVIA
0.0013%
39
Bittime
MAVIA-IDR$1.45
0.0003648 Eth
$24.28
17.384 MAVIA
0.0003%
40
Poloniex
MAVIA-USDT$1.35
0.0003403 Eth
$20.15
14.925 MAVIA
0.0002%

Contract Source Code Verified (Exact Match)

Contract Name:
MaviaToken

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, MIT license, Audited
File 1 of 12 : MaviaToken.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";

contract MaviaToken is ERC20, AccessControl {
  using SafeERC20 for IERC20;
  uint256 private constant _MAX_UINT = type(uint256).max;
  bytes32 private constant _EDITOR_ROLE = keccak256("_EDITOR_ROLE");
  bytes32 private constant _EMERGENCY_ROLE = keccak256("_EMERGENCY_ROLE");

  bytes32 private _DOMAIN_SEPARATOR;
  // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
  bytes32 private constant _PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
  mapping(address => uint) public nonces;

  mapping(address => bool) public blacklist;
  mapping(address => bool) public whitelist;
  uint256 public tfStartTime;
  uint256 public tfMaxAmount;

  event ESetBlacklist(address indexed _pAddr, bool _pIsBlacklist);
  event ESetWhitelist(address indexed _pAddr, bool _pIsWhitelist);
  event ESetGateway(address indexed _pAddr, bool _pIsGateway);
  event ESetTradeTime(uint256 _pStartTime, uint256 _pMaxAmount);
  event EEmerERC20Tokens(IERC20 indexed _pToken, address _pTo);

  constructor() ERC20("Heroes of Mavia", "MAVIA") {
    _DOMAIN_SEPARATOR = keccak256(
      abi.encode(
        keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
        keccak256(bytes("TokenPermit")),
        keccak256(bytes("1")),
        block.chainid,
        address(this)
      )
    );

    address sender_ = _msgSender();
    _setupRole(DEFAULT_ADMIN_ROLE, sender_);
    _setupRole(_EDITOR_ROLE, sender_);

    tfMaxAmount = _MAX_UINT;
    _mint(sender_, 250_000_000 * 1e18);
  }

  function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external {
    require(deadline >= block.timestamp, "Sig: EXPIRED");
    bytes32 digest = keccak256(
      abi.encodePacked(
        "\x19\x01",
        _DOMAIN_SEPARATOR,
        keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
      )
    );
    address recoveredAddress = ecrecover(digest, v, r, s);
    require(recoveredAddress != address(0) && recoveredAddress == owner, "Sig: INVALID_SIGNATURE");
    _approve(owner, spender, value);
  }

  /**
   * @dev Allow burn
   */
  function fBurn(uint256 _pAmount) external {
    _burn(_msgSender(), _pAmount);
  }

  function fSetBlacklist(address _pAddr, bool _pIsBlacklist) external onlyRole(_EDITOR_ROLE) {
    require(_pAddr != address(0), "Invalid address");
    blacklist[_pAddr] = _pIsBlacklist;
    emit ESetBlacklist(_pAddr, _pIsBlacklist);
  }

  function fSetWhitelist(address _pAddr, bool _pIsWhitelist) external onlyRole(_EDITOR_ROLE) {
    require(_pAddr != address(0), "Invalid address");
    whitelist[_pAddr] = _pIsWhitelist;
    emit ESetWhitelist(_pAddr, _pIsWhitelist);
  }

  function fSetTradeTime(uint256 _pStartTime, uint256 _pMaxAmount) external onlyRole(_EDITOR_ROLE) {
    tfStartTime = _pStartTime;
    tfMaxAmount = _pMaxAmount;
    emit ESetTradeTime(_pStartTime, _pMaxAmount);
  }

  function fEmerERC20Tokens(IERC20 _pToken, address _pTo) external onlyRole(_EMERGENCY_ROLE) {
    require(_pTo != address(0), "Invalid address");
    uint256 bal_ = _pToken.balanceOf(address(this));
    _pToken.safeTransfer(_pTo, bal_);
    emit EEmerERC20Tokens(_pToken, _pTo);
  }

  /**
   * @dev Override ERC20 transfer the tokens
   */
  function _transfer(address _pSender, address _pRecipient, uint256 _pAmount) internal override {
    require(!blacklist[_pSender] && !blacklist[_pRecipient], "Blacklist");
    if (!whitelist[_pSender] && !whitelist[_pRecipient]) {
      require(block.timestamp >= tfStartTime, "Invalid time");
      require(_pAmount <= tfMaxAmount, "Invalid amount");
    }
    super._transfer(_pSender, _pRecipient, _pAmount);
  }
}

File 2 of 12 : AccessControl.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

File 3 of 12 : IAccessControl.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

File 4 of 12 : ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @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.zeppelin.solutions/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(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 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 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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), 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}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, 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;
        _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;
        }
        _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 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 5 of 12 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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

File 6 of 12 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../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 12 : SafeERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../../../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(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, 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(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // 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'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    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));
        }
    }

    /**
     * @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 12 : Address.sol
// SPDX-License-Identifier: MIT

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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 9 of 12 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 10 of 12 : Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

File 11 of 12 : ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 12 of 12 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "istanbul",
  "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":"contract IERC20","name":"_pToken","type":"address"},{"indexed":false,"internalType":"address","name":"_pTo","type":"address"}],"name":"EEmerERC20Tokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_pAddr","type":"address"},{"indexed":false,"internalType":"bool","name":"_pIsBlacklist","type":"bool"}],"name":"ESetBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_pAddr","type":"address"},{"indexed":false,"internalType":"bool","name":"_pIsGateway","type":"bool"}],"name":"ESetGateway","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_pStartTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_pMaxAmount","type":"uint256"}],"name":"ESetTradeTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_pAddr","type":"address"},{"indexed":false,"internalType":"bool","name":"_pIsWhitelist","type":"bool"}],"name":"ESetWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_pAmount","type":"uint256"}],"name":"fBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_pToken","type":"address"},{"internalType":"address","name":"_pTo","type":"address"}],"name":"fEmerERC20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pAddr","type":"address"},{"internalType":"bool","name":"_pIsBlacklist","type":"bool"}],"name":"fSetBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pStartTime","type":"uint256"},{"internalType":"uint256","name":"_pMaxAmount","type":"uint256"}],"name":"fSetTradeTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pAddr","type":"address"},{"internalType":"bool","name":"_pIsWhitelist","type":"bool"}],"name":"fSetWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tfMaxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tfStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604080518082018252600f81526e4865726f6573206f66204d6176696160881b6020808301918252835180850190945260058452644d4156494160d81b90840152815191929162000066916003916200034b565b5080516200007c9060049060208401906200034b565b5050604080518082018252600b81526a151bdad95b94195c9b5a5d60aa1b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f4abde5b2ea785d81ec79c6d8b564409eb909a97831394064a50249bce2cb7779818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012060065550336200015f600082620001af565b6200018b7f7ec4788949f801629c6bee526c56143f9a63e64429ff2842602f06a52f01e50a82620001af565b600019600b55620001a8816acecb8f27f4200f3a000000620001bf565b5062000453565b620001bb8282620002a7565b5050565b6001600160a01b0382166200021a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b80600260008282546200022e9190620003f1565b90915550506001600160a01b038216600090815260208190526040812080548392906200025d908490620003f1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008281526005602090815260408083206001600160a01b038516845290915290205460ff16620001bb5760008281526005602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620003073390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b828054620003599062000416565b90600052602060002090601f0160209004810192826200037d5760008555620003c8565b82601f106200039857805160ff1916838001178555620003c8565b82800160010185558215620003c8579182015b82811115620003c8578251825591602001919060010190620003ab565b50620003d6929150620003da565b5090565b5b80821115620003d65760008155600101620003db565b600082198211156200041157634e487b7160e01b81526011600452602481fd5b500190565b600181811c908216806200042b57607f821691505b602082108114156200044d57634e487b7160e01b600052602260045260246000fd5b50919050565b611cb680620004636000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063a457c2d7116100a2578063d547741f11610071578063d547741f146103e0578063dd62ed3e146103f3578063e60f986a1461042c578063f9f92be41461043f57600080fd5b8063a457c2d714610394578063a9059cbb146103a7578063add0ca68146103ba578063d505accf146103cd57600080fd5b80639304afa2116100de5780639304afa21461034e57806395d89b41146103615780639b19251a14610369578063a217fddf1461038c57600080fd5b806370a08231146102f25780637ecebe001461031b57806391d148541461033b57600080fd5b8063248a9ca311610171578063313ce5671161014b578063313ce567146102b457806336568abe146102c357806339509351146102d657806339c49021146102e957600080fd5b8063248a9ca31461026b5780632ba78b3d1461028e5780632f2ff15d146102a157600080fd5b8063095ea7b3116101ad578063095ea7b31461022857806318160ddd1461023b57806323b872dd14610243578063241de63d1461025657600080fd5b806301ffc9a7146101d457806306fdde03146101fc57806307f1775414610211575b600080fd5b6101e76101e2366004611a00565b610462565b60405190151581526020015b60405180910390f35b610204610499565b6040516101f39190611b04565b61021a600a5481565b6040519081526020016101f3565b6101e761023636600461197d565b61052b565b60025461021a565b6101e761025136600461189b565b610541565b610269610264366004611950565b6105f2565b005b61021a6102793660046119c4565b60009081526005602052604090206001015490565b61026961029c3660046119c4565b6106a4565b6102696102af3660046119dc565b6106b1565b604051601281526020016101f3565b6102696102d13660046119dc565b6106dc565b6101e76102e436600461197d565b61075a565b61021a600b5481565b61021a610300366004611847565b6001600160a01b031660009081526020819052604090205490565b61021a610329366004611847565b60076020526000908152604090205481565b6101e76103493660046119dc565b610796565b61026961035c366004611a28565b6107c1565b6102046108e8565b6101e7610377366004611847565b60096020526000908152604090205460ff1681565b61021a600081565b6101e76103a236600461197d565b6108f7565b6101e76103b536600461197d565b610990565b6102696103c8366004611950565b61099d565b6102696103db3660046118db565b610a46565b6102696103ee3660046119dc565b610c4d565b61021a610401366004611863565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61026961043a366004611a52565b610c73565b6101e761044d366004611847565b60086020526000908152604090205460ff1681565b60006001600160e01b03198216637965db0b60e01b148061049357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600380546104a890611bf1565b80601f01602080910402602001604051908101604052809291908181526020018280546104d490611bf1565b80156105215780601f106104f657610100808354040283529160200191610521565b820191906000526020600020905b81548152906001019060200180831161050457829003601f168201915b5050505050905090565b6000610538338484610ce6565b50600192915050565b600061054e848484610e0a565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156105d85760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6105e58533858403610ce6565b60019150505b9392505050565b7f7ec4788949f801629c6bee526c56143f9a63e64429ff2842602f06a52f01e50a61061d8133610f5a565b6001600160a01b0383166106435760405162461bcd60e51b81526004016105cf90611b37565b6001600160a01b038316600081815260096020908152604091829020805460ff191686151590811790915591519182527f0f035a7b5cd3a16de7240c055ea99af74f036ef6d31b11ea37b09ecf3e774c4691015b60405180910390a2505050565b6106ae3382610fbe565b50565b6000828152600560205260409020600101546106cd8133610f5a565b6106d7838361110c565b505050565b6001600160a01b038116331461074c5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016105cf565b6107568282611192565b5050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610538918590610791908690611b60565b610ce6565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7fb5a0ffc9809f97c825e7243be790ff035be8fe1a72461bc6e6ee1ca67a1f0c5a6107ec8133610f5a565b6001600160a01b0382166108125760405162461bcd60e51b81526004016105cf90611b37565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b15801561085457600080fd5b505afa158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c9190611a3a565b90506108a26001600160a01b03851684836111f9565b6040516001600160a01b0384811682528516907f54d6637aad2d8e0df02e1bb1766a3f825001fd55a99aa3931af98976b17a50559060200160405180910390a250505050565b6060600480546104a890611bf1565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156109795760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105cf565b6109863385858403610ce6565b5060019392505050565b6000610538338484610e0a565b7f7ec4788949f801629c6bee526c56143f9a63e64429ff2842602f06a52f01e50a6109c88133610f5a565b6001600160a01b0383166109ee5760405162461bcd60e51b81526004016105cf90611b37565b6001600160a01b038316600081815260086020908152604091829020805460ff191686151590811790915591519182527f8e76ce3f1e0d4c9bc4c14b49a3a5d306b7a43a638508252f978f2b3df239e6e89101610697565b42841015610a855760405162461bcd60e51b815260206004820152600c60248201526b14da59ce881156141254915160a21b60448201526064016105cf565b6006546001600160a01b038816600090815260076020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087610ad883611c2c565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001610b5192919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610bbc573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610bf25750886001600160a01b0316816001600160a01b0316145b610c375760405162461bcd60e51b81526020600482015260166024820152755369673a20494e56414c49445f5349474e415455524560501b60448201526064016105cf565b610c42898989610ce6565b505050505050505050565b600082815260056020526040902060010154610c698133610f5a565b6106d78383611192565b7f7ec4788949f801629c6bee526c56143f9a63e64429ff2842602f06a52f01e50a610c9e8133610f5a565b600a839055600b82905560408051848152602081018490527f98ff187f6974d16460c5c90348f25bc6fa0b91e3d21a0b5ec4562c50d1eb9ec1910160405180910390a1505050565b6001600160a01b038316610d485760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105cf565b6001600160a01b038216610da95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105cf565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831660009081526008602052604090205460ff16158015610e4c57506001600160a01b03821660009081526008602052604090205460ff16155b610e845760405162461bcd60e51b8152602060048201526009602482015268109b1858dadb1a5cdd60ba1b60448201526064016105cf565b6001600160a01b03831660009081526009602052604090205460ff16158015610ec657506001600160a01b03821660009081526009602052604090205460ff16155b15610f4f57600a54421015610f0c5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b60448201526064016105cf565b600b54811115610f4f5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016105cf565b6106d783838361124b565b610f648282610796565b61075657610f7c816001600160a01b0316601461141b565b610f8783602061141b565b604051602001610f98929190611a8f565b60408051601f198184030181529082905262461bcd60e51b82526105cf91600401611b04565b6001600160a01b03821661101e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105cf565b6001600160a01b038216600090815260208190526040902054818110156110925760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105cf565b6001600160a01b03831660009081526020819052604081208383039055600280548492906110c1908490611b97565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6111168282610796565b6107565760008281526005602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561114e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61119c8282610796565b156107565760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526106d79084906115fd565b6001600160a01b0383166112af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105cf565b6001600160a01b0382166113115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105cf565b6001600160a01b038316600090815260208190526040902054818110156113895760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105cf565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906113c0908490611b60565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161140c91815260200190565b60405180910390a35b50505050565b6060600061142a836002611b78565b611435906002611b60565b67ffffffffffffffff81111561145b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611485576020820181803683370190505b509050600360fc1b816000815181106114ae57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106114eb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600061150f846002611b78565b61151a906001611b60565b90505b60018111156115ae576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061155c57634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061158057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c936115a781611bda565b905061151d565b5083156105eb5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105cf565b6000611652826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116cf9092919063ffffffff16565b8051909150156106d7578080602001905181019061167091906119a8565b6106d75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105cf565b60606116de84846000856116e6565b949350505050565b6060824710156117475760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016105cf565b843b6117955760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105cf565b600080866001600160a01b031685876040516117b19190611a73565b60006040518083038185875af1925050503d80600081146117ee576040519150601f19603f3d011682016040523d82523d6000602084013e6117f3565b606091505b509150915061180382828661180e565b979650505050505050565b6060831561181d5750816105eb565b82511561182d5782518084602001fd5b8160405162461bcd60e51b81526004016105cf9190611b04565b600060208284031215611858578081fd5b81356105eb81611c5d565b60008060408385031215611875578081fd5b823561188081611c5d565b9150602083013561189081611c5d565b809150509250929050565b6000806000606084860312156118af578081fd5b83356118ba81611c5d565b925060208401356118ca81611c5d565b929592945050506040919091013590565b600080600080600080600060e0888a0312156118f5578283fd5b873561190081611c5d565b9650602088013561191081611c5d565b95506040880135945060608801359350608088013560ff81168114611933578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611962578182fd5b823561196d81611c5d565b9150602083013561189081611c72565b6000806040838503121561198f578182fd5b823561199a81611c5d565b946020939093013593505050565b6000602082840312156119b9578081fd5b81516105eb81611c72565b6000602082840312156119d5578081fd5b5035919050565b600080604083850312156119ee578182fd5b82359150602083013561189081611c5d565b600060208284031215611a11578081fd5b81356001600160e01b0319811681146105eb578182fd5b60008060408385031215611875578182fd5b600060208284031215611a4b578081fd5b5051919050565b60008060408385031215611a64578182fd5b50508035926020909101359150565b60008251611a85818460208701611bae565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611ac7816017850160208801611bae565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611af8816028840160208801611bae565b01602801949350505050565b6020815260008251806020840152611b23816040850160208701611bae565b601f01601f19169190910160400192915050565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b60008219821115611b7357611b73611c47565b500190565b6000816000190483118215151615611b9257611b92611c47565b500290565b600082821015611ba957611ba9611c47565b500390565b60005b83811015611bc9578181015183820152602001611bb1565b838111156114155750506000910152565b600081611be957611be9611c47565b506000190190565b600181811c90821680611c0557607f821691505b60208210811415611c2657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611c4057611c40611c47565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146106ae57600080fd5b80151581146106ae57600080fdfea2646970667358221220b81f5f66199a978a5263cd544185a0eded3d13477bbec614d8ac3c047ca0bb0664736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063a457c2d7116100a2578063d547741f11610071578063d547741f146103e0578063dd62ed3e146103f3578063e60f986a1461042c578063f9f92be41461043f57600080fd5b8063a457c2d714610394578063a9059cbb146103a7578063add0ca68146103ba578063d505accf146103cd57600080fd5b80639304afa2116100de5780639304afa21461034e57806395d89b41146103615780639b19251a14610369578063a217fddf1461038c57600080fd5b806370a08231146102f25780637ecebe001461031b57806391d148541461033b57600080fd5b8063248a9ca311610171578063313ce5671161014b578063313ce567146102b457806336568abe146102c357806339509351146102d657806339c49021146102e957600080fd5b8063248a9ca31461026b5780632ba78b3d1461028e5780632f2ff15d146102a157600080fd5b8063095ea7b3116101ad578063095ea7b31461022857806318160ddd1461023b57806323b872dd14610243578063241de63d1461025657600080fd5b806301ffc9a7146101d457806306fdde03146101fc57806307f1775414610211575b600080fd5b6101e76101e2366004611a00565b610462565b60405190151581526020015b60405180910390f35b610204610499565b6040516101f39190611b04565b61021a600a5481565b6040519081526020016101f3565b6101e761023636600461197d565b61052b565b60025461021a565b6101e761025136600461189b565b610541565b610269610264366004611950565b6105f2565b005b61021a6102793660046119c4565b60009081526005602052604090206001015490565b61026961029c3660046119c4565b6106a4565b6102696102af3660046119dc565b6106b1565b604051601281526020016101f3565b6102696102d13660046119dc565b6106dc565b6101e76102e436600461197d565b61075a565b61021a600b5481565b61021a610300366004611847565b6001600160a01b031660009081526020819052604090205490565b61021a610329366004611847565b60076020526000908152604090205481565b6101e76103493660046119dc565b610796565b61026961035c366004611a28565b6107c1565b6102046108e8565b6101e7610377366004611847565b60096020526000908152604090205460ff1681565b61021a600081565b6101e76103a236600461197d565b6108f7565b6101e76103b536600461197d565b610990565b6102696103c8366004611950565b61099d565b6102696103db3660046118db565b610a46565b6102696103ee3660046119dc565b610c4d565b61021a610401366004611863565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61026961043a366004611a52565b610c73565b6101e761044d366004611847565b60086020526000908152604090205460ff1681565b60006001600160e01b03198216637965db0b60e01b148061049357506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600380546104a890611bf1565b80601f01602080910402602001604051908101604052809291908181526020018280546104d490611bf1565b80156105215780601f106104f657610100808354040283529160200191610521565b820191906000526020600020905b81548152906001019060200180831161050457829003601f168201915b5050505050905090565b6000610538338484610ce6565b50600192915050565b600061054e848484610e0a565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156105d85760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6105e58533858403610ce6565b60019150505b9392505050565b7f7ec4788949f801629c6bee526c56143f9a63e64429ff2842602f06a52f01e50a61061d8133610f5a565b6001600160a01b0383166106435760405162461bcd60e51b81526004016105cf90611b37565b6001600160a01b038316600081815260096020908152604091829020805460ff191686151590811790915591519182527f0f035a7b5cd3a16de7240c055ea99af74f036ef6d31b11ea37b09ecf3e774c4691015b60405180910390a2505050565b6106ae3382610fbe565b50565b6000828152600560205260409020600101546106cd8133610f5a565b6106d7838361110c565b505050565b6001600160a01b038116331461074c5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016105cf565b6107568282611192565b5050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610538918590610791908690611b60565b610ce6565b60009182526005602090815260408084206001600160a01b0393909316845291905290205460ff1690565b7fb5a0ffc9809f97c825e7243be790ff035be8fe1a72461bc6e6ee1ca67a1f0c5a6107ec8133610f5a565b6001600160a01b0382166108125760405162461bcd60e51b81526004016105cf90611b37565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b15801561085457600080fd5b505afa158015610868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088c9190611a3a565b90506108a26001600160a01b03851684836111f9565b6040516001600160a01b0384811682528516907f54d6637aad2d8e0df02e1bb1766a3f825001fd55a99aa3931af98976b17a50559060200160405180910390a250505050565b6060600480546104a890611bf1565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156109795760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105cf565b6109863385858403610ce6565b5060019392505050565b6000610538338484610e0a565b7f7ec4788949f801629c6bee526c56143f9a63e64429ff2842602f06a52f01e50a6109c88133610f5a565b6001600160a01b0383166109ee5760405162461bcd60e51b81526004016105cf90611b37565b6001600160a01b038316600081815260086020908152604091829020805460ff191686151590811790915591519182527f8e76ce3f1e0d4c9bc4c14b49a3a5d306b7a43a638508252f978f2b3df239e6e89101610697565b42841015610a855760405162461bcd60e51b815260206004820152600c60248201526b14da59ce881156141254915160a21b60448201526064016105cf565b6006546001600160a01b038816600090815260076020526040812080549192917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087610ad883611c2c565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001610b5192919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015610bbc573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610bf25750886001600160a01b0316816001600160a01b0316145b610c375760405162461bcd60e51b81526020600482015260166024820152755369673a20494e56414c49445f5349474e415455524560501b60448201526064016105cf565b610c42898989610ce6565b505050505050505050565b600082815260056020526040902060010154610c698133610f5a565b6106d78383611192565b7f7ec4788949f801629c6bee526c56143f9a63e64429ff2842602f06a52f01e50a610c9e8133610f5a565b600a839055600b82905560408051848152602081018490527f98ff187f6974d16460c5c90348f25bc6fa0b91e3d21a0b5ec4562c50d1eb9ec1910160405180910390a1505050565b6001600160a01b038316610d485760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105cf565b6001600160a01b038216610da95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105cf565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831660009081526008602052604090205460ff16158015610e4c57506001600160a01b03821660009081526008602052604090205460ff16155b610e845760405162461bcd60e51b8152602060048201526009602482015268109b1858dadb1a5cdd60ba1b60448201526064016105cf565b6001600160a01b03831660009081526009602052604090205460ff16158015610ec657506001600160a01b03821660009081526009602052604090205460ff16155b15610f4f57600a54421015610f0c5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c69642074696d6560a01b60448201526064016105cf565b600b54811115610f4f5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016105cf565b6106d783838361124b565b610f648282610796565b61075657610f7c816001600160a01b0316601461141b565b610f8783602061141b565b604051602001610f98929190611a8f565b60408051601f198184030181529082905262461bcd60e51b82526105cf91600401611b04565b6001600160a01b03821661101e5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105cf565b6001600160a01b038216600090815260208190526040902054818110156110925760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105cf565b6001600160a01b03831660009081526020819052604081208383039055600280548492906110c1908490611b97565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b6111168282610796565b6107565760008281526005602090815260408083206001600160a01b03851684529091529020805460ff1916600117905561114e3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61119c8282610796565b156107565760008281526005602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526106d79084906115fd565b6001600160a01b0383166112af5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105cf565b6001600160a01b0382166113115760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105cf565b6001600160a01b038316600090815260208190526040902054818110156113895760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105cf565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906113c0908490611b60565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161140c91815260200190565b60405180910390a35b50505050565b6060600061142a836002611b78565b611435906002611b60565b67ffffffffffffffff81111561145b57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611485576020820181803683370190505b509050600360fc1b816000815181106114ae57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106114eb57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600061150f846002611b78565b61151a906001611b60565b90505b60018111156115ae576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061155c57634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061158057634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c936115a781611bda565b905061151d565b5083156105eb5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016105cf565b6000611652826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116cf9092919063ffffffff16565b8051909150156106d7578080602001905181019061167091906119a8565b6106d75760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016105cf565b60606116de84846000856116e6565b949350505050565b6060824710156117475760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016105cf565b843b6117955760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016105cf565b600080866001600160a01b031685876040516117b19190611a73565b60006040518083038185875af1925050503d80600081146117ee576040519150601f19603f3d011682016040523d82523d6000602084013e6117f3565b606091505b509150915061180382828661180e565b979650505050505050565b6060831561181d5750816105eb565b82511561182d5782518084602001fd5b8160405162461bcd60e51b81526004016105cf9190611b04565b600060208284031215611858578081fd5b81356105eb81611c5d565b60008060408385031215611875578081fd5b823561188081611c5d565b9150602083013561189081611c5d565b809150509250929050565b6000806000606084860312156118af578081fd5b83356118ba81611c5d565b925060208401356118ca81611c5d565b929592945050506040919091013590565b600080600080600080600060e0888a0312156118f5578283fd5b873561190081611c5d565b9650602088013561191081611c5d565b95506040880135945060608801359350608088013560ff81168114611933578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611962578182fd5b823561196d81611c5d565b9150602083013561189081611c72565b6000806040838503121561198f578182fd5b823561199a81611c5d565b946020939093013593505050565b6000602082840312156119b9578081fd5b81516105eb81611c72565b6000602082840312156119d5578081fd5b5035919050565b600080604083850312156119ee578182fd5b82359150602083013561189081611c5d565b600060208284031215611a11578081fd5b81356001600160e01b0319811681146105eb578182fd5b60008060408385031215611875578182fd5b600060208284031215611a4b578081fd5b5051919050565b60008060408385031215611a64578182fd5b50508035926020909101359150565b60008251611a85818460208701611bae565b9190910192915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351611ac7816017850160208801611bae565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351611af8816028840160208801611bae565b01602801949350505050565b6020815260008251806020840152611b23816040850160208701611bae565b601f01601f19169190910160400192915050565b6020808252600f908201526e496e76616c6964206164647265737360881b604082015260600190565b60008219821115611b7357611b73611c47565b500190565b6000816000190483118215151615611b9257611b92611c47565b500290565b600082821015611ba957611ba9611c47565b500390565b60005b83811015611bc9578181015183820152602001611bb1565b838111156114155750506000910152565b600081611be957611be9611c47565b506000190190565b600181811c90821680611c0557607f821691505b60208210811415611c2657634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611c4057611c40611c47565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146106ae57600080fd5b80151581146106ae57600080fdfea2646970667358221220b81f5f66199a978a5263cd544185a0eded3d13477bbec614d8ac3c047ca0bb0664736f6c63430008040033

Deployed Bytecode Sourcemap

238:3762:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2545:202:0;;;;;;:::i;:::-;;:::i;:::-;;;7021:14:12;;7014:22;6996:41;;6984:2;6969:18;2545:202:0;;;;;;;;2084:98:2;;;:::i;:::-;;;;;;;:::i;905:26:11:-;;;;;;;;;7194:25:12;;;7182:2;7167:18;905:26:11;7149:76:12;4181:166:2;;;;;;:::i;:::-;;:::i;3172:106::-;3259:12;;3172:106;;4814:478;;;;;;:::i;:::-;;:::i;2784:236:11:-;;;;;;:::i;:::-;;:::i;:::-;;3917:121:0;;;;;;:::i;:::-;3983:7;4009:12;;;:6;:12;;;;;:22;;;;3917:121;2458:82:11;;;;;;:::i;:::-;;:::i;4288:145:0:-;;;;;;:::i;:::-;;:::i;3021:91:2:-;;;3103:2;16849:36:12;;16837:2;16822:18;3021:91:2;16804:87:12;5305:214:0;;;;;;:::i;:::-;;:::i;5687:212:2:-;;;;;;:::i;:::-;;:::i;935:26:11:-;;;;;;3336:125:2;;;;;;:::i;:::-;-1:-1:-1;;;;;3436:18:2;3410:7;3436:18;;;;;;;;;;;;3336:125;772:38:11;;;;;;:::i;:::-;;;;;;;;;;;;;;2834:137:0;;;;;;:::i;:::-;;:::i;3242:281:11:-;;;;;;:::i;:::-;;:::i;2295:102:2:-;;;:::i;860:41:11:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1952:49:0;;1997:4;1952:49;;6386:405:2;;;;;;:::i;:::-;;:::i;3664:172::-;;;;;;:::i;:::-;;:::i;2544:236:11:-;;;;;;:::i;:::-;;:::i;1831:590::-;;;;;;:::i;:::-;;:::i;4667:147:0:-;;;;;;:::i;:::-;;:::i;3894:149:2:-;;;;;;:::i;:::-;-1:-1:-1;;;;;4009:18:2;;;3983:7;4009:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3894:149;3024:214:11;;;;;;:::i;:::-;;:::i;815:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2545:202:0;2630:4;-1:-1:-1;;;;;;2653:47:0;;-1:-1:-1;;;2653:47:0;;:87;;-1:-1:-1;;;;;;;;;;871:40:9;;;2704:36:0;2646:94;2545:202;-1:-1:-1;;2545:202:0:o;2084:98:2:-;2138:13;2170:5;2163:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2084:98;:::o;4181:166::-;4264:4;4280:39;666:10:7;4303:7:2;4312:6;4280:8;:39::i;:::-;-1:-1:-1;4336:4:2;4181:166;;;;:::o;4814:478::-;4950:4;4966:36;4976:6;4984:9;4995:6;4966:9;:36::i;:::-;-1:-1:-1;;;;;5040:19:2;;5013:24;5040:19;;;:11;:19;;;;;;;;666:10:7;5040:33:2;;;;;;;;5091:26;;;;5083:79;;;;-1:-1:-1;;;5083:79:2;;12910:2:12;5083:79:2;;;12892:21:12;12949:2;12929:18;;;12922:30;12988:34;12968:18;;;12961:62;-1:-1:-1;;;13039:18:12;;;13032:38;13087:19;;5083:79:2;;;;;;;;;5196:57;5205:6;666:10:7;5246:6:2;5227:16;:25;5196:8;:57::i;:::-;5281:4;5274:11;;;4814:478;;;;;;:::o;2784:236:11:-;414:25;2430:30:0;414:25:11;666:10:7;2430::0;:30::i;:::-;-1:-1:-1;;;;;2889:20:11;::::1;2881:48;;;;-1:-1:-1::0;;;2881:48:11::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2935:17:11;::::1;;::::0;;;:9:::1;:17;::::0;;;;;;;;:33;;-1:-1:-1;;2935:33:11::1;::::0;::::1;;::::0;;::::1;::::0;;;2979:36;;6996:41:12;;;2979:36:11::1;::::0;6969:18:12;2979:36:11::1;;;;;;;;2784:236:::0;;;:::o;2458:82::-;2506:29;666:10:7;2526:8:11;2506:5;:29::i;:::-;2458:82;:::o;4288:145:0:-;3983:7;4009:12;;;:6;:12;;;;;:22;;;2430:30;2441:4;666:10:7;2430::0;:30::i;:::-;4401:25:::1;4412:4;4418:7;4401:10;:25::i;:::-;4288:145:::0;;;:::o;5305:214::-;-1:-1:-1;;;;;5400:23:0;;666:10:7;5400:23:0;5392:83;;;;-1:-1:-1;;;5392:83:0;;16058:2:12;5392:83:0;;;16040:21:12;16097:2;16077:18;;;16070:30;16136:34;16116:18;;;16109:62;-1:-1:-1;;;16187:18:12;;;16180:45;16242:19;;5392:83:0;16030:237:12;5392:83:0;5486:26;5498:4;5504:7;5486:11;:26::i;:::-;5305:214;;:::o;5687:212:2:-;666:10:7;5775:4:2;5823:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;5823:34:2;;;;;;;;;;5775:4;;5791:80;;5814:7;;5823:47;;5860:10;;5823:47;:::i;:::-;5791:8;:80::i;2834:137:0:-;2912:4;2935:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;2935:29:0;;;;;;;;;;;;;;;2834:137::o;3242:281:11:-;486:28;2430:30:0;486:28:11;666:10:7;2430::0;:30::i;:::-;-1:-1:-1;;;;;3347:18:11;::::1;3339:46;;;;-1:-1:-1::0;;;3339:46:11::1;;;;;;;:::i;:::-;3406:32;::::0;-1:-1:-1;;;3406:32:11;;3432:4:::1;3406:32;::::0;::::1;6515:51:12::0;3391:12:11::1;::::0;-1:-1:-1;;;;;3406:17:11;::::1;::::0;::::1;::::0;6488:18:12;;3406:32:11::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3391:47:::0;-1:-1:-1;3444:32:11::1;-1:-1:-1::0;;;;;3444:20:11;::::1;3465:4:::0;3391:47;3444:20:::1;:32::i;:::-;3487:31;::::0;-1:-1:-1;;;;;6533:32:12;;;6515:51;;3487:31:11;::::1;::::0;::::1;::::0;6503:2:12;6488:18;3487:31:11::1;;;;;;;2470:1:0;3242:281:11::0;;;:::o;2295:102:2:-;2351:13;2383:7;2376:14;;;;;:::i;6386:405::-;666:10:7;6479:4:2;6522:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;6522:34:2;;;;;;;;;;6574:35;;;;6566:85;;;;-1:-1:-1;;;6566:85:2;;15652:2:12;6566:85:2;;;15634:21:12;15691:2;15671:18;;;15664:30;15730:34;15710:18;;;15703:62;-1:-1:-1;;;15781:18:12;;;15774:35;15826:19;;6566:85:2;15624:227:12;6566:85:2;6685:67;666:10:7;6708:7:2;6736:15;6717:16;:34;6685:8;:67::i;:::-;-1:-1:-1;6780:4:2;;6386:405;-1:-1:-1;;;6386:405:2:o;3664:172::-;3750:4;3766:42;666:10:7;3790:9:2;3801:6;3766:9;:42::i;2544:236:11:-;414:25;2430:30:0;414:25:11;666:10:7;2430::0;:30::i;:::-;-1:-1:-1;;;;;2649:20:11;::::1;2641:48;;;;-1:-1:-1::0;;;2641:48:11::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2695:17:11;::::1;;::::0;;;:9:::1;:17;::::0;;;;;;;;:33;;-1:-1:-1;;2695:33:11::1;::::0;::::1;;::::0;;::::1;::::0;;;2739:36;;6996:41:12;;;2739:36:11::1;::::0;6969:18:12;2739:36:11::1;6951:92:12::0;1831:590:11;1972:15;1960:8;:27;;1952:52;;;;-1:-1:-1;;;1952:52:11;;12569:2:12;1952:52:11;;;12551:21:12;12608:2;12588:18;;;12581:30;-1:-1:-1;;;12627:18:12;;;12620:42;12679:18;;1952:52:11;12541:162:12;1952:52:11;2090:17;;-1:-1:-1;;;;;2179:13:11;;2010:14;2179:13;;;:6;:13;;;;;:15;;2010:14;;2090:17;702:66;;2156:5;;2163:7;;2172:5;;2179:15;2010:14;2179:15;;;:::i;:::-;;;;-1:-1:-1;2127:78:11;;;;;;7517:25:12;;;;-1:-1:-1;;;;;7616:15:12;;;7596:18;;;7589:43;7668:15;;;;7648:18;;;7641:43;7700:18;;;7693:34;7743:19;;;7736:35;7787:19;;;7780:35;;;7489:19;;2127:78:11;;;;;;;;;;;;2117:89;;;;;;2044:170;;;;;;;;-1:-1:-1;;;5439:27:12;;5491:1;5482:11;;5475:27;;;;5527:2;5518:12;;5511:28;5564:2;5555:12;;5429:144;2044:170:11;;;;-1:-1:-1;;2044:170:11;;;;;;;;;2027:193;;2044:170;2027:193;;;;2226:24;2253:26;;;;;;;;;8053:25:12;;;8126:4;8114:17;;8094:18;;;8087:45;;;;8148:18;;;8141:34;;;8191:18;;;8184:34;;;2027:193:11;;-1:-1:-1;2226:24:11;2253:26;;8025:19:12;;2253:26:11;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;2253:26:11;;-1:-1:-1;;2253:26:11;;;-1:-1:-1;;;;;;;2293:30:11;;;;;;:59;;;2347:5;-1:-1:-1;;;;;2327:25:11;:16;-1:-1:-1;;;;;2327:25:11;;2293:59;2285:94;;;;-1:-1:-1;;;2285:94:11;;13319:2:12;2285:94:11;;;13301:21:12;13358:2;13338:18;;;13331:30;-1:-1:-1;;;13377:18:12;;;13370:52;13439:18;;2285:94:11;13291:172:12;2285:94:11;2385:31;2394:5;2401:7;2410:5;2385:8;:31::i;:::-;1831:590;;;;;;;;;:::o;4667:147:0:-;3983:7;4009:12;;;:6;:12;;;;;:22;;;2430:30;2441:4;666:10:7;2430::0;:30::i;:::-;4781:26:::1;4793:4;4799:7;4781:11;:26::i;3024:214:11:-:0;414:25;2430:30:0;414:25:11;666:10:7;2430::0;:30::i;:::-;3127:11:11::1;:25:::0;;;3158:11:::1;:25:::0;;;3194:39:::1;::::0;;16628:25:12;;;16684:2;16669:18;;16662:34;;;3194:39:11::1;::::0;16601:18:12;3194:39:11::1;;;;;;;3024:214:::0;;;:::o;9962:370:2:-;-1:-1:-1;;;;;10093:19:2;;10085:68;;;;-1:-1:-1;;;10085:68:2;;14478:2:12;10085:68:2;;;14460:21:12;14517:2;14497:18;;;14490:30;14556:34;14536:18;;;14529:62;-1:-1:-1;;;14607:18:12;;;14600:34;14651:19;;10085:68:2;14450:226:12;10085:68:2;-1:-1:-1;;;;;10171:21:2;;10163:68;;;;-1:-1:-1;;;10163:68:2;;10331:2:12;10163:68:2;;;10313:21:12;10370:2;10350:18;;;10343:30;10409:34;10389:18;;;10382:62;-1:-1:-1;;;10460:18:12;;;10453:32;10502:19;;10163:68:2;10303:224:12;10163:68:2;-1:-1:-1;;;;;10242:18:2;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10293:32;;7194:25:12;;;10293:32:2;;7167:18:12;10293:32:2;;;;;;;9962:370;;;:::o;3584:414:11:-;-1:-1:-1;;;;;3693:19:11;;;;;;:9;:19;;;;;;;;3692:20;:47;;;;-1:-1:-1;;;;;;3717:22:11;;;;;;:9;:22;;;;;;;;3716:23;3692:47;3684:69;;;;-1:-1:-1;;;3684:69:11;;11418:2:12;3684:69:11;;;11400:21:12;11457:1;11437:18;;;11430:29;-1:-1:-1;;;11475:18:12;;;11468:39;11524:18;;3684:69:11;11390:158:12;3684:69:11;-1:-1:-1;;;;;3764:19:11;;;;;;:9;:19;;;;;;;;3763:20;:47;;;;-1:-1:-1;;;;;;3788:22:11;;;;;;:9;:22;;;;;;;;3787:23;3763:47;3759:181;;;3847:11;;3828:15;:30;;3820:55;;;;-1:-1:-1;;;3820:55:11;;11077:2:12;3820:55:11;;;11059:21:12;11116:2;11096:18;;;11089:30;-1:-1:-1;;;11135:18:12;;;11128:42;11187:18;;3820:55:11;11049:162:12;3820:55:11;3903:11;;3891:8;:23;;3883:50;;;;-1:-1:-1;;;3883:50:11;;10734:2:12;3883:50:11;;;10716:21:12;10773:2;10753:18;;;10746:30;-1:-1:-1;;;10792:18:12;;;10785:44;10846:18;;3883:50:11;10706:164:12;3883:50:11;3945:48;3961:8;3971:11;3984:8;3945:15;:48::i;3252:484:0:-;3332:22;3340:4;3346:7;3332;:22::i;:::-;3327:403;;3515:41;3543:7;-1:-1:-1;;;;;3515:41:0;3553:2;3515:19;:41::i;:::-;3627:38;3655:4;3662:2;3627:19;:38::i;:::-;3422:265;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;3422:265:0;;;;;;;;;;-1:-1:-1;;;3370:349:0;;;;;;;:::i;8963:576:2:-;-1:-1:-1;;;;;9046:21:2;;9038:67;;;;-1:-1:-1;;;9038:67:2;;13670:2:12;9038:67:2;;;13652:21:12;13709:2;13689:18;;;13682:30;13748:34;13728:18;;;13721:62;-1:-1:-1;;;13799:18:12;;;13792:31;13840:19;;9038:67:2;13642:223:12;9038:67:2;-1:-1:-1;;;;;9201:18:2;;9176:22;9201:18;;;;;;;;;;;9237:24;;;;9229:71;;;;-1:-1:-1;;;9229:71:2;;9928:2:12;9229:71:2;;;9910:21:12;9967:2;9947:18;;;9940:30;10006:34;9986:18;;;9979:62;-1:-1:-1;;;10057:18:12;;;10050:32;10099:19;;9229:71:2;9900:224:12;9229:71:2;-1:-1:-1;;;;;9334:18:2;;:9;:18;;;;;;;;;;9355:23;;;9334:44;;9398:12;:22;;9372:6;;9334:9;9398:22;;9372:6;;9398:22;:::i;:::-;;;;-1:-1:-1;;9436:37:2;;7194:25:12;;;9462:1:2;;-1:-1:-1;;;;;9436:37:2;;;;;7182:2:12;7167:18;9436:37:2;;;;;;;4288:145:0;;;:::o;6572:224::-;6646:22;6654:4;6660:7;6646;:22::i;:::-;6641:149;;6684:12;;;;:6;:12;;;;;;;;-1:-1:-1;;;;;6684:29:0;;;;;;;;;:36;;-1:-1:-1;;6684:36:0;6716:4;6684:36;;;6766:12;666:10:7;;587:96;6766:12:0;-1:-1:-1;;;;;6739:40:0;6757:7;-1:-1:-1;;;;;6739:40:0;6751:4;6739:40;;;;;;;;;;6572:224;;:::o;6802:225::-;6876:22;6884:4;6890:7;6876;:22::i;:::-;6872:149;;;6946:5;6914:12;;;:6;:12;;;;;;;;-1:-1:-1;;;;;6914:29:0;;;;;;;;;;:37;;-1:-1:-1;;6914:37:0;;;6970:40;666:10:7;;6914:12:0;;6970:40;;6946:5;6970:40;6802:225;;:::o;634:205:5:-;773:58;;;-1:-1:-1;;;;;6769:32:12;;773:58:5;;;6751:51:12;6818:18;;;;6811:34;;;773:58:5;;;;;;;;;;6724:18:12;;;;773:58:5;;;;;;;;-1:-1:-1;;;;;773:58:5;-1:-1:-1;;;773:58:5;;;746:86;;766:5;;746:19;:86::i;7265:713:2:-;-1:-1:-1;;;;;7400:20:2;;7392:70;;;;-1:-1:-1;;;7392:70:2;;14072:2:12;7392:70:2;;;14054:21:12;14111:2;14091:18;;;14084:30;14150:34;14130:18;;;14123:62;-1:-1:-1;;;14201:18:12;;;14194:35;14246:19;;7392:70:2;14044:227:12;7392:70:2;-1:-1:-1;;;;;7480:23:2;;7472:71;;;;-1:-1:-1;;;7472:71:2;;9180:2:12;7472:71:2;;;9162:21:12;9219:2;9199:18;;;9192:30;9258:34;9238:18;;;9231:62;-1:-1:-1;;;9309:18:12;;;9302:33;9352:19;;7472:71:2;9152:225:12;7472:71:2;-1:-1:-1;;;;;7636:17:2;;7612:21;7636:17;;;;;;;;;;;7671:23;;;;7663:74;;;;-1:-1:-1;;;7663:74:2;;11755:2:12;7663:74:2;;;11737:21:12;11794:2;11774:18;;;11767:30;11833:34;11813:18;;;11806:62;-1:-1:-1;;;11884:18:12;;;11877:36;11930:19;;7663:74:2;11727:228:12;7663:74:2;-1:-1:-1;;;;;7771:17:2;;;:9;:17;;;;;;;;;;;7791:22;;;7771:42;;7833:20;;;;;;;;:30;;7807:6;;7771:9;7833:30;;7807:6;;7833:30;:::i;:::-;;;;;;;;7896:9;-1:-1:-1;;;;;7879:35:2;7888:6;-1:-1:-1;;;;;7879:35:2;;7907:6;7879:35;;;;7194:25:12;;7182:2;7167:18;;7149:76;7879:35:2;;;;;;;;7925:46;7265:713;;;;:::o;1535:441:8:-;1610:13;1635:19;1667:10;1671:6;1667:1;:10;:::i;:::-;:14;;1680:1;1667:14;:::i;:::-;1657:25;;;;;;-1:-1:-1;;;1657:25:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1657:25:8;;1635:47;;-1:-1:-1;;;1692:6:8;1699:1;1692:9;;;;;;-1:-1:-1;;;1692:9:8;;;;;;;;;;;;:15;-1:-1:-1;;;;;1692:15:8;;;;;;;;;-1:-1:-1;;;1717:6:8;1724:1;1717:9;;;;;;-1:-1:-1;;;1717:9:8;;;;;;;;;;;;:15;-1:-1:-1;;;;;1717:15:8;;;;;;;;-1:-1:-1;1747:9:8;1759:10;1763:6;1759:1;:10;:::i;:::-;:14;;1772:1;1759:14;:::i;:::-;1747:26;;1742:132;1779:1;1775;:5;1742:132;;;-1:-1:-1;;;1826:5:8;1834:3;1826:11;1813:25;;;;;-1:-1:-1;;;1813:25:8;;;;;;;;;;;;1801:6;1808:1;1801:9;;;;;;-1:-1:-1;;;1801:9:8;;;;;;;;;;;;:37;-1:-1:-1;;;;;1801:37:8;;;;;;;;-1:-1:-1;1862:1:8;1852:11;;;;;1782:3;;;:::i;:::-;;;1742:132;;;-1:-1:-1;1891:10:8;;1883:55;;;;-1:-1:-1;;;1883:55:8;;8819:2:12;1883:55:8;;;8801:21:12;;;8838:18;;;8831:30;8897:34;8877:18;;;8870:62;8949:18;;1883:55:8;8791:182:12;3140:706:5;3559:23;3585:69;3613:4;3585:69;;;;;;;;;;;;;;;;;3593:5;-1:-1:-1;;;;;3585:27:5;;;:69;;;;;:::i;:::-;3668:17;;3559:95;;-1:-1:-1;3668:21:5;3664:176;;3763:10;3752:30;;;;;;;;;;;;:::i;:::-;3744:85;;;;-1:-1:-1;;;3744:85:5;;15241:2:12;3744:85:5;;;15223:21:12;15280:2;15260:18;;;15253:30;15319:34;15299:18;;;15292:62;-1:-1:-1;;;15370:18:12;;;15363:40;15420:19;;3744:85:5;15213:232:12;3461:223:6;3594:12;3625:52;3647:6;3655:4;3661:1;3664:12;3625:21;:52::i;:::-;3618:59;3461:223;-1:-1:-1;;;;3461:223:6:o;4548:499::-;4713:12;4770:5;4745:21;:30;;4737:81;;;;-1:-1:-1;;;4737:81:6;;12162:2:12;4737:81:6;;;12144:21:12;12201:2;12181:18;;;12174:30;12240:34;12220:18;;;12213:62;-1:-1:-1;;;12291:18:12;;;12284:36;12337:19;;4737:81:6;12134:228:12;4737:81:6;1034:20;;4828:60;;;;-1:-1:-1;;;4828:60:6;;14883:2:12;4828:60:6;;;14865:21:12;14922:2;14902:18;;;14895:30;14961:31;14941:18;;;14934:59;15010:18;;4828:60:6;14855:179:12;4828:60:6;4900:12;4914:23;4941:6;-1:-1:-1;;;;;4941:11:6;4960:5;4967:4;4941:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4899:73;;;;4989:51;5006:7;5015:10;5027:12;4989:16;:51::i;:::-;4982:58;4548:499;-1:-1:-1;;;;;;;4548:499:6:o;7161:692::-;7307:12;7335:7;7331:516;;;-1:-1:-1;7365:10:6;7358:17;;7331:516;7476:17;;:21;7472:365;;7670:10;7664:17;7730:15;7717:10;7713:2;7709:19;7702:44;7619:145;7809:12;7802:20;;-1:-1:-1;;;7802:20:6;;;;;;;;:::i;14:257:12:-;73:6;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:31;235:5;210:31;:::i;276:398::-;344:6;352;405:2;393:9;384:7;380:23;376:32;373:2;;;426:6;418;411:22;373:2;470:9;457:23;489:31;514:5;489:31;:::i;:::-;539:5;-1:-1:-1;596:2:12;581:18;;568:32;609:33;568:32;609:33;:::i;:::-;661:7;651:17;;;363:311;;;;;:::o;679:466::-;756:6;764;772;825:2;813:9;804:7;800:23;796:32;793:2;;;846:6;838;831:22;793:2;890:9;877:23;909:31;934:5;909:31;:::i;:::-;959:5;-1:-1:-1;1016:2:12;1001:18;;988:32;1029:33;988:32;1029:33;:::i;:::-;783:362;;1081:7;;-1:-1:-1;;;1135:2:12;1120:18;;;;1107:32;;783:362::o;1150:849::-;1261:6;1269;1277;1285;1293;1301;1309;1362:3;1350:9;1341:7;1337:23;1333:33;1330:2;;;1384:6;1376;1369:22;1330:2;1428:9;1415:23;1447:31;1472:5;1447:31;:::i;:::-;1497:5;-1:-1:-1;1554:2:12;1539:18;;1526:32;1567:33;1526:32;1567:33;:::i;:::-;1619:7;-1:-1:-1;1673:2:12;1658:18;;1645:32;;-1:-1:-1;1724:2:12;1709:18;;1696:32;;-1:-1:-1;1780:3:12;1765:19;;1752:33;1829:4;1816:18;;1804:31;;1794:2;;1854:6;1846;1839:22;1794:2;1320:679;;;;-1:-1:-1;1320:679:12;;;;1882:7;1936:3;1921:19;;1908:33;;-1:-1:-1;1988:3:12;1973:19;;;1960:33;;1320:679;-1:-1:-1;;1320:679:12:o;2004:392::-;2069:6;2077;2130:2;2118:9;2109:7;2105:23;2101:32;2098:2;;;2151:6;2143;2136:22;2098:2;2195:9;2182:23;2214:31;2239:5;2214:31;:::i;:::-;2264:5;-1:-1:-1;2321:2:12;2306:18;;2293:32;2334:30;2293:32;2334:30;:::i;2401:325::-;2469:6;2477;2530:2;2518:9;2509:7;2505:23;2501:32;2498:2;;;2551:6;2543;2536:22;2498:2;2595:9;2582:23;2614:31;2639:5;2614:31;:::i;:::-;2664:5;2716:2;2701:18;;;;2688:32;;-1:-1:-1;;;2488:238:12:o;2731:255::-;2798:6;2851:2;2839:9;2830:7;2826:23;2822:32;2819:2;;;2872:6;2864;2857:22;2819:2;2909:9;2903:16;2928:28;2950:5;2928:28;:::i;2991:190::-;3050:6;3103:2;3091:9;3082:7;3078:23;3074:32;3071:2;;;3124:6;3116;3109:22;3071:2;-1:-1:-1;3152:23:12;;3061:120;-1:-1:-1;3061:120:12:o;3186:325::-;3254:6;3262;3315:2;3303:9;3294:7;3290:23;3286:32;3283:2;;;3336:6;3328;3321:22;3283:2;3377:9;3364:23;3354:33;;3437:2;3426:9;3422:18;3409:32;3450:31;3475:5;3450:31;:::i;3516:306::-;3574:6;3627:2;3615:9;3606:7;3602:23;3598:32;3595:2;;;3648:6;3640;3633:22;3595:2;3679:23;;-1:-1:-1;;;;;;3731:32:12;;3721:43;;3711:2;;3783:6;3775;3768:22;3827:413;3910:6;3918;3971:2;3959:9;3950:7;3946:23;3942:32;3939:2;;;3992:6;3984;3977:22;4440:194;4510:6;4563:2;4551:9;4542:7;4538:23;4534:32;4531:2;;;4584:6;4576;4569:22;4531:2;-1:-1:-1;4612:16:12;;4521:113;-1:-1:-1;4521:113:12:o;4639:258::-;4707:6;4715;4768:2;4756:9;4747:7;4743:23;4739:32;4736:2;;;4789:6;4781;4774:22;4736:2;-1:-1:-1;;4817:23:12;;;4887:2;4872:18;;;4859:32;;-1:-1:-1;4726:171:12:o;4902:274::-;5031:3;5069:6;5063:13;5085:53;5131:6;5126:3;5119:4;5111:6;5107:17;5085:53;:::i;:::-;5154:16;;;;;5039:137;-1:-1:-1;;5039:137:12:o;5578:786::-;5989:25;5984:3;5977:38;5959:3;6044:6;6038:13;6060:62;6115:6;6110:2;6105:3;6101:12;6094:4;6086:6;6082:17;6060:62;:::i;:::-;-1:-1:-1;;;6181:2:12;6141:16;;;6173:11;;;6166:40;6231:13;;6253:63;6231:13;6302:2;6294:11;;6287:4;6275:17;;6253:63;:::i;:::-;6336:17;6355:2;6332:26;;5967:397;-1:-1:-1;;;;5967:397:12:o;8229:383::-;8378:2;8367:9;8360:21;8341:4;8410:6;8404:13;8453:6;8448:2;8437:9;8433:18;8426:34;8469:66;8528:6;8523:2;8512:9;8508:18;8503:2;8495:6;8491:15;8469:66;:::i;:::-;8596:2;8575:15;-1:-1:-1;;8571:29:12;8556:45;;;;8603:2;8552:54;;8350:262;-1:-1:-1;;8350:262:12:o;9382:339::-;9584:2;9566:21;;;9623:2;9603:18;;;9596:30;-1:-1:-1;;;9657:2:12;9642:18;;9635:45;9712:2;9697:18;;9556:165::o;16896:128::-;16936:3;16967:1;16963:6;16960:1;16957:13;16954:2;;;16973:18;;:::i;:::-;-1:-1:-1;17009:9:12;;16944:80::o;17029:168::-;17069:7;17135:1;17131;17127:6;17123:14;17120:1;17117:21;17112:1;17105:9;17098:17;17094:45;17091:2;;;17142:18;;:::i;:::-;-1:-1:-1;17182:9:12;;17081:116::o;17202:125::-;17242:4;17270:1;17267;17264:8;17261:2;;;17275:18;;:::i;:::-;-1:-1:-1;17312:9:12;;17251:76::o;17332:258::-;17404:1;17414:113;17428:6;17425:1;17422:13;17414:113;;;17504:11;;;17498:18;17485:11;;;17478:39;17450:2;17443:10;17414:113;;;17545:6;17542:1;17539:13;17536:2;;;-1:-1:-1;;17580:1:12;17562:16;;17555:27;17385:205::o;17595:136::-;17634:3;17662:5;17652:2;;17671:18;;:::i;:::-;-1:-1:-1;;;17707:18:12;;17642:89::o;17736:380::-;17815:1;17811:12;;;;17858;;;17879:2;;17933:4;17925:6;17921:17;17911:27;;17879:2;17986;17978:6;17975:14;17955:18;17952:38;17949:2;;;18032:10;18027:3;18023:20;18020:1;18013:31;18067:4;18064:1;18057:15;18095:4;18092:1;18085:15;17949:2;;17791:325;;;:::o;18121:135::-;18160:3;-1:-1:-1;;18181:17:12;;18178:2;;;18201:18;;:::i;:::-;-1:-1:-1;18248:1:12;18237:13;;18168:88::o;18261:127::-;18322:10;18317:3;18313:20;18310:1;18303:31;18353:4;18350:1;18343:15;18377:4;18374:1;18367:15;18393:131;-1:-1:-1;;;;;18468:31:12;;18458:42;;18448:2;;18514:1;18511;18504:12;18529:118;18615:5;18608:13;18601:21;18594:5;18591:32;18581:2;;18637:1;18634;18627:12

Swarm Source

ipfs://b81f5f66199a978a5263cd544185a0eded3d13477bbec614d8ac3c047ca0bb06
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.