ERC-20
Metaverse
Overview
Max Total Supply
1,000,000,000 NOA
Holders
500 (0.00%)
Total Transfers
-
Market
Price
$0.00 @ 0.000000 ETH (-3.91%)
Onchain Market Cap
$209,832.99
Circulating Supply Market Cap
$0.00
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NOA
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-13 */ // 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; } } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @dev 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); } /** * @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: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply += amount; _balances[account] += amount; emit Transfer(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"); 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); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (a supervisor) that can be granted exclusive access to * specific functions. * * By default, the supervisor account will be the one that deploys the contract. This * can later be changed with {transferSupervisorOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlySupervisor`, which can be applied to your functions to restrict their use to * the supervisor. */ abstract contract Supervisable is Context { address private _supervisor; event SupervisorOwnershipTransferred(address indexed previouSupervisor, address indexed newSupervisor); /** * @dev Initializes the contract setting the deployer as the initial supervisor. */ constructor() { _transferSupervisorOwnership(_msgSender()); } /** * @dev Returns the address of the current supervisor. */ function supervisor() public view virtual returns (address) { return _supervisor; } /** * @dev Throws if called by any account other than the supervisor. */ modifier onlySupervisor() { require(supervisor() == _msgSender(), "Supervisable: caller is not the supervisor"); _; } /** * @dev Transfers supervisor ownership of the contract to a new account (`newSupervisor`). * Internal function without access restriction. */ function _transferSupervisorOwnership(address newSupervisor) internal virtual { address oldSupervisor = _supervisor; _supervisor = newSupervisor; emit SupervisorOwnershipTransferred(oldSupervisor, newSupervisor); } } /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract Burnable is Context { mapping(address => bool) private _burners; event BurnerAdded(address indexed account); event BurnerRemoved(address indexed account); /** * @dev Returns whether the address is burner. */ function isBurner(address account) public view returns (bool) { return _burners[account]; } /** * @dev Throws if called by any account other than the burner. */ modifier onlyBurner() { require(_burners[_msgSender()], "Burnable: caller is not the burner"); _; } /** * @dev Add burner, only owner can add burner. */ function _addBurner(address account) internal { _burners[account] = true; emit BurnerAdded(account); } /** * @dev Remove operator, only owner can remove operator */ function _removeBurner(address account) internal { _burners[account] = false; emit BurnerRemoved(account); } } /** * @dev Contract for freezing mechanism. * Owner can add freezed account. * Supervisor can remove freezed account. */ contract Freezable is Context { mapping(address => bool) private _freezes; event Freezed(address indexed account); event Unfreezed(address indexed account); /** * @dev Freeze account, only owner can freeze */ function _freeze(address account) internal { _freezes[account] = true; emit Freezed(account); } /** * @dev Unfreeze account, only supervisor can unfreeze */ function _unfreeze(address account) internal { _freezes[account] = false; emit Unfreezed(account); } /** * @dev Returns whether the address is freezed. */ function isFreezed(address account) public view returns (bool) { return _freezes[account]; } } /** * @dev Contract for locking mechanism. * Locker can add locked account. * Supervisor can remove locked account. */ contract Lockable is Context { struct TimeLock { uint256 amount; uint256 expiresAt; } struct VestingLock { uint256 amount; uint256 startsAt; uint256 period; uint256 count; } mapping(address => bool) private _lockers; mapping(address => TimeLock[]) private _timeLocks; mapping(address => VestingLock) private _vestingLocks; event LockerAdded(address indexed account); event LockerRemoved(address indexed account); event TimeLocked(address indexed account); event TimeUnlocked(address indexed account); event VestingLocked(address indexed account); event VestingUnlocked(address indexed account); /** * @dev Throws if called by any account other than the locker. */ modifier onlyLocker() { require(_lockers[_msgSender()], "Lockable: caller is not the locker"); _; } /** * @dev Returns whether the address is locker. */ function isLocker(address account) public view returns (bool) { return _lockers[account]; } /** * @dev Add locker, only owner can add locker */ function _addLocker(address account) internal { _lockers[account] = true; emit LockerAdded(account); } /** * @dev Remove locker, only owner can remove locker */ function _removeLocker(address account) internal { _lockers[account] = false; emit LockerRemoved(account); } /** * @dev Add time lock, only locker can add */ function _addTimeLock( address account, uint256 amount, uint256 expiresAt ) internal { require(amount > 0, "Time Lock: lock amount is 0"); require(expiresAt > block.timestamp, "Time Lock: invalid expire date"); _timeLocks[account].push(TimeLock(amount, expiresAt)); emit TimeLocked(account); } /** * @dev Remove time lock, only supervisor can remove * @param account The address want to remove time lock * @param index Time lock index */ function _removeTimeLock(address account, uint8 index) internal { require(_timeLocks[account].length > index && index >= 0, "Time Lock: invalid index"); uint256 len = _timeLocks[account].length; if (len - 1 != index) { // if it is not last item, swap it _timeLocks[account][index] = _timeLocks[account][len - 1]; } _timeLocks[account].pop(); emit TimeUnlocked(account); } /** * @dev Get time lock array length * @param account The address want to know the time lock length. * @return time lock length */ function getTimeLockLength(address account) public view returns (uint256) { return _timeLocks[account].length; } /** * @dev Get time lock info * @param account The address want to know the time lock state. * @param index Time lock index * @return time lock info */ function getTimeLock(address account, uint8 index) public view returns (uint256, uint256) { require(_timeLocks[account].length > index && index >= 0, "Time Lock: invalid index"); return (_timeLocks[account][index].amount, _timeLocks[account][index].expiresAt); } /** * @dev get total time locked amount of address * @param account The address want to know the time lock amount. * @return time locked amount */ function getTimeLockedAmount(address account) public view returns (uint256) { uint256 timeLockedAmount = 0; uint256 len = _timeLocks[account].length; for (uint256 i = 0; i < len; i++) { if (block.timestamp < _timeLocks[account][i].expiresAt) { timeLockedAmount = timeLockedAmount + _timeLocks[account][i].amount; } } return timeLockedAmount; } /** * @dev Add vesting lock, only locker can add * @param account vesting lock account. * @param amount vesting lock amount. * @param startsAt vesting lock release start date. * @param period vesting lock period. End date is startsAt + (period - 1) * count * @param count vesting lock count. If count is 1, it works like a time lock */ function _addVestingLock( address account, uint256 amount, uint256 startsAt, uint256 period, uint256 count ) internal { require(account != address(0), "Vesting Lock: lock from the zero address"); require(startsAt > block.timestamp, "Vesting Lock: must set after now"); require(amount > 0, "Vesting Lock: amount is 0"); require(period > 0, "Vesting Lock: period is 0"); require(count > 0, "Vesting Lock: count is 0"); _vestingLocks[account] = VestingLock(amount, startsAt, period, count); emit VestingLocked(account); } /** * @dev Remove vesting lock, only supervisor can remove * @param account The address want to remove the vesting lock */ function _removeVestingLock(address account) internal { _vestingLocks[account] = VestingLock(0, 0, 0, 0); emit VestingUnlocked(account); } /** * @dev Get vesting lock info * @param account The address want to know the vesting lock state. * @return vesting lock info */ function getVestingLock(address account) public view returns ( uint256, uint256, uint256, uint256 ) { return (_vestingLocks[account].amount, _vestingLocks[account].startsAt, _vestingLocks[account].period, _vestingLocks[account].count); } /** * @dev Get total vesting locked amount of address, locked amount will be released by 100%/months * If months is 5, locked amount released 20% per 1 month. * @param account The address want to know the vesting lock amount. * @return vesting locked amount */ function getVestingLockedAmount(address account) public view returns (uint256) { uint256 vestingLockedAmount = 0; uint256 amount = _vestingLocks[account].amount; if (amount > 0) { uint256 startsAt = _vestingLocks[account].startsAt; uint256 period = _vestingLocks[account].period; uint256 count = _vestingLocks[account].count; uint256 expiresAt = startsAt + period * (count - 1); uint256 timestamp = block.timestamp; if (timestamp < startsAt) { vestingLockedAmount = amount; } else if (timestamp < expiresAt) { vestingLockedAmount = (amount * ((expiresAt - timestamp) / period + 1)) / count; } } return vestingLockedAmount; } /** * @dev Get all locked amount * @param account The address want to know the all locked amount * @return all locked amount */ function getAllLockedAmount(address account) public view returns (uint256) { return getTimeLockedAmount(account) + getVestingLockedAmount(account); } } /** * @dev Contract for METANOA Token */ contract NOA is Pausable, Ownable, Supervisable, Burnable, Freezable, Lockable, ERC20 { uint256 private constant _initialSupply = 1_000_000_000e18; constructor() ERC20("METANOA", "NOA") { _mint(_msgSender(), _initialSupply); } /** * @dev Recover ERC20 coin in contract address. * @param tokenAddress The token contract address * @param tokenAmount Number of tokens to be sent */ function recoverERC20(address tokenAddress, uint256 tokenAmount) public onlyOwner { IERC20(tokenAddress).transfer(owner(), tokenAmount); } /** * @dev lock and pause before transfer token */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal override(ERC20) { super._beforeTokenTransfer(from, to, amount); require(!isFreezed(from), "Freezable: token transfer from freezed account"); require(!isFreezed(to), "Freezable: token transfer to freezed account"); require(!isFreezed(_msgSender()), "Freezable: token transfer called from freezed account"); require(!paused(), "Pausable: token transfer while paused"); require(balanceOf(from) - getAllLockedAmount(from) >= amount, "Lockable: insufficient transfer amount"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner whenNotPaused { _transferOwnership(address(0)); } /** * @dev only supervisor can renounce supervisor ownership */ function renounceSupervisorOwnership() public onlySupervisor whenNotPaused { _transferSupervisorOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner whenNotPaused { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev only supervisor can transfer supervisor ownership */ function transferSupervisorOwnership(address newSupervisor) public onlySupervisor whenNotPaused { require(newSupervisor != address(0), "Supervisable: new supervisor is the zero address"); _transferSupervisorOwnership(newSupervisor); } /** * @dev pause all coin transfer */ function pause() public onlyOwner whenNotPaused { _pause(); } /** * @dev unpause all coin transfer */ function unpause() public onlyOwner whenPaused { _unpause(); } /** * @dev only owner can lock account */ function freeze(address account) public onlyOwner whenNotPaused { _freeze(account); } /** * @dev only supervisor can unfreeze account */ function unfreeze(address account) public onlySupervisor whenNotPaused { _unfreeze(account); } /** * @dev only owner can add burner */ function addBurner(address account) public onlyOwner whenNotPaused { _addBurner(account); } /** * @dev only owner can remove burner */ function removeBurner(address account) public onlyOwner whenNotPaused { _removeBurner(account); } /** * @dev burn burner's coin */ function burn(uint256 amount) public onlyBurner whenNotPaused { _burn(_msgSender(), amount); } /** * @dev only owner can add locker */ function addLocker(address account) public onlyOwner whenNotPaused { _addLocker(account); } /** * @dev only owner can remove locker */ function removeLocker(address account) public onlyOwner whenNotPaused { _removeLocker(account); } /** * @dev only locker can add time lock */ function addTimeLock( address account, uint256 amount, uint256 expiresAt ) public onlyLocker whenNotPaused { _addTimeLock(account, amount, expiresAt); } /** * @dev only supervisor can remove time lock */ function removeTimeLock(address account, uint8 index) public onlySupervisor whenNotPaused { _removeTimeLock(account, index); } /** * @dev only locker can add vesting lock */ function addVestingLock( address account, uint256 startsAt, uint256 period, uint256 count ) public onlyLocker whenNotPaused { _addVestingLock(account, balanceOf(account), startsAt, period, count); } /** * @dev only supervisor can remove vesting lock */ function removeVestingLock(address account) public onlySupervisor whenNotPaused { _removeVestingLock(account); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BurnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BurnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Freezed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LockerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LockerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previouSupervisor","type":"address"},{"indexed":true,"internalType":"address","name":"newSupervisor","type":"address"}],"name":"SupervisorOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TimeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TimeUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Unfreezed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"VestingLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"VestingUnlocked","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiresAt","type":"uint256"}],"name":"addTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"startsAt","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"addVestingLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"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":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"freeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAllLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"getTimeLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTimeLockLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTimeLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVestingLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVestingLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"account","type":"address"}],"name":"isBurner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isFreezed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isLocker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"removeTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeVestingLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceSupervisorOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supervisor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSupervisor","type":"address"}],"name":"transferSupervisorOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unfreeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060408051808201825260078152664d4554414e4f4160c81b602080830191909152825180840190935260038352624e4f4160e81b908301526000805460ff19169055906200006033620000ca565b6200006b3362000123565b81516200008090600a9060208501906200025d565b5080516200009690600b9060208401906200025d565b505050620000c0620000ad620000c660201b60201c565b6b033b2e3c9fd0803ce800000062000175565b62000366565b3390565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907facf6a327286171e5ce7f9bf15425ff49aab0fd07752fec84b2bd232c9f480c1790600090a35050565b6001600160a01b038216620001d05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060096000828254620001e4919062000303565b90915550506001600160a01b038216600090815260076020526040812080548392906200021390849062000303565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b8280546200026b906200032a565b90600052602060002090601f0160209004810192826200028f5760008555620002da565b82601f10620002aa57805160ff1916838001178555620002da565b82800160010185558215620002da579182015b82811115620002da578251825591602001919060010190620002bd565b50620002e8929150620002ec565b5090565b5b80821115620002e85760008155600101620002ed565b600082198211156200032557634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200033f57607f821691505b6020821081036200036057634e487b7160e01b600052602260045260246000fd5b50919050565b6126de80620003766000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c806370a0823111610146578063a9059cbb116100c3578063c47a784c11610087578063c47a784c146105b7578063ce62cd4a146105ca578063dd62ed3e146105dd578063f2fde38b146105f0578063f44637ba14610603578063f99a2ca01461061657600080fd5b8063a9059cbb1461054d578063ab0de0fe14610560578063b0a087c514610573578063ba40c71a1461057b578063be4329f4146105a457600080fd5b80638980f11f1161010a5780638980f11f146104f65780638d1fdf2f146105095780638da5cb5b1461051c57806395d89b4114610532578063a457c2d71461053a57600080fd5b806370a082311461047e578063715018a6146104a75780638111f24e146104af5780638456cb59146104db578063854d9ffe146104e357600080fd5b806339509351116101d457806345cc58901161019857806345cc5890146104005780634ca47ad11461041357806356e4b68b1461043b5780635c975abb146104605780636f395c831461046b57600080fd5b806339509351146103935780633f4ba83a146103a657806342966c68146103ae5780634334614a146103c157806345c8b1a6146103ed57600080fd5b806319651dbf1161021b57806319651dbf146102d357806323b872dd146103325780632ec63d7c14610345578063313ce56714610371578063363b3c151461038057600080fd5b8063028468581461025857806306fdde031461026d578063095ea7b31461028b5780630d605482146102ae57806318160ddd146102c1575b600080fd5b61026b6102663660046122c4565b610629565b005b610275610691565b60405161028291906122e6565b60405180910390f35b61029e61029936600461233b565b610723565b6040519015158152602001610282565b61026b6102bc366004612365565b61073b565b6009545b604051908152602001610282565b6103126102e13660046122c4565b6001600160a01b03166000908152600660205260409020805460018201546002830154600390930154919390929190565b604080519485526020850193909352918301526060820152608001610282565b61029e610340366004612398565b61079d565b61029e6103533660046122c4565b6001600160a01b031660009081526004602052604090205460ff1690565b60405160128152602001610282565b61026b61038e3660046122c4565b6107c1565b61029e6103a136600461233b565b610886565b61026b6108a8565b61026b6103bc3660046123d4565b61092b565b61029e6103cf3660046122c4565b6001600160a01b031660009081526002602052604090205460ff1690565b61026b6103fb3660046122c4565b6109c2565b61026b61040e3660046122c4565b610a18565b6104266104213660046123ed565b610a74565b60408051928352602083019190915201610282565b6001546001600160a01b03165b6040516001600160a01b039091168152602001610282565b60005460ff1661029e565b61026b6104793660046123ed565b610b6d565b6102c561048c3660046122c4565b6001600160a01b031660009081526007602052604090205490565b61026b610bc8565b61029e6104bd3660046122c4565b6001600160a01b031660009081526003602052604090205460ff1690565b61026b610c25565b6102c56104f13660046122c4565b610c80565b61026b61050436600461233b565b610ca4565b61026b6105173660046122c4565b610d6c565b60005461010090046001600160a01b0316610448565b610275610dc8565b61029e61054836600461233b565b610dd7565b61029e61055b36600461233b565b610e52565b6102c561056e3660046122c4565b610e60565b61026b610f2c565b6102c56105893660046122c4565b6001600160a01b031660009081526005602052604090205490565b6102c56105b23660046122c4565b610f83565b61026b6105c536600461242a565b611050565b61026b6105d83660046122c4565b6110d3565b6102c56105eb366004612463565b61112f565b61026b6105fe3660046122c4565b61115a565b61026b6106113660046122c4565b61121b565b61026b6106243660046122c4565b611277565b6000546001600160a01b036101009091041633146106625760405162461bcd60e51b815260040161065990612496565b60405180910390fd5b60005460ff16156106855760405162461bcd60e51b8152600401610659906124cb565b61068e816112cd565b50565b6060600a80546106a0906124f5565b80601f01602080910402602001604051908101604052809291908181526020018280546106cc906124f5565b80156107195780601f106106ee57610100808354040283529160200191610719565b820191906000526020600020905b8154815290600101906020018083116106fc57829003601f168201915b5050505050905090565b600033610731818585611316565b5060019392505050565b3360009081526004602052604090205460ff1661076a5760405162461bcd60e51b81526004016106599061252f565b60005460ff161561078d5760405162461bcd60e51b8152600401610659906124cb565b61079883838361143b565b505050565b6000336107ab858285611552565b6107b68585856115c6565b506001949350505050565b6001546001600160a01b031633146107eb5760405162461bcd60e51b815260040161065990612571565b60005460ff161561080e5760405162461bcd60e51b8152600401610659906124cb565b6001600160a01b03811661087d5760405162461bcd60e51b815260206004820152603060248201527f537570657276697361626c653a206e65772073757065727669736f722069732060448201526f746865207a65726f206164647265737360801b6064820152608401610659565b61068e816117a0565b600033610731818585610899838361112f565b6108a391906125d1565b611316565b6000546001600160a01b036101009091041633146108d85760405162461bcd60e51b815260040161065990612496565b60005460ff166109215760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610659565b6109296117f2565b565b3360009081526002602052604090205460ff166109955760405162461bcd60e51b815260206004820152602260248201527f4275726e61626c653a2063616c6c6572206973206e6f7420746865206275726e60448201526132b960f11b6064820152608401610659565b60005460ff16156109b85760405162461bcd60e51b8152600401610659906124cb565b61068e3382611885565b6001546001600160a01b031633146109ec5760405162461bcd60e51b815260040161065990612571565b60005460ff1615610a0f5760405162461bcd60e51b8152600401610659906124cb565b61068e816119cb565b6000546001600160a01b03610100909104163314610a485760405162461bcd60e51b815260040161065990612496565b60005460ff1615610a6b5760405162461bcd60e51b8152600401610659906124cb565b61068e81611a14565b6001600160a01b038216600090815260056020526040812054819060ff8416108015610a9e575060015b610ae55760405162461bcd60e51b81526020600482015260186024820152770a8d2daca4098dec6d67440d2dcecc2d8d2c840d2dcc8caf60431b6044820152606401610659565b6001600160a01b0384166000908152600560205260409020805460ff8516908110610b1257610b126125e9565b600091825260208083206002909202909101546001600160a01b038716835260059091526040909120805460ff8616908110610b5057610b506125e9565b906000526020600020906002020160010154915091509250929050565b6001546001600160a01b03163314610b975760405162461bcd60e51b815260040161065990612571565b60005460ff1615610bba5760405162461bcd60e51b8152600401610659906124cb565b610bc48282611a60565b5050565b6000546001600160a01b03610100909104163314610bf85760405162461bcd60e51b815260040161065990612496565b60005460ff1615610c1b5760405162461bcd60e51b8152600401610659906124cb565b6109296000611c12565b6000546001600160a01b03610100909104163314610c555760405162461bcd60e51b815260040161065990612496565b60005460ff1615610c785760405162461bcd60e51b8152600401610659906124cb565b610929611c6b565b6000610c8b82610e60565b610c9483610f83565b610c9e91906125d1565b92915050565b6000546001600160a01b03610100909104163314610cd45760405162461bcd60e51b815260040161065990612496565b816001600160a01b031663a9059cbb610cfb6000546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610d48573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079891906125ff565b6000546001600160a01b03610100909104163314610d9c5760405162461bcd60e51b815260040161065990612496565b60005460ff1615610dbf5760405162461bcd60e51b8152600401610659906124cb565b61068e81611cc3565b6060600b80546106a0906124f5565b60003381610de5828661112f565b905083811015610e455760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610659565b6107b68286868403611316565b6000336107318185856115c6565b6001600160a01b03811660009081526006602052604081205481908015610f25576001600160a01b0384166000908152600660205260408120600180820154600283015460039093015490939091610eb89083612621565b610ec29084612638565b610ecc90856125d1565b90504284811015610edf57859650610f1f565b81811015610f1f578284610ef38385612621565b610efd9190612657565b610f089060016125d1565b610f129088612638565b610f1c9190612657565b96505b50505050505b5092915050565b6001546001600160a01b03163314610f565760405162461bcd60e51b815260040161065990612571565b60005460ff1615610f795760405162461bcd60e51b8152600401610659906124cb565b61092960006117a0565b6001600160a01b0381166000908152600560205260408120548190815b81811015611047576001600160a01b0385166000908152600560205260409020805482908110610fd257610fd26125e9565b906000526020600020906002020160010154421015611035576001600160a01b0385166000908152600560205260409020805482908110611015576110156125e9565b9060005260206000209060020201600001548361103291906125d1565b92505b8061103f81612679565b915050610fa0565b50909392505050565b3360009081526004602052604090205460ff1661107f5760405162461bcd60e51b81526004016106599061252f565b60005460ff16156110a25760405162461bcd60e51b8152600401610659906124cb565b6110cd846110c5866001600160a01b031660009081526007602052604090205490565b858585611d0f565b50505050565b6000546001600160a01b036101009091041633146111035760405162461bcd60e51b815260040161065990612496565b60005460ff16156111265760405162461bcd60e51b8152600401610659906124cb565b61068e81611f38565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6000546001600160a01b0361010090910416331461118a5760405162461bcd60e51b815260040161065990612496565b60005460ff16156111ad5760405162461bcd60e51b8152600401610659906124cb565b6001600160a01b0381166112125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610659565b61068e81611c12565b6000546001600160a01b0361010090910416331461124b5760405162461bcd60e51b815260040161065990612496565b60005460ff161561126e5760405162461bcd60e51b8152600401610659906124cb565b61068e81611f81565b6001546001600160a01b031633146112a15760405162461bcd60e51b815260040161065990612571565b60005460ff16156112c45760405162461bcd60e51b8152600401610659906124cb565b61068e81611fcd565b6001600160a01b038116600081815260026020526040808220805460ff19169055517f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e9190a250565b6001600160a01b0383166113785760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610659565b6001600160a01b0382166113d95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610659565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000821161148b5760405162461bcd60e51b815260206004820152601b60248201527f54696d65204c6f636b3a206c6f636b20616d6f756e74206973203000000000006044820152606401610659565b4281116114da5760405162461bcd60e51b815260206004820152601e60248201527f54696d65204c6f636b3a20696e76616c696420657870697265206461746500006044820152606401610659565b6001600160a01b0383166000818152600560209081526040808320815180830183528781528084018781528254600181810185559387529486209151600290950290910193845551920191909155517fc80fbc3452298019908587d820303825af4187ac57ed90d7328886fd00b225579190a2505050565b600061155e848461112f565b905060001981146110cd57818110156115b95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610659565b6110cd8484848403611316565b6001600160a01b03831661162a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610659565b6001600160a01b03821661168c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610659565b61169783838361204b565b6001600160a01b0383166000908152600760205260409020548181101561170f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610659565b6001600160a01b038085166000908152600760205260408082208585039055918516815290812080548492906117469084906125d1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161179291815260200190565b60405180910390a350505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907facf6a327286171e5ce7f9bf15425ff49aab0fd07752fec84b2bd232c9f480c1790600090a35050565b60005460ff1661183b5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610659565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382166118e55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610659565b6001600160a01b038216600090815260076020526040902054818110156119595760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610659565b6001600160a01b0383166000908152600760205260408120838303905560098054849290611988908490612621565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161142e565b6001600160a01b038116600081815260036020526040808220805460ff19169055517f4d1fe3cc0f516ce2cfc5e83d52ee28af7f55376b18f58e7081c5fd25d8eeb1df9190a250565b6001600160a01b038116600081815260046020526040808220805460ff19166001179055517f7c5af8d36d8be103bc583da8e01d3e98f15216cc7ef38832c7550b34e8feb43a9190a250565b6001600160a01b03821660009081526005602052604090205460ff8216108015611a88575060015b611acf5760405162461bcd60e51b81526020600482015260186024820152770a8d2daca4098dec6d67440d2dcecc2d8d2c840d2dcc8caf60431b6044820152606401610659565b6001600160a01b03821660009081526005602052604090205460ff8216611af7600183612621565b14611b95576001600160a01b0383166000908152600560205260409020611b1f600183612621565b81548110611b2f57611b2f6125e9565b906000526020600020906002020160056000856001600160a01b03166001600160a01b031681526020019081526020016000208360ff1681548110611b7657611b766125e9565b6000918252602090912082546002909202019081556001918201549101555b6001600160a01b0383166000908152600560205260409020805480611bbc57611bbc612692565b60008281526020812060026000199093019283020181815560010181905591556040516001600160a01b038516917fb34baa9e1ce392292123bbdca3018904b21991f7411e14d99a10aaf88ec8ea0d91a2505050565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b60005460ff1615611c8e5760405162461bcd60e51b8152600401610659906124cb565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118683390565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f0de8364a528e5ca2869160b20c375fe85b4e98d24a9cb48b4dc49c5f76d05b249190a250565b6001600160a01b038516611d765760405162461bcd60e51b815260206004820152602860248201527f56657374696e67204c6f636b3a206c6f636b2066726f6d20746865207a65726f604482015267206164647265737360c01b6064820152608401610659565b428311611dc55760405162461bcd60e51b815260206004820181905260248201527f56657374696e67204c6f636b3a206d75737420736574206166746572206e6f776044820152606401610659565b60008411611e155760405162461bcd60e51b815260206004820152601960248201527f56657374696e67204c6f636b3a20616d6f756e742069732030000000000000006044820152606401610659565b60008211611e655760405162461bcd60e51b815260206004820152601960248201527f56657374696e67204c6f636b3a20706572696f642069732030000000000000006044820152606401610659565b60008111611eb55760405162461bcd60e51b815260206004820152601860248201527f56657374696e67204c6f636b3a20636f756e74206973203000000000000000006044820152606401610659565b604080516080810182528581526020808201868152828401868152606084018681526001600160a01b038b166000818152600690955286852095518655925160018601559051600285015551600390930192909255915190917f04a72c810da52db1f0e22421438d411667cd0c1559e9ae7c638f1aed4bfa066d91a25050505050565b6001600160a01b038116600081815260046020526040808220805460ff19169055517f95266445d018e5b30f957c915e91b04bb4a19bf0f8f21020a08dad9be7931df49190a250565b6001600160a01b038116600081815260026020526040808220805460ff19166001179055517f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b945609190a250565b6040805160808101825260008082526020808301828152838501838152606085018481526001600160a01b0388168086526006909452868520955186559151600186015551600285015551600390930192909255915190917ff71e9d23ff58e708ca92807894c580d899e97ab5bacc17df3543475e0e439f8491a250565b6001600160a01b03831660009081526003602052604090205460ff16156120cb5760405162461bcd60e51b815260206004820152602e60248201527f467265657a61626c653a20746f6b656e207472616e736665722066726f6d206660448201526d1c99595e9959081858d8dbdd5b9d60921b6064820152608401610659565b6001600160a01b03821660009081526003602052604090205460ff16156121495760405162461bcd60e51b815260206004820152602c60248201527f467265657a61626c653a20746f6b656e207472616e7366657220746f2066726560448201526b195e9959081858d8dbdd5b9d60a21b6064820152608401610659565b612152336104bd565b156121bd5760405162461bcd60e51b815260206004820152603560248201527f467265657a61626c653a20746f6b656e207472616e736665722063616c6c656460448201527408199c9bdb48199c99595e9959081858d8dbdd5b9d605a1b6064820152608401610659565b60005460ff161561221e5760405162461bcd60e51b815260206004820152602560248201527f5061757361626c653a20746f6b656e207472616e73666572207768696c652070604482015264185d5cd95960da1b6064820152608401610659565b8061222884610c80565b6001600160a01b03851660009081526007602052604090205461224b9190612621565b10156107985760405162461bcd60e51b815260206004820152602660248201527f4c6f636b61626c653a20696e73756666696369656e74207472616e7366657220604482015265185b5bdd5b9d60d21b6064820152608401610659565b80356001600160a01b03811681146122bf57600080fd5b919050565b6000602082840312156122d657600080fd5b6122df826122a8565b9392505050565b600060208083528351808285015260005b81811015612313578581018301518582016040015282016122f7565b81811115612325576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561234e57600080fd5b612357836122a8565b946020939093013593505050565b60008060006060848603121561237a57600080fd5b612383846122a8565b95602085013595506040909401359392505050565b6000806000606084860312156123ad57600080fd5b6123b6846122a8565b92506123c4602085016122a8565b9150604084013590509250925092565b6000602082840312156123e657600080fd5b5035919050565b6000806040838503121561240057600080fd5b612409836122a8565b9150602083013560ff8116811461241f57600080fd5b809150509250929050565b6000806000806080858703121561244057600080fd5b612449856122a8565b966020860135965060408601359560600135945092505050565b6000806040838503121561247657600080fd5b61247f836122a8565b915061248d602084016122a8565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b600181811c9082168061250957607f821691505b60208210810361252957634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526022908201527f4c6f636b61626c653a2063616c6c6572206973206e6f7420746865206c6f636b60408201526132b960f11b606082015260800190565b6020808252602a908201527f537570657276697361626c653a2063616c6c6572206973206e6f74207468652060408201526939bab832b93b34b9b7b960b11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156125e4576125e46125bb565b500190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561261157600080fd5b815180151581146122df57600080fd5b600082821015612633576126336125bb565b500390565b6000816000190483118215151615612652576126526125bb565b500290565b60008261267457634e487b7160e01b600052601260045260246000fd5b500490565b60006001820161268b5761268b6125bb565b5060010190565b634e487b7160e01b600052603160045260246000fdfea26469706673582212209ea965a5167738a7741ab07362dc3cfe3b8894b24197c63af62c53221441ff2864736f6c634300080d0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102535760003560e01c806370a0823111610146578063a9059cbb116100c3578063c47a784c11610087578063c47a784c146105b7578063ce62cd4a146105ca578063dd62ed3e146105dd578063f2fde38b146105f0578063f44637ba14610603578063f99a2ca01461061657600080fd5b8063a9059cbb1461054d578063ab0de0fe14610560578063b0a087c514610573578063ba40c71a1461057b578063be4329f4146105a457600080fd5b80638980f11f1161010a5780638980f11f146104f65780638d1fdf2f146105095780638da5cb5b1461051c57806395d89b4114610532578063a457c2d71461053a57600080fd5b806370a082311461047e578063715018a6146104a75780638111f24e146104af5780638456cb59146104db578063854d9ffe146104e357600080fd5b806339509351116101d457806345cc58901161019857806345cc5890146104005780634ca47ad11461041357806356e4b68b1461043b5780635c975abb146104605780636f395c831461046b57600080fd5b806339509351146103935780633f4ba83a146103a657806342966c68146103ae5780634334614a146103c157806345c8b1a6146103ed57600080fd5b806319651dbf1161021b57806319651dbf146102d357806323b872dd146103325780632ec63d7c14610345578063313ce56714610371578063363b3c151461038057600080fd5b8063028468581461025857806306fdde031461026d578063095ea7b31461028b5780630d605482146102ae57806318160ddd146102c1575b600080fd5b61026b6102663660046122c4565b610629565b005b610275610691565b60405161028291906122e6565b60405180910390f35b61029e61029936600461233b565b610723565b6040519015158152602001610282565b61026b6102bc366004612365565b61073b565b6009545b604051908152602001610282565b6103126102e13660046122c4565b6001600160a01b03166000908152600660205260409020805460018201546002830154600390930154919390929190565b604080519485526020850193909352918301526060820152608001610282565b61029e610340366004612398565b61079d565b61029e6103533660046122c4565b6001600160a01b031660009081526004602052604090205460ff1690565b60405160128152602001610282565b61026b61038e3660046122c4565b6107c1565b61029e6103a136600461233b565b610886565b61026b6108a8565b61026b6103bc3660046123d4565b61092b565b61029e6103cf3660046122c4565b6001600160a01b031660009081526002602052604090205460ff1690565b61026b6103fb3660046122c4565b6109c2565b61026b61040e3660046122c4565b610a18565b6104266104213660046123ed565b610a74565b60408051928352602083019190915201610282565b6001546001600160a01b03165b6040516001600160a01b039091168152602001610282565b60005460ff1661029e565b61026b6104793660046123ed565b610b6d565b6102c561048c3660046122c4565b6001600160a01b031660009081526007602052604090205490565b61026b610bc8565b61029e6104bd3660046122c4565b6001600160a01b031660009081526003602052604090205460ff1690565b61026b610c25565b6102c56104f13660046122c4565b610c80565b61026b61050436600461233b565b610ca4565b61026b6105173660046122c4565b610d6c565b60005461010090046001600160a01b0316610448565b610275610dc8565b61029e61054836600461233b565b610dd7565b61029e61055b36600461233b565b610e52565b6102c561056e3660046122c4565b610e60565b61026b610f2c565b6102c56105893660046122c4565b6001600160a01b031660009081526005602052604090205490565b6102c56105b23660046122c4565b610f83565b61026b6105c536600461242a565b611050565b61026b6105d83660046122c4565b6110d3565b6102c56105eb366004612463565b61112f565b61026b6105fe3660046122c4565b61115a565b61026b6106113660046122c4565b61121b565b61026b6106243660046122c4565b611277565b6000546001600160a01b036101009091041633146106625760405162461bcd60e51b815260040161065990612496565b60405180910390fd5b60005460ff16156106855760405162461bcd60e51b8152600401610659906124cb565b61068e816112cd565b50565b6060600a80546106a0906124f5565b80601f01602080910402602001604051908101604052809291908181526020018280546106cc906124f5565b80156107195780601f106106ee57610100808354040283529160200191610719565b820191906000526020600020905b8154815290600101906020018083116106fc57829003601f168201915b5050505050905090565b600033610731818585611316565b5060019392505050565b3360009081526004602052604090205460ff1661076a5760405162461bcd60e51b81526004016106599061252f565b60005460ff161561078d5760405162461bcd60e51b8152600401610659906124cb565b61079883838361143b565b505050565b6000336107ab858285611552565b6107b68585856115c6565b506001949350505050565b6001546001600160a01b031633146107eb5760405162461bcd60e51b815260040161065990612571565b60005460ff161561080e5760405162461bcd60e51b8152600401610659906124cb565b6001600160a01b03811661087d5760405162461bcd60e51b815260206004820152603060248201527f537570657276697361626c653a206e65772073757065727669736f722069732060448201526f746865207a65726f206164647265737360801b6064820152608401610659565b61068e816117a0565b600033610731818585610899838361112f565b6108a391906125d1565b611316565b6000546001600160a01b036101009091041633146108d85760405162461bcd60e51b815260040161065990612496565b60005460ff166109215760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610659565b6109296117f2565b565b3360009081526002602052604090205460ff166109955760405162461bcd60e51b815260206004820152602260248201527f4275726e61626c653a2063616c6c6572206973206e6f7420746865206275726e60448201526132b960f11b6064820152608401610659565b60005460ff16156109b85760405162461bcd60e51b8152600401610659906124cb565b61068e3382611885565b6001546001600160a01b031633146109ec5760405162461bcd60e51b815260040161065990612571565b60005460ff1615610a0f5760405162461bcd60e51b8152600401610659906124cb565b61068e816119cb565b6000546001600160a01b03610100909104163314610a485760405162461bcd60e51b815260040161065990612496565b60005460ff1615610a6b5760405162461bcd60e51b8152600401610659906124cb565b61068e81611a14565b6001600160a01b038216600090815260056020526040812054819060ff8416108015610a9e575060015b610ae55760405162461bcd60e51b81526020600482015260186024820152770a8d2daca4098dec6d67440d2dcecc2d8d2c840d2dcc8caf60431b6044820152606401610659565b6001600160a01b0384166000908152600560205260409020805460ff8516908110610b1257610b126125e9565b600091825260208083206002909202909101546001600160a01b038716835260059091526040909120805460ff8616908110610b5057610b506125e9565b906000526020600020906002020160010154915091509250929050565b6001546001600160a01b03163314610b975760405162461bcd60e51b815260040161065990612571565b60005460ff1615610bba5760405162461bcd60e51b8152600401610659906124cb565b610bc48282611a60565b5050565b6000546001600160a01b03610100909104163314610bf85760405162461bcd60e51b815260040161065990612496565b60005460ff1615610c1b5760405162461bcd60e51b8152600401610659906124cb565b6109296000611c12565b6000546001600160a01b03610100909104163314610c555760405162461bcd60e51b815260040161065990612496565b60005460ff1615610c785760405162461bcd60e51b8152600401610659906124cb565b610929611c6b565b6000610c8b82610e60565b610c9483610f83565b610c9e91906125d1565b92915050565b6000546001600160a01b03610100909104163314610cd45760405162461bcd60e51b815260040161065990612496565b816001600160a01b031663a9059cbb610cfb6000546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610d48573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079891906125ff565b6000546001600160a01b03610100909104163314610d9c5760405162461bcd60e51b815260040161065990612496565b60005460ff1615610dbf5760405162461bcd60e51b8152600401610659906124cb565b61068e81611cc3565b6060600b80546106a0906124f5565b60003381610de5828661112f565b905083811015610e455760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610659565b6107b68286868403611316565b6000336107318185856115c6565b6001600160a01b03811660009081526006602052604081205481908015610f25576001600160a01b0384166000908152600660205260408120600180820154600283015460039093015490939091610eb89083612621565b610ec29084612638565b610ecc90856125d1565b90504284811015610edf57859650610f1f565b81811015610f1f578284610ef38385612621565b610efd9190612657565b610f089060016125d1565b610f129088612638565b610f1c9190612657565b96505b50505050505b5092915050565b6001546001600160a01b03163314610f565760405162461bcd60e51b815260040161065990612571565b60005460ff1615610f795760405162461bcd60e51b8152600401610659906124cb565b61092960006117a0565b6001600160a01b0381166000908152600560205260408120548190815b81811015611047576001600160a01b0385166000908152600560205260409020805482908110610fd257610fd26125e9565b906000526020600020906002020160010154421015611035576001600160a01b0385166000908152600560205260409020805482908110611015576110156125e9565b9060005260206000209060020201600001548361103291906125d1565b92505b8061103f81612679565b915050610fa0565b50909392505050565b3360009081526004602052604090205460ff1661107f5760405162461bcd60e51b81526004016106599061252f565b60005460ff16156110a25760405162461bcd60e51b8152600401610659906124cb565b6110cd846110c5866001600160a01b031660009081526007602052604090205490565b858585611d0f565b50505050565b6000546001600160a01b036101009091041633146111035760405162461bcd60e51b815260040161065990612496565b60005460ff16156111265760405162461bcd60e51b8152600401610659906124cb565b61068e81611f38565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6000546001600160a01b0361010090910416331461118a5760405162461bcd60e51b815260040161065990612496565b60005460ff16156111ad5760405162461bcd60e51b8152600401610659906124cb565b6001600160a01b0381166112125760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610659565b61068e81611c12565b6000546001600160a01b0361010090910416331461124b5760405162461bcd60e51b815260040161065990612496565b60005460ff161561126e5760405162461bcd60e51b8152600401610659906124cb565b61068e81611f81565b6001546001600160a01b031633146112a15760405162461bcd60e51b815260040161065990612571565b60005460ff16156112c45760405162461bcd60e51b8152600401610659906124cb565b61068e81611fcd565b6001600160a01b038116600081815260026020526040808220805460ff19169055517f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e9190a250565b6001600160a01b0383166113785760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610659565b6001600160a01b0382166113d95760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610659565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000821161148b5760405162461bcd60e51b815260206004820152601b60248201527f54696d65204c6f636b3a206c6f636b20616d6f756e74206973203000000000006044820152606401610659565b4281116114da5760405162461bcd60e51b815260206004820152601e60248201527f54696d65204c6f636b3a20696e76616c696420657870697265206461746500006044820152606401610659565b6001600160a01b0383166000818152600560209081526040808320815180830183528781528084018781528254600181810185559387529486209151600290950290910193845551920191909155517fc80fbc3452298019908587d820303825af4187ac57ed90d7328886fd00b225579190a2505050565b600061155e848461112f565b905060001981146110cd57818110156115b95760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610659565b6110cd8484848403611316565b6001600160a01b03831661162a5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610659565b6001600160a01b03821661168c5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610659565b61169783838361204b565b6001600160a01b0383166000908152600760205260409020548181101561170f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610659565b6001600160a01b038085166000908152600760205260408082208585039055918516815290812080548492906117469084906125d1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161179291815260200190565b60405180910390a350505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907facf6a327286171e5ce7f9bf15425ff49aab0fd07752fec84b2bd232c9f480c1790600090a35050565b60005460ff1661183b5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610659565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382166118e55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610659565b6001600160a01b038216600090815260076020526040902054818110156119595760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610659565b6001600160a01b0383166000908152600760205260408120838303905560098054849290611988908490612621565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161142e565b6001600160a01b038116600081815260036020526040808220805460ff19169055517f4d1fe3cc0f516ce2cfc5e83d52ee28af7f55376b18f58e7081c5fd25d8eeb1df9190a250565b6001600160a01b038116600081815260046020526040808220805460ff19166001179055517f7c5af8d36d8be103bc583da8e01d3e98f15216cc7ef38832c7550b34e8feb43a9190a250565b6001600160a01b03821660009081526005602052604090205460ff8216108015611a88575060015b611acf5760405162461bcd60e51b81526020600482015260186024820152770a8d2daca4098dec6d67440d2dcecc2d8d2c840d2dcc8caf60431b6044820152606401610659565b6001600160a01b03821660009081526005602052604090205460ff8216611af7600183612621565b14611b95576001600160a01b0383166000908152600560205260409020611b1f600183612621565b81548110611b2f57611b2f6125e9565b906000526020600020906002020160056000856001600160a01b03166001600160a01b031681526020019081526020016000208360ff1681548110611b7657611b766125e9565b6000918252602090912082546002909202019081556001918201549101555b6001600160a01b0383166000908152600560205260409020805480611bbc57611bbc612692565b60008281526020812060026000199093019283020181815560010181905591556040516001600160a01b038516917fb34baa9e1ce392292123bbdca3018904b21991f7411e14d99a10aaf88ec8ea0d91a2505050565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b60005460ff1615611c8e5760405162461bcd60e51b8152600401610659906124cb565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118683390565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f0de8364a528e5ca2869160b20c375fe85b4e98d24a9cb48b4dc49c5f76d05b249190a250565b6001600160a01b038516611d765760405162461bcd60e51b815260206004820152602860248201527f56657374696e67204c6f636b3a206c6f636b2066726f6d20746865207a65726f604482015267206164647265737360c01b6064820152608401610659565b428311611dc55760405162461bcd60e51b815260206004820181905260248201527f56657374696e67204c6f636b3a206d75737420736574206166746572206e6f776044820152606401610659565b60008411611e155760405162461bcd60e51b815260206004820152601960248201527f56657374696e67204c6f636b3a20616d6f756e742069732030000000000000006044820152606401610659565b60008211611e655760405162461bcd60e51b815260206004820152601960248201527f56657374696e67204c6f636b3a20706572696f642069732030000000000000006044820152606401610659565b60008111611eb55760405162461bcd60e51b815260206004820152601860248201527f56657374696e67204c6f636b3a20636f756e74206973203000000000000000006044820152606401610659565b604080516080810182528581526020808201868152828401868152606084018681526001600160a01b038b166000818152600690955286852095518655925160018601559051600285015551600390930192909255915190917f04a72c810da52db1f0e22421438d411667cd0c1559e9ae7c638f1aed4bfa066d91a25050505050565b6001600160a01b038116600081815260046020526040808220805460ff19169055517f95266445d018e5b30f957c915e91b04bb4a19bf0f8f21020a08dad9be7931df49190a250565b6001600160a01b038116600081815260026020526040808220805460ff19166001179055517f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b945609190a250565b6040805160808101825260008082526020808301828152838501838152606085018481526001600160a01b0388168086526006909452868520955186559151600186015551600285015551600390930192909255915190917ff71e9d23ff58e708ca92807894c580d899e97ab5bacc17df3543475e0e439f8491a250565b6001600160a01b03831660009081526003602052604090205460ff16156120cb5760405162461bcd60e51b815260206004820152602e60248201527f467265657a61626c653a20746f6b656e207472616e736665722066726f6d206660448201526d1c99595e9959081858d8dbdd5b9d60921b6064820152608401610659565b6001600160a01b03821660009081526003602052604090205460ff16156121495760405162461bcd60e51b815260206004820152602c60248201527f467265657a61626c653a20746f6b656e207472616e7366657220746f2066726560448201526b195e9959081858d8dbdd5b9d60a21b6064820152608401610659565b612152336104bd565b156121bd5760405162461bcd60e51b815260206004820152603560248201527f467265657a61626c653a20746f6b656e207472616e736665722063616c6c656460448201527408199c9bdb48199c99595e9959081858d8dbdd5b9d605a1b6064820152608401610659565b60005460ff161561221e5760405162461bcd60e51b815260206004820152602560248201527f5061757361626c653a20746f6b656e207472616e73666572207768696c652070604482015264185d5cd95960da1b6064820152608401610659565b8061222884610c80565b6001600160a01b03851660009081526007602052604090205461224b9190612621565b10156107985760405162461bcd60e51b815260206004820152602660248201527f4c6f636b61626c653a20696e73756666696369656e74207472616e7366657220604482015265185b5bdd5b9d60d21b6064820152608401610659565b80356001600160a01b03811681146122bf57600080fd5b919050565b6000602082840312156122d657600080fd5b6122df826122a8565b9392505050565b600060208083528351808285015260005b81811015612313578581018301518582016040015282016122f7565b81811115612325576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561234e57600080fd5b612357836122a8565b946020939093013593505050565b60008060006060848603121561237a57600080fd5b612383846122a8565b95602085013595506040909401359392505050565b6000806000606084860312156123ad57600080fd5b6123b6846122a8565b92506123c4602085016122a8565b9150604084013590509250925092565b6000602082840312156123e657600080fd5b5035919050565b6000806040838503121561240057600080fd5b612409836122a8565b9150602083013560ff8116811461241f57600080fd5b809150509250929050565b6000806000806080858703121561244057600080fd5b612449856122a8565b966020860135965060408601359560600135945092505050565b6000806040838503121561247657600080fd5b61247f836122a8565b915061248d602084016122a8565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b600181811c9082168061250957607f821691505b60208210810361252957634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526022908201527f4c6f636b61626c653a2063616c6c6572206973206e6f7420746865206c6f636b60408201526132b960f11b606082015260800190565b6020808252602a908201527f537570657276697361626c653a2063616c6c6572206973206e6f74207468652060408201526939bab832b93b34b9b7b960b11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156125e4576125e46125bb565b500190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561261157600080fd5b815180151581146122df57600080fd5b600082821015612633576126336125bb565b500390565b6000816000190483118215151615612652576126526125bb565b500290565b60008261267457634e487b7160e01b600052601260045260246000fd5b500490565b60006001820161268b5761268b6125bb565b5060010190565b634e487b7160e01b600052603160045260246000fdfea26469706673582212209ea965a5167738a7741ab07362dc3cfe3b8894b24197c63af62c53221441ff2864736f6c634300080d0033
Deployed Bytecode Sourcemap
30841:5218:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34417:111;;;;;;:::i;:::-;;:::i;:::-;;8115:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10466:201;;;;;;:::i;:::-;;:::i;:::-;;;1409:14:1;;1402:22;1384:41;;1372:2;1357:18;10466:201:0;1244:187:1;35112:198:0;;;;;;:::i;:::-;;:::i;9235:108::-;9323:12;;9235:108;;;1909:25:1;;;1897:2;1882:18;9235:108:0;1763:177:1;29000:344:0;;;;;;:::i;:::-;-1:-1:-1;;;;;29212:22:0;29103:7;29212:22;;;:13;:22;;;;;:29;;29243:31;;;;29276:29;;;;29307:28;;;;;29212:29;;29243:31;;29276:29;29307:28;29000:344;;;;;2176:25:1;;;2232:2;2217:18;;2210:34;;;;2260:18;;;2253:34;2318:2;2303:18;;2296:34;2163:3;2148:19;29000:344:0;1945:391:1;11247:295:0;;;;;;:::i;:::-;;:::i;24494:105::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24574:17:0;24550:4;24574:17;;;:8;:17;;;;;;;;;24494:105;9077:93;;;9160:2;2816:36:1;;2804:2;2789:18;9077:93:0;2674:184:1;33293:257:0;;;;;;:::i;:::-;;:::i;11951:238::-;;;;;;:::i;:::-;;:::i;33753:76::-;;;:::i;34586:108::-;;;;;;:::i;:::-;;:::i;21705:105::-;;;;;;:::i;:::-;-1:-1:-1;;;;;21785:17:0;21761:4;21785:17;;;:8;:17;;;;;;;;;21705:105;34071:108;;;;;;:::i;:::-;;:::i;34759:105::-;;;;;;:::i;:::-;;:::i;26584:285::-;;;;;;:::i;:::-;;:::i;:::-;;;;3570:25:1;;;3626:2;3611:18;;3604:34;;;;3543:18;26584:285:0;3396:248:1;20460:97:0;20538:11;;-1:-1:-1;;;;;20538:11:0;20460:97;;;-1:-1:-1;;;;;3813:32:1;;;3795:51;;3783:2;3768:18;20460:97:0;3649:203:1;1690:86:0;1737:4;1761:7;;;1690:86;;35386:140;;;;;;:::i;:::-;;:::i;9406:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9507:18:0;9480:7;9507:18;;;:9;:18;;;;;;;9406:127;32510:109;;;:::i;23240:106::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23321:17:0;23297:4;23321:17;;;:8;:17;;;;;;;;;23240:106;33613:75;;;:::i;30625:163::-;;;;;;:::i;:::-;;:::i;31282:152::-;;;;;;:::i;:::-;;:::i;33896:99::-;;;;;;:::i;:::-;;:::i;18805:87::-;18851:7;18878:6;;;;-1:-1:-1;;;;;18878:6:0;18805:87;;8334:104;;;:::i;12692:436::-;;;;;;:::i;:::-;;:::i;9739:193::-;;;;;;:::i;:::-;;:::i;29648:812::-;;;;;;:::i;:::-;;:::i;32708:134::-;;;:::i;26263:126::-;;;;;;:::i;:::-;-1:-1:-1;;;;;26355:19:0;26328:7;26355:19;;;:10;:19;;;;;:26;;26263:126;27053:438;;;;;;:::i;:::-;;:::i;35598:253::-;;;;;;:::i;:::-;;:::i;34932:111::-;;;;;;:::i;:::-;;:::i;9995:151::-;;;;;;:::i;:::-;;:::i;32997:207::-;;;;;;:::i;:::-;;:::i;34244:105::-;;;;;;:::i;:::-;;:::i;35930:126::-;;;;;;:::i;:::-;;:::i;34417:111::-;18851:7;18878:6;-1:-1:-1;;;;;18878:6:0;;;;;682:10;19025:23;19017:68;;;;-1:-1:-1;;;19017:68:0;;;;;;;:::i;:::-;;;;;;;;;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;34498:22:::2;34512:7;34498:13;:22::i;:::-;34417:111:::0;:::o;8115:100::-;8169:13;8202:5;8195:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8115:100;:::o;10466:201::-;10549:4;682:10;10605:32;682:10;10621:7;10630:6;10605:8;:32::i;:::-;-1:-1:-1;10655:4:0;;10466:201;-1:-1:-1;;;10466:201:0:o;35112:198::-;682:10;24335:22;;;;:8;:22;;;;;;;;24327:69;;;;-1:-1:-1;;;24327:69:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;35262:40:::2;35275:7;35284:6;35292:9;35262:12;:40::i;:::-;35112:198:::0;;;:::o;11247:295::-;11378:4;682:10;11436:38;11452:4;682:10;11467:6;11436:15;:38::i;:::-;11485:27;11495:4;11501:2;11505:6;11485:9;:27::i;:::-;-1:-1:-1;11530:4:0;;11247:295;-1:-1:-1;;;;11247:295:0:o;33293:257::-;20538:11;;-1:-1:-1;;;;;20538:11:0;682:10;20700:28;20692:83;;;;-1:-1:-1;;;20692:83:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33408:27:0;::::2;33400:88;;;::::0;-1:-1:-1;;;33400:88:0;;6625:2:1;33400:88:0::2;::::0;::::2;6607:21:1::0;6664:2;6644:18;;;6637:30;6703:34;6683:18;;;6676:62;-1:-1:-1;;;6754:18:1;;;6747:46;6810:19;;33400:88:0::2;6423:412:1::0;33400:88:0::2;33499:43;33528:13;33499:28;:43::i;11951:238::-:0;12039:4;682:10;12095:64;682:10;12111:7;12148:10;12120:25;682:10;12111:7;12120:9;:25::i;:::-;:38;;;;:::i;:::-;12095:8;:64::i;33753:76::-;18851:7;18878:6;-1:-1:-1;;;;;18878:6:0;;;;;682:10;19025:23;19017:68;;;;-1:-1:-1;;;19017:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2285:41:::1;;;::::0;-1:-1:-1;;;2285:41:0;;7307:2:1;2285:41:0::1;::::0;::::1;7289:21:1::0;7346:2;7326:18;;;7319:30;-1:-1:-1;;;7365:18:1;;;7358:50;7425:18;;2285:41:0::1;7105:344:1::0;2285:41:0::1;33811:10:::2;:8;:10::i;:::-;33753:76::o:0;34586:108::-;682:10;21945:22;;;;:8;:22;;;;;;;;21937:69;;;;-1:-1:-1;;;21937:69:0;;7656:2:1;21937:69:0;;;7638:21:1;7695:2;7675:18;;;7668:30;7734:34;7714:18;;;7707:62;-1:-1:-1;;;7785:18:1;;;7778:32;7827:19;;21937:69:0;7454:398:1;21937:69:0;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;34659:27:::2;682:10:::0;34679:6:::2;34659:5;:27::i;34071:108::-:0;20538:11;;-1:-1:-1;;;;;20538:11:0;682:10;20700:28;20692:83;;;;-1:-1:-1;;;20692:83:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;34153:18:::2;34163:7;34153:9;:18::i;34759:105::-:0;18851:7;18878:6;-1:-1:-1;;;;;18878:6:0;;;;;682:10;19025:23;19017:68;;;;-1:-1:-1;;;19017:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;34837:19:::2;34848:7;34837:10;:19::i;26584:285::-:0;-1:-1:-1;;;;;26693:19:0;;26656:7;26693:19;;;:10;:19;;;;;:26;26656:7;;26693:34;;;-1:-1:-1;26693:48:0;;;;-1:-1:-1;26731:10:0;26693:48;26685:85;;;;-1:-1:-1;;;26685:85:0;;8059:2:1;26685:85:0;;;8041:21:1;8098:2;8078:18;;;8071:30;-1:-1:-1;;;8117:18:1;;;8110:54;8181:18;;26685:85:0;7857:348:1;26685:85:0;-1:-1:-1;;;;;26789:19:0;;;;;;:10;:19;;;;;:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:33;-1:-1:-1;;;;;26824:19:0;;;;:10;:19;;;;;;;:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:36;;;26781:80;;;;26584:285;;;;;:::o;35386:140::-;20538:11;;-1:-1:-1;;;;;20538:11:0;682:10;20700:28;20692:83;;;;-1:-1:-1;;;20692:83:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;35487:31:::2;35503:7;35512:5;35487:15;:31::i;:::-;35386:140:::0;;:::o;32510:109::-;18851:7;18878:6;-1:-1:-1;;;;;18878:6:0;;;;;682:10;19025:23;19017:68;;;;-1:-1:-1;;;19017:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;32581:30:::2;32608:1;32581:18;:30::i;33613:75::-:0;18851:7;18878:6;-1:-1:-1;;;;;18878:6:0;;;;;682:10;19025:23;19017:68;;;;-1:-1:-1;;;19017:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;33672:8:::2;:6;:8::i;30625:163::-:0;30691:7;30749:31;30772:7;30749:22;:31::i;:::-;30718:28;30738:7;30718:19;:28::i;:::-;:62;;;;:::i;:::-;30711:69;30625:163;-1:-1:-1;;30625:163:0:o;31282:152::-;18851:7;18878:6;-1:-1:-1;;;;;18878:6:0;;;;;682:10;19025:23;19017:68;;;;-1:-1:-1;;;19017:68:0;;;;;;;:::i;:::-;31382:12:::1;-1:-1:-1::0;;;;;31375:29:0::1;;31405:7;18851::::0;18878:6;-1:-1:-1;;;;;18878:6:0;;;;;;18805:87;31405:7:::1;31375:51;::::0;-1:-1:-1;;;;;;31375:51:0::1;::::0;;;;;;-1:-1:-1;;;;;8534:32:1;;;31375:51:0::1;::::0;::::1;8516::1::0;8583:18;;;8576:34;;;8489:18;;31375:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33896:99::-:0;18851:7;18878:6;-1:-1:-1;;;;;18878:6:0;;;;;682:10;19025:23;19017:68;;;;-1:-1:-1;;;19017:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;33971:16:::2;33979:7;33971;:16::i;8334:104::-:0;8390:13;8423:7;8416:14;;;;;:::i;12692:436::-;12785:4;682:10;12785:4;12868:25;682:10;12885:7;12868:9;:25::i;:::-;12841:52;;12932:15;12912:16;:35;;12904:85;;;;-1:-1:-1;;;12904:85:0;;9105:2:1;12904:85:0;;;9087:21:1;9144:2;9124:18;;;9117:30;9183:34;9163:18;;;9156:62;-1:-1:-1;;;9234:18:1;;;9227:35;9279:19;;12904:85:0;8903:401:1;12904:85:0;13025:60;13034:5;13041:7;13069:15;13050:16;:34;13025:8;:60::i;9739:193::-;9818:4;682:10;9874:28;682:10;9891:2;9895:6;9874:9;:28::i;29648:812::-;-1:-1:-1;;;;;29797:22:0;;29718:7;29797:22;;;:13;:22;;;;;:29;29718:7;;29841:10;;29837:579;;-1:-1:-1;;;;;29887:22:0;;29868:16;29887:22;;;:13;:22;;;;;:31;;;;;29950:29;;;;30010:28;;;;;29887:31;;30010:28;;30094:9;;30010:28;30094:9;:::i;:::-;30084:20;;:6;:20;:::i;:::-;30073:31;;:8;:31;:::i;:::-;30053:51;-1:-1:-1;30139:15:0;30173:20;;;30169:236;;;30236:6;30214:28;;30169:236;;;30280:9;30268;:21;30264:141;;;30384:5;30369:6;30344:21;30356:9;30344;:21;:::i;:::-;30343:32;;;;:::i;:::-;:36;;30378:1;30343:36;:::i;:::-;30333:47;;:6;:47;:::i;:::-;30332:57;;;;:::i;:::-;30310:79;;30264:141;29853:563;;;;;29837:579;-1:-1:-1;30433:19:0;29648:812;-1:-1:-1;;29648:812:0:o;32708:134::-;20538:11;;-1:-1:-1;;;;;20538:11:0;682:10;20700:28;20692:83;;;;-1:-1:-1;;;20692:83:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;32794:40:::2;32831:1;32794:28;:40::i;27053:438::-:0;-1:-1:-1;;;;;27195:19:0;;27120:7;27195:19;;;:10;:19;;;;;:26;27120:7;;;27232:218;27256:3;27252:1;:7;27232:218;;;-1:-1:-1;;;;;27303:19:0;;;;;;:10;:19;;;;;:22;;27323:1;;27303:22;;;;;;:::i;:::-;;;;;;;;;;;:32;;;27285:15;:50;27281:158;;;-1:-1:-1;;;;;27394:19:0;;;;;;:10;:19;;;;;:22;;27414:1;;27394:22;;;;;;:::i;:::-;;;;;;;;;;;:29;;;27375:16;:48;;;;:::i;:::-;27356:67;;27281:158;27261:3;;;;:::i;:::-;;;;27232:218;;;-1:-1:-1;27467:16:0;;27053:438;-1:-1:-1;;;27053:438:0:o;35598:253::-;682:10;24335:22;;;;:8;:22;;;;;;;;24327:69;;;;-1:-1:-1;;;24327:69:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;35774:69:::2;35790:7;35799:18;35809:7;-1:-1:-1::0;;;;;9507:18:0;9480:7;9507:18;;;:9;:18;;;;;;;9406:127;35799:18:::2;35819:8;35829:6;35837:5;35774:15;:69::i;:::-;35598:253:::0;;;;:::o;34932:111::-;18851:7;18878:6;-1:-1:-1;;;;;18878:6:0;;;;;682:10;19025:23;19017:68;;;;-1:-1:-1;;;19017:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;35013:22:::2;35027:7;35013:13;:22::i;9995:151::-:0;-1:-1:-1;;;;;10111:18:0;;;10084:7;10111:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9995:151::o;32997:207::-;18851:7;18878:6;-1:-1:-1;;;;;18878:6:0;;;;;682:10;19025:23;19017:68;;;;-1:-1:-1;;;19017:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33092:22:0;::::2;33084:73;;;::::0;-1:-1:-1;;;33084:73:0;;10176:2:1;33084:73:0::2;::::0;::::2;10158:21:1::0;10215:2;10195:18;;;10188:30;10254:34;10234:18;;;10227:62;-1:-1:-1;;;10305:18:1;;;10298:36;10351:19;;33084:73:0::2;9974:402:1::0;33084:73:0::2;33168:28;33187:8;33168:18;:28::i;34244:105::-:0;18851:7;18878:6;-1:-1:-1;;;;;18878:6:0;;;;;682:10;19025:23;19017:68;;;;-1:-1:-1;;;19017:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;34322:19:::2;34333:7;34322:10;:19::i;35930:126::-:0;20538:11;;-1:-1:-1;;;;;20538:11:0;682:10;20700:28;20692:83;;;;-1:-1:-1;;;20692:83:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;36021:27:::2;36040:7;36021:18;:27::i;22316:131::-:0;-1:-1:-1;;;;;22376:17:0;;22396:5;22376:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;22376:25:0;;;22417:22;;;22396:5;22417:22;22316:131;:::o;16030:380::-;-1:-1:-1;;;;;16166:19:0;;16158:68;;;;-1:-1:-1;;;16158:68:0;;10583:2:1;16158:68:0;;;10565:21:1;10622:2;10602:18;;;10595:30;10661:34;10641:18;;;10634:62;-1:-1:-1;;;10712:18:1;;;10705:34;10756:19;;16158:68:0;10381:400:1;16158:68:0;-1:-1:-1;;;;;16245:21:0;;16237:68;;;;-1:-1:-1;;;16237:68:0;;10988:2:1;16237:68:0;;;10970:21:1;11027:2;11007:18;;;11000:30;11066:34;11046:18;;;11039:62;-1:-1:-1;;;11117:18:1;;;11110:32;11159:19;;16237:68:0;10786:398:1;16237:68:0;-1:-1:-1;;;;;16318:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;16370:32;;1909:25:1;;;16370:32:0;;1882:18:1;16370:32:0;;;;;;;;16030:380;;;:::o;25089:366::-;25234:1;25225:6;:10;25217:50;;;;-1:-1:-1;;;25217:50:0;;11391:2:1;25217:50:0;;;11373:21:1;11430:2;11410:18;;;11403:30;11469:29;11449:18;;;11442:57;11516:18;;25217:50:0;11189:351:1;25217:50:0;25298:15;25286:9;:27;25278:70;;;;-1:-1:-1;;;25278:70:0;;11747:2:1;25278:70:0;;;11729:21:1;11786:2;11766:18;;;11759:30;11825:32;11805:18;;;11798:60;11875:18;;25278:70:0;11545:354:1;25278:70:0;-1:-1:-1;;;;;25359:19:0;;;;;;:10;:19;;;;;;;;25384:27;;;;;;;;;;;;;;;;25359:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25428:19;;;25359;25428;25089:366;;;:::o;16701:453::-;16836:24;16863:25;16873:5;16880:7;16863:9;:25::i;:::-;16836:52;;-1:-1:-1;;16903:16:0;:37;16899:248;;16985:6;16965:16;:26;;16957:68;;;;-1:-1:-1;;;16957:68:0;;12106:2:1;16957:68:0;;;12088:21:1;12145:2;12125:18;;;12118:30;12184:31;12164:18;;;12157:59;12233:18;;16957:68:0;11904:353:1;16957:68:0;17069:51;17078:5;17085:7;17113:6;17094:16;:25;17069:8;:51::i;13607:621::-;-1:-1:-1;;;;;13738:18:0;;13730:68;;;;-1:-1:-1;;;13730:68:0;;12464:2:1;13730:68:0;;;12446:21:1;12503:2;12483:18;;;12476:30;12542:34;12522:18;;;12515:62;-1:-1:-1;;;12593:18:1;;;12586:35;12638:19;;13730:68:0;12262:401:1;13730:68:0;-1:-1:-1;;;;;13817:16:0;;13809:64;;;;-1:-1:-1;;;13809:64:0;;12870:2:1;13809:64:0;;;12852:21:1;12909:2;12889:18;;;12882:30;12948:34;12928:18;;;12921:62;-1:-1:-1;;;12999:18:1;;;12992:33;13042:19;;13809:64:0;12668:399:1;13809:64:0;13886:38;13907:4;13913:2;13917:6;13886:20;:38::i;:::-;-1:-1:-1;;;;;13959:15:0;;13937:19;13959:15;;;:9;:15;;;;;;13993:21;;;;13985:72;;;;-1:-1:-1;;;13985:72:0;;13274:2:1;13985:72:0;;;13256:21:1;13313:2;13293:18;;;13286:30;13352:34;13332:18;;;13325:62;-1:-1:-1;;;13403:18:1;;;13396:36;13449:19;;13985:72:0;13072:402:1;13985:72:0;-1:-1:-1;;;;;14093:15:0;;;;;;;:9;:15;;;;;;14111:20;;;14093:38;;14153:13;;;;;;;;:23;;14125:6;;14093:15;14153:23;;14125:6;;14153:23;:::i;:::-;;;;;;;;14209:2;-1:-1:-1;;;;;14194:26:0;14203:4;-1:-1:-1;;;;;14194:26:0;;14213:6;14194:26;;;;1909:25:1;;1897:2;1882:18;;1763:177;14194:26:0;;;;;;;;13719:509;13607:621;;;:::o;20971:246::-;21084:11;;;-1:-1:-1;;;;;21106:27:0;;;-1:-1:-1;;;;;;21106:27:0;;;;;;;21149:60;;21084:11;;;21106:27;21084:11;;21149:60;;21060:21;;21149:60;21049:168;20971:246;:::o;2749:120::-;1737:4;1761:7;;;2285:41;;;;-1:-1:-1;;;2285:41:0;;7307:2:1;2285:41:0;;;7289:21:1;7346:2;7326:18;;;7319:30;-1:-1:-1;;;7365:18:1;;;7358:50;7425:18;;2285:41:0;7105:344:1;2285:41:0;2818:5:::1;2808:15:::0;;-1:-1:-1;;2808:15:0::1;::::0;;2839:22:::1;682:10:::0;2848:12:::1;2839:22;::::0;-1:-1:-1;;;;;3813:32:1;;;3795:51;;3783:2;3768:18;2839:22:0::1;;;;;;;2749:120::o:0;15124:468::-;-1:-1:-1;;;;;15208:21:0;;15200:67;;;;-1:-1:-1;;;15200:67:0;;13681:2:1;15200:67:0;;;13663:21:1;13720:2;13700:18;;;13693:30;13759:34;13739:18;;;13732:62;-1:-1:-1;;;13810:18:1;;;13803:31;13851:19;;15200:67:0;13479:397:1;15200:67:0;-1:-1:-1;;;;;15305:18:0;;15280:22;15305:18;;;:9;:18;;;;;;15342:24;;;;15334:71;;;;-1:-1:-1;;;15334:71:0;;14083:2:1;15334:71:0;;;14065:21:1;14122:2;14102:18;;;14095:30;14161:34;14141:18;;;14134:62;-1:-1:-1;;;14212:18:1;;;14205:32;14254:19;;15334:71:0;13881:398:1;15334:71:0;-1:-1:-1;;;;;15441:18:0;;;;;;:9;:18;;;;;15462:23;;;15441:44;;15507:12;:22;;15479:6;;15441:18;15507:22;;15479:6;;15507:22;:::i;:::-;;;;-1:-1:-1;;15547:37:0;;1909:25:1;;;15573:1:0;;-1:-1:-1;;;;;15547:37:0;;;;;1897:2:1;1882:18;15547:37:0;1763:177:1;23038:123:0;-1:-1:-1;;;;;23094:17:0;;23114:5;23094:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;23094:25:0;;;23135:18;;;23114:5;23135:18;23038:123;:::o;24676:125::-;-1:-1:-1;;;;;24733:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;24733:24:0;24753:4;24733:24;;;24773:20;;;24733:17;24773:20;24676:125;:::o;25636:458::-;-1:-1:-1;;;;;25719:19:0;;;;;;:10;:19;;;;;:26;:34;;;-1:-1:-1;25719:48:0;;;;-1:-1:-1;25757:10:0;25719:48;25711:85;;;;-1:-1:-1;;;25711:85:0;;8059:2:1;25711:85:0;;;8041:21:1;8098:2;8078:18;;;8071:30;-1:-1:-1;;;8117:18:1;;;8110:54;8181:18;;25711:85:0;7857:348:1;25711:85:0;-1:-1:-1;;;;;25823:19:0;;25809:11;25823:19;;;:10;:19;;;;;:26;25864:16;;;:7;25870:1;25823:26;25864:7;:::i;:::-;:16;25860:154;;-1:-1:-1;;;;;25974:19:0;;;;;;:10;:19;;;;;25994:7;26000:1;25994:3;:7;:::i;:::-;25974:28;;;;;;;;:::i;:::-;;;;;;;;;;;25945:10;:19;25956:7;-1:-1:-1;;;;;25945:19:0;-1:-1:-1;;;;;25945:19:0;;;;;;;;;;;;25965:5;25945:26;;;;;;;;;;:::i;:::-;;;;;;;;;:57;;:26;;;;;:57;;;;;;;;;;;25860:154;-1:-1:-1;;;;;26024:19:0;;;;;;:10;:19;;;;;:25;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;26024:25:0;;;;;;;;;;;;;;;;;26065:21;;-1:-1:-1;;;;;26065:21:0;;;;;;25700:394;25636:458;;:::o;19265:191::-;19339:16;19358:6;;-1:-1:-1;;;;;19375:17:0;;;19358:6;19375:17;;;-1:-1:-1;;;;;;19375:17:0;;;;;19408:40;;19358:6;;;;;;;19375:17;;19358:6;;19408:40;;;19328:128;19265:191;:::o;2490:118::-;1737:4;1761:7;;;2015:9;2007:38;;;;-1:-1:-1;;;2007:38:0;;;;;;;:::i;:::-;2550:7:::1;:14:::0;;-1:-1:-1;;2550:14:0::1;2560:4;2550:14;::::0;;2580:20:::1;2587:12;682:10:::0;;602:98;22834:118;-1:-1:-1;;;;;22888:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;22888:24:0;22908:4;22888:24;;;22928:16;;;22888:17;22928:16;22834:118;:::o;27882:636::-;-1:-1:-1;;;;;28069:21:0;;28061:74;;;;-1:-1:-1;;;28061:74:0;;14618:2:1;28061:74:0;;;14600:21:1;14657:2;14637:18;;;14630:30;14696:34;14676:18;;;14669:62;-1:-1:-1;;;14747:18:1;;;14740:38;14795:19;;28061:74:0;14416:404:1;28061:74:0;28165:15;28154:8;:26;28146:71;;;;-1:-1:-1;;;28146:71:0;;15027:2:1;28146:71:0;;;15009:21:1;;;15046:18;;;15039:30;15105:34;15085:18;;;15078:62;15157:18;;28146:71:0;14825:356:1;28146:71:0;28245:1;28236:6;:10;28228:48;;;;-1:-1:-1;;;28228:48:0;;15388:2:1;28228:48:0;;;15370:21:1;15427:2;15407:18;;;15400:30;15466:27;15446:18;;;15439:55;15511:18;;28228:48:0;15186:349:1;28228:48:0;28304:1;28295:6;:10;28287:48;;;;-1:-1:-1;;;28287:48:0;;15742:2:1;28287:48:0;;;15724:21:1;15781:2;15761:18;;;15754:30;15820:27;15800:18;;;15793:55;15865:18;;28287:48:0;15540:349:1;28287:48:0;28362:1;28354:5;:9;28346:46;;;;-1:-1:-1;;;28346:46:0;;16096:2:1;28346:46:0;;;16078:21:1;16135:2;16115:18;;;16108:30;16174:26;16154:18;;;16147:54;16218:18;;28346:46:0;15894:348:1;28346:46:0;28428:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28403:22:0;;-1:-1:-1;28403:22:0;;;:13;:22;;;;;;:69;;;;;;;;;;;;;;;;;;;;;;;;;28488:22;;28403;;28488;;;27882:636;;;;;:::o;24884:131::-;-1:-1:-1;;;;;24944:17:0;;24964:5;24944:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;24944:25:0;;;24985:22;;;24964:5;24985:22;24884:131;:::o;22104:125::-;-1:-1:-1;;;;;22161:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;22161:24:0;22181:4;22161:24;;;22201:20;;;22161:17;22201:20;22104:125;:::o;28672:161::-;28762:23;;;;;;;;-1:-1:-1;28762:23:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28737:22:0;;;;;:13;:22;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;28801:24;;28737:22;;28801:24;;;28672:161;:::o;31510:649::-;-1:-1:-1;;;;;23321:17:0;;23297:4;23321:17;;;:8;:17;;;;;;;;31717:16;31709:75;;;;-1:-1:-1;;;31709:75:0;;16449:2:1;31709:75:0;;;16431:21:1;16488:2;16468:18;;;16461:30;16527:34;16507:18;;;16500:62;-1:-1:-1;;;16578:18:1;;;16571:44;16632:19;;31709:75:0;16247:410:1;31709:75:0;-1:-1:-1;;;;;23321:17:0;;23297:4;23321:17;;;:8;:17;;;;;;;;31803:14;31795:71;;;;-1:-1:-1;;;31795:71:0;;16864:2:1;31795:71:0;;;16846:21:1;16903:2;16883:18;;;16876:30;16942:34;16922:18;;;16915:62;-1:-1:-1;;;16993:18:1;;;16986:42;17045:19;;31795:71:0;16662:408:1;31795:71:0;31886:23;682:10;31896:12;602:98;31886:23;31885:24;31877:90;;;;-1:-1:-1;;;31877:90:0;;17277:2:1;31877:90:0;;;17259:21:1;17316:2;17296:18;;;17289:30;17355:34;17335:18;;;17328:62;-1:-1:-1;;;17406:18:1;;;17399:51;17467:19;;31877:90:0;17075:417:1;31877:90:0;1737:4;1761:7;;;31986:9;31978:59;;;;-1:-1:-1;;;31978:59:0;;17699:2:1;31978:59:0;;;17681:21:1;17738:2;17718:18;;;17711:30;17777:34;17757:18;;;17750:62;-1:-1:-1;;;17828:18:1;;;17821:35;17873:19;;31978:59:0;17497:401:1;31978:59:0;32102:6;32074:24;32093:4;32074:18;:24::i;:::-;-1:-1:-1;;;;;9507:18:0;;9480:7;9507:18;;;:9;:18;;;;;;32056:42;;;;:::i;:::-;:52;;32048:103;;;;-1:-1:-1;;;32048:103:0;;18105:2:1;32048:103:0;;;18087:21:1;18144:2;18124:18;;;18117:30;18183:34;18163:18;;;18156:62;-1:-1:-1;;;18234:18:1;;;18227:36;18280:19;;32048:103:0;17903:402:1;14:173;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:597::-;495:4;524:2;553;542:9;535:21;585:6;579:13;628:6;623:2;612:9;608:18;601:34;653:1;663:140;677:6;674:1;671:13;663:140;;;772:14;;;768:23;;762:30;738:17;;;757:2;734:26;727:66;692:10;;663:140;;;821:6;818:1;815:13;812:91;;;891:1;886:2;877:6;866:9;862:22;858:31;851:42;812:91;-1:-1:-1;964:2:1;943:15;-1:-1:-1;;939:29:1;924:45;;;;971:2;920:54;;383:597;-1:-1:-1;;;383:597:1:o;985:254::-;1053:6;1061;1114:2;1102:9;1093:7;1089:23;1085:32;1082:52;;;1130:1;1127;1120:12;1082:52;1153:29;1172:9;1153:29;:::i;:::-;1143:39;1229:2;1214:18;;;;1201:32;;-1:-1:-1;;;985:254:1:o;1436:322::-;1513:6;1521;1529;1582:2;1570:9;1561:7;1557:23;1553:32;1550:52;;;1598:1;1595;1588:12;1550:52;1621:29;1640:9;1621:29;:::i;:::-;1611:39;1697:2;1682:18;;1669:32;;-1:-1:-1;1748:2:1;1733:18;;;1720:32;;1436:322;-1:-1:-1;;;1436:322:1:o;2341:328::-;2418:6;2426;2434;2487:2;2475:9;2466:7;2462:23;2458:32;2455:52;;;2503:1;2500;2493:12;2455:52;2526:29;2545:9;2526:29;:::i;:::-;2516:39;;2574:38;2608:2;2597:9;2593:18;2574:38;:::i;:::-;2564:48;;2659:2;2648:9;2644:18;2631:32;2621:42;;2341:328;;;;;:::o;2863:180::-;2922:6;2975:2;2963:9;2954:7;2950:23;2946:32;2943:52;;;2991:1;2988;2981:12;2943:52;-1:-1:-1;3014:23:1;;2863:180;-1:-1:-1;2863:180:1:o;3048:343::-;3114:6;3122;3175:2;3163:9;3154:7;3150:23;3146:32;3143:52;;;3191:1;3188;3181:12;3143:52;3214:29;3233:9;3214:29;:::i;:::-;3204:39;;3293:2;3282:9;3278:18;3265:32;3337:4;3330:5;3326:16;3319:5;3316:27;3306:55;;3357:1;3354;3347:12;3306:55;3380:5;3370:15;;;3048:343;;;;;:::o;3857:391::-;3943:6;3951;3959;3967;4020:3;4008:9;3999:7;3995:23;3991:33;3988:53;;;4037:1;4034;4027:12;3988:53;4060:29;4079:9;4060:29;:::i;:::-;4050:39;4136:2;4121:18;;4108:32;;-1:-1:-1;4187:2:1;4172:18;;4159:32;;4238:2;4223:18;4210:32;;-1:-1:-1;3857:391:1;-1:-1:-1;;;3857:391:1:o;4253:260::-;4321:6;4329;4382:2;4370:9;4361:7;4357:23;4353:32;4350:52;;;4398:1;4395;4388:12;4350:52;4421:29;4440:9;4421:29;:::i;:::-;4411:39;;4469:38;4503:2;4492:9;4488:18;4469:38;:::i;:::-;4459:48;;4253:260;;;;;:::o;4518:356::-;4720:2;4702:21;;;4739:18;;;4732:30;4798:34;4793:2;4778:18;;4771:62;4865:2;4850:18;;4518:356::o;4879:340::-;5081:2;5063:21;;;5120:2;5100:18;;;5093:30;-1:-1:-1;;;5154:2:1;5139:18;;5132:46;5210:2;5195:18;;4879:340::o;5224:380::-;5303:1;5299:12;;;;5346;;;5367:61;;5421:4;5413:6;5409:17;5399:27;;5367:61;5474:2;5466:6;5463:14;5443:18;5440:38;5437:161;;5520:10;5515:3;5511:20;5508:1;5501:31;5555:4;5552:1;5545:15;5583:4;5580:1;5573:15;5437:161;;5224:380;;;:::o;5609:398::-;5811:2;5793:21;;;5850:2;5830:18;;;5823:30;5889:34;5884:2;5869:18;;5862:62;-1:-1:-1;;;5955:2:1;5940:18;;5933:32;5997:3;5982:19;;5609:398::o;6012:406::-;6214:2;6196:21;;;6253:2;6233:18;;;6226:30;6292:34;6287:2;6272:18;;6265:62;-1:-1:-1;;;6358:2:1;6343:18;;6336:40;6408:3;6393:19;;6012:406::o;6840:127::-;6901:10;6896:3;6892:20;6889:1;6882:31;6932:4;6929:1;6922:15;6956:4;6953:1;6946:15;6972:128;7012:3;7043:1;7039:6;7036:1;7033:13;7030:39;;;7049:18;;:::i;:::-;-1:-1:-1;7085:9:1;;6972:128::o;8210:127::-;8271:10;8266:3;8262:20;8259:1;8252:31;8302:4;8299:1;8292:15;8326:4;8323:1;8316:15;8621:277;8688:6;8741:2;8729:9;8720:7;8716:23;8712:32;8709:52;;;8757:1;8754;8747:12;8709:52;8789:9;8783:16;8842:5;8835:13;8828:21;8821:5;8818:32;8808:60;;8864:1;8861;8854:12;9309:125;9349:4;9377:1;9374;9371:8;9368:34;;;9382:18;;:::i;:::-;-1:-1:-1;9419:9:1;;9309:125::o;9439:168::-;9479:7;9545:1;9541;9537:6;9533:14;9530:1;9527:21;9522:1;9515:9;9508:17;9504:45;9501:71;;;9552:18;;:::i;:::-;-1:-1:-1;9592:9:1;;9439:168::o;9612:217::-;9652:1;9678;9668:132;;9722:10;9717:3;9713:20;9710:1;9703:31;9757:4;9754:1;9747:15;9785:4;9782:1;9775:15;9668:132;-1:-1:-1;9814:9:1;;9612:217::o;9834:135::-;9873:3;9894:17;;;9891:43;;9914:18;;:::i;:::-;-1:-1:-1;9961:1:1;9950:13;;9834:135::o;14284:127::-;14345:10;14340:3;14336:20;14333:1;14326:31;14376:4;14373:1;14366:15;14400:4;14397:1;14390:15
Swarm Source
ipfs://9ea965a5167738a7741ab07362dc3cfe3b8894b24197c63af62c53221441ff28
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.