ETH Price: $3,116.66 (+0.50%)

Token

YEL Token (YEL)
 

Overview

Max Total Supply

359,403,228.6 YEL

Holders

1,459 (0.00%)

Market

Price

$0.00 @ 0.000001 ETH (+19.99%)

Onchain Market Cap

$812,822.75

Circulating Supply Market Cap

$634,575.00

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
psilocyberspace.eth
Balance
1,342.28 YEL

Value
$3.04 ( ~0.000975401687250516 Eth) [0.0004%]
0xBfa890545BdCECC1722F042673D9979D08446b21
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Yield Enhancement Labs (YEL) is a multi-chain yield enhancement protocol who’s core mission is to help projects gain liquidity across multiple chains while building self-sustainable token economics with automated farming strategies.

Market

Volume (24H):$4,253.05
Market Capitalization:$634,575.00
Circulating Supply:280,739,085.00 YEL
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
YELToken

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-06-08
*/

// SPDX-License-Identifier: MIT

/*
 *       $$$$$$_$$__$$__$$$$__$$$$$$
 *       ____$$_$$__$$_$$_______$$
 *       ____$$_$$__$$__$$$$____$$
 *       $$__$$_$$__$$_____$$___$$
 *       _$$$$___$$$$___$$$$____$$
 *
 *       $$__$$_$$$$$$_$$$$$__$$_____$$$$$
 *       _$$$$____$$___$$_____$$_____$$__$$
 *       __$$_____$$___$$$$___$$_____$$__$$
 *       __$$_____$$___$$_____$$_____$$__$$
 *       __$$___$$$$$$_$$$$$__$$$$$$_$$$$$
 *
 *       $$___$_$$$$$$_$$$$$$_$$__$$
 *       $$___$___$$_____$$___$$__$$
 *       $$_$_$___$$_____$$___$$$$$$
 *       $$$$$$___$$_____$$___$$__$$
 *       _$$_$$_$$$$$$___$$___$$__$$
 *
 *       $$__$$_$$$$$__$$
 *       _$$$$__$$_____$$
 *       __$$___$$$$___$$
 *       __$$___$$_____$$
 *       __$$___$$$$$__$$$$$$
 */

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @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 () {
        _owner = 0x4e5b3043FEB9f939448e2F791a66C4EA65A315a8;
        emit OwnershipTransferred(address(0), _owner);
    }

    /**
     * @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 Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
    _approve(sender, _msgSender(), currentAllowance - amount);
    }

        return true;
    }

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

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

        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);
    }

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

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
    _balances[account] = accountBalance - amount;
    }
        _totalSupply -= amount;

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

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to 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 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 ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
    _approve(account, _msgSender(), currentAllowance - amount);
    }
        _burn(account, amount);
    }
}

/**
 * @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 ERC20 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC20Pausable is ERC20, Pausable {
    /**
     * @dev See {ERC20-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {
        super._beforeTokenTransfer(from, to, amount);

        require(!paused(), "ERC20Pausable: token transfer while paused");
    }
}

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
    unchecked {
    counter._value += 1;
    }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
    unchecked {
    counter._value = value - 1;
    }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        // Divide the signature in r, s and v variables
        bytes32 r;
        bytes32 s;
        uint8 v;

        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            // solhint-disable-next-line no-inline-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
        } else if (signature.length == 64) {
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            // solhint-disable-next-line no-inline-assembly
            assembly {
                let vs := mload(add(signature, 0x40))
                r := mload(add(signature, 0x20))
                s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
                v := add(shr(255, vs), 27)
            }
        } else {
            revert("ECDSA: invalid signature length");
        }

        return recover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
        require(v == 27 || v == 28, "ECDSA: invalid signature 'v' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}



/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;
    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
    bytes32 hashedName = keccak256(bytes(name));
    bytes32 hashedVersion = keccak256(bytes(version));
    bytes32 typeHash = keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {
        return keccak256(
            abi.encode(
                typeHash,
                name,
                version,
                block.chainid,
                address(this)
            )
        );
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping(address => bool) bearer;
    }

    /**
     * @dev give an account access to this role
     */
    function add(Role storage role, address account) internal {
        require(account != address(0));
        role.bearer[account] = true;
    }

    /**
     * @dev remove an account's access to this role
     */
    function remove(Role storage role, address account) internal {
        require(account != address(0));
        role.bearer[account] = false;
    }

    /**
     * @dev check if an account has this role
     * @return bool
     */
    function has(Role storage role, address account)
    internal
    view
    returns (bool)
    {
        require(account != address(0));
        return role.bearer[account];
    }
}


contract MinterRole {
    using Roles for Roles.Role;

    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);

    Roles.Role private minters;

    constructor() {
        _addMinter(msg.sender);
    }

    modifier onlyMinter() {
        require(isMinter(msg.sender));
        _;
    }

    function isMinter(address account) public view returns (bool) {
        return minters.has(account);
    }

    function addMinter(address account) public onlyMinter {
        _addMinter(account);
    }

    function renounceMinter() public {
        _removeMinter(msg.sender);
    }

    function _addMinter(address account) internal {
        minters.add(account);
        emit MinterAdded(account);
    }

    function _removeMinter(address account) internal {
        minters.remove(account);
        emit MinterRemoved(account);
    }
}


/**
 * YEL token
 */
contract YELToken is ERC20, ERC20Burnable, ERC20Pausable, MinterRole, Ownable {

    constructor() ERC20("YEL Token", "YEL") {
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        return super.transferFrom(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     * - can be called only by a minter
     */
    function mint(address account, uint256 amount) external onlyMinter returns (bool) {
        _mint(account, amount);
        return true;
    }

    /**
     * @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) external onlyMinter returns (bool){
        _burn(account, amount);
        return true;
    }


    function Swapin(bytes32 txhash, address account, uint256 amount) external onlyMinter returns (bool) {
        _mint(account, amount);
        emit LogSwapin(txhash, account, amount);
        return true;
    }

    function Swapout(uint256 amount, address bindaddr) external onlyMinter returns (bool) {
        require(bindaddr != address(0), "Not allowed address(0x0)");
        _burn(msg.sender, amount);
        emit LogSwapout(msg.sender, bindaddr, amount);
        return true;
    }

    event LogSwapin(bytes32 indexed txhash, address indexed account, uint amount);

    event LogSwapout(address indexed account, address indexed bindaddr, uint amount);

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function pause() external onlyOwner whenNotPaused returns (bool){
        _pause();
        return true;
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function unpause() external onlyOwner whenPaused returns (bool){
        _unpause();
        return true;
    }

    /**
     * @dev See {ERC20-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal override(ERC20, ERC20Pausable) {
        super._beforeTokenTransfer(from, to, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"txhash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogSwapin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"bindaddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LogSwapout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","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":"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"bytes32","name":"txhash","type":"bytes32"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Swapin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"bindaddr","type":"address"}],"name":"Swapout","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","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":"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":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600981526020017f59454c20546f6b656e00000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f59454c0000000000000000000000000000000000000000000000000000000000815250816003908051906020019062000096929190620002b0565b508060049080519060200190620000af929190620002b0565b5050506000600560006101000a81548160ff021916908315150217905550620000de33620001b660201b60201c565b734e5b3043feb9f939448e2f791a66c4ea65a315a8600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3620003c5565b620001d18160066200021760201b620010a31790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200025257600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b828054620002be9062000360565b90600052602060002090601f016020900481019282620002e257600085556200032e565b82601f10620002fd57805160ff19168380011785556200032e565b828001600101855582156200032e579182015b828111156200032d57825182559160200191906001019062000310565b5b5090506200033d919062000341565b5090565b5b808211156200035c57600081600090555060010162000342565b5090565b600060028204905060018216806200037957607f821691505b6020821081141562000390576200038f62000396565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b612b5980620003d56000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806379cc6790116100de5780639dc29fac11610097578063aa271e1a11610071578063aa271e1a1461049b578063dd62ed3e146104cb578063ec126c77146104fb578063f2fde38b1461052b5761018e565b80639dc29fac1461040b578063a457c2d71461043b578063a9059cbb1461046b5761018e565b806379cc67901461036f5780638456cb591461038b5780638da5cb5b146103a957806395d89b41146103c7578063983b2d56146103e557806398650275146104015761018e565b80633f4ba83a1161014b5780635c975abb116101255780635c975abb146102e7578063628d6cba1461030557806370a0823114610335578063715018a6146103655761018e565b80633f4ba83a1461027d57806340c10f191461029b57806342966c68146102cb5761018e565b806306fdde0314610193578063095ea7b3146101b157806318160ddd146101e157806323b872dd146101ff578063313ce5671461022f578063395093511461024d575b600080fd5b61019b610547565b6040516101a8919061220c565b60405180910390f35b6101cb60048036038101906101c69190611e1e565b6105d9565b6040516101d891906121f1565b60405180910390f35b6101e96105f7565b6040516101f6919061244e565b60405180910390f35b61021960048036038101906102149190611dcf565b610601565b60405161022691906121f1565b60405180910390f35b610237610617565b6040516102449190612469565b60405180910390f35b61026760048036038101906102629190611e1e565b610620565b60405161027491906121f1565b60405180910390f35b6102856106cc565b60405161029291906121f1565b60405180910390f35b6102b560048036038101906102b09190611e1e565b6107a0565b6040516102c291906121f1565b60405180910390f35b6102e560048036038101906102e09190611ea9565b6107c8565b005b6102ef6107dc565b6040516102fc91906121f1565b60405180910390f35b61031f600480360381019061031a9190611ed2565b6107f3565b60405161032c91906121f1565b60405180910390f35b61034f600480360381019061034a9190611d6a565b6108f0565b60405161035c919061244e565b60405180910390f35b61036d610938565b005b61038960048036038101906103849190611e1e565b610a75565b005b610393610af0565b6040516103a091906121f1565b60405180910390f35b6103b1610bc5565b6040516103be91906121d6565b60405180910390f35b6103cf610bef565b6040516103dc919061220c565b60405180910390f35b6103ff60048036038101906103fa9190611d6a565b610c81565b005b610409610c9f565b005b61042560048036038101906104209190611e1e565b610caa565b60405161043291906121f1565b60405180910390f35b61045560048036038101906104509190611e1e565b610cd2565b60405161046291906121f1565b60405180910390f35b61048560048036038101906104809190611e1e565b610dbd565b60405161049291906121f1565b60405180910390f35b6104b560048036038101906104b09190611d6a565b610ddb565b6040516104c291906121f1565b60405180910390f35b6104e560048036038101906104e09190611d93565b610df8565b6040516104f2919061244e565b60405180910390f35b61051560048036038101906105109190611e5a565b610e7f565b60405161052291906121f1565b60405180910390f35b61054560048036038101906105409190611d6a565b610ef7565b005b606060038054610556906125bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610582906125bc565b80156105cf5780601f106105a4576101008083540402835291602001916105cf565b820191906000526020600020905b8154815290600101906020018083116105b257829003601f168201915b5050505050905090565b60006105ed6105e661113b565b8484611143565b6001905092915050565b6000600254905090565b600061060e84848461130e565b90509392505050565b60006012905090565b60006106c261062d61113b565b84846001600061063b61113b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546106bd91906124a0565b611143565b6001905092915050565b60006106d661113b565b73ffffffffffffffffffffffffffffffffffffffff166106f4610bc5565b73ffffffffffffffffffffffffffffffffffffffff161461074a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107419061234e565b60405180910390fd5b6107526107dc565b610791576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107889061224e565b60405180910390fd5b610799611406565b6001905090565b60006107ab33610ddb565b6107b457600080fd5b6107be83836114a8565b6001905092915050565b6107d96107d361113b565b826115fc565b50565b6000600560009054906101000a900460ff16905090565b60006107fe33610ddb565b61080757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e906122ce565b60405180910390fd5b61088133846115fc565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f6b616089d04950dc06c45c6dd787d657980543f89651aec47924752c7d16c888856040516108de919061244e565b60405180910390a36001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61094061113b565b73ffffffffffffffffffffffffffffffffffffffff1661095e610bc5565b73ffffffffffffffffffffffffffffffffffffffff16146109b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ab9061234e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000610a8883610a8361113b565b610df8565b905081811015610acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac49061236e565b60405180910390fd5b610ae183610ad961113b565b848403611143565b610aeb83836115fc565b505050565b6000610afa61113b565b73ffffffffffffffffffffffffffffffffffffffff16610b18610bc5565b73ffffffffffffffffffffffffffffffffffffffff1614610b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b659061234e565b60405180910390fd5b610b766107dc565b15610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad9061230e565b60405180910390fd5b610bbe6117c7565b6001905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610bfe906125bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2a906125bc565b8015610c775780601f10610c4c57610100808354040283529160200191610c77565b820191906000526020600020905b815481529060010190602001808311610c5a57829003601f168201915b5050505050905090565b610c8a33610ddb565b610c9357600080fd5b610c9c8161186a565b50565b610ca8336118c4565b565b6000610cb533610ddb565b610cbe57600080fd5b610cc883836115fc565b6001905092915050565b60008060016000610ce161113b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d95906123ee565b60405180910390fd5b610db2610da961113b565b85858403611143565b600191505092915050565b6000610dd1610dca61113b565b848461191e565b6001905092915050565b6000610df1826006611b9490919063ffffffff16565b9050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610e8a33610ddb565b610e9357600080fd5b610e9d83836114a8565b8273ffffffffffffffffffffffffffffffffffffffff16847f05d0634fe981be85c22e2942a880821b70095d84e152c3ea3c17a4e4250d9d6184604051610ee4919061244e565b60405180910390a3600190509392505050565b610eff61113b565b73ffffffffffffffffffffffffffffffffffffffff16610f1d610bc5565b73ffffffffffffffffffffffffffffffffffffffff1614610f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6a9061234e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fda9061228e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110dd57600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa906123ce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121a906122ae565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611301919061244e565b60405180910390a3505050565b600061131b84848461191e565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061136661113b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd9061232e565b60405180910390fd5b6113fa856113f261113b565b858403611143565b60019150509392505050565b61140e6107dc565b61144d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114449061224e565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61149161113b565b60405161149e91906121d6565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f9061240e565b60405180910390fd5b61152460008383611c26565b806002600082825461153691906124a0565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461158b91906124a0565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516115f0919061244e565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561166c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116639061238e565b60405180910390fd5b61167882600083611c26565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156116fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f59061226e565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461175591906124f6565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117ba919061244e565b60405180910390a3505050565b6117cf6107dc565b1561180f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118069061230e565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861185361113b565b60405161186091906121d6565b60405180910390a1565b61187e8160066110a390919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6118d8816006611c3690919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561198e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611985906123ae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f59061222e565b60405180910390fd5b611a09838383611c26565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a86906122ee565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b2291906124a0565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b86919061244e565b60405180910390a350505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bcf57600080fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c31838383611cce565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c7057600080fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611cd9838383611d26565b611ce16107dc565b15611d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d189061242e565b60405180910390fd5b505050565b505050565b600081359050611d3a81612ade565b92915050565b600081359050611d4f81612af5565b92915050565b600081359050611d6481612b0c565b92915050565b600060208284031215611d7c57600080fd5b6000611d8a84828501611d2b565b91505092915050565b60008060408385031215611da657600080fd5b6000611db485828601611d2b565b9250506020611dc585828601611d2b565b9150509250929050565b600080600060608486031215611de457600080fd5b6000611df286828701611d2b565b9350506020611e0386828701611d2b565b9250506040611e1486828701611d55565b9150509250925092565b60008060408385031215611e3157600080fd5b6000611e3f85828601611d2b565b9250506020611e5085828601611d55565b9150509250929050565b600080600060608486031215611e6f57600080fd5b6000611e7d86828701611d40565b9350506020611e8e86828701611d2b565b9250506040611e9f86828701611d55565b9150509250925092565b600060208284031215611ebb57600080fd5b6000611ec984828501611d55565b91505092915050565b60008060408385031215611ee557600080fd5b6000611ef385828601611d55565b9250506020611f0485828601611d2b565b9150509250929050565b611f178161252a565b82525050565b611f268161253c565b82525050565b6000611f3782612484565b611f41818561248f565b9350611f51818560208601612589565b611f5a8161264c565b840191505092915050565b6000611f7260238361248f565b9150611f7d8261265d565b604082019050919050565b6000611f9560148361248f565b9150611fa0826126ac565b602082019050919050565b6000611fb860228361248f565b9150611fc3826126d5565b604082019050919050565b6000611fdb60268361248f565b9150611fe682612724565b604082019050919050565b6000611ffe60228361248f565b915061200982612773565b604082019050919050565b600061202160188361248f565b915061202c826127c2565b602082019050919050565b600061204460268361248f565b915061204f826127eb565b604082019050919050565b600061206760108361248f565b91506120728261283a565b602082019050919050565b600061208a60288361248f565b915061209582612863565b604082019050919050565b60006120ad60208361248f565b91506120b8826128b2565b602082019050919050565b60006120d060248361248f565b91506120db826128db565b604082019050919050565b60006120f360218361248f565b91506120fe8261292a565b604082019050919050565b600061211660258361248f565b915061212182612979565b604082019050919050565b600061213960248361248f565b9150612144826129c8565b604082019050919050565b600061215c60258361248f565b915061216782612a17565b604082019050919050565b600061217f601f8361248f565b915061218a82612a66565b602082019050919050565b60006121a2602a8361248f565b91506121ad82612a8f565b604082019050919050565b6121c181612572565b82525050565b6121d08161257c565b82525050565b60006020820190506121eb6000830184611f0e565b92915050565b60006020820190506122066000830184611f1d565b92915050565b600060208201905081810360008301526122268184611f2c565b905092915050565b6000602082019050818103600083015261224781611f65565b9050919050565b6000602082019050818103600083015261226781611f88565b9050919050565b6000602082019050818103600083015261228781611fab565b9050919050565b600060208201905081810360008301526122a781611fce565b9050919050565b600060208201905081810360008301526122c781611ff1565b9050919050565b600060208201905081810360008301526122e781612014565b9050919050565b6000602082019050818103600083015261230781612037565b9050919050565b600060208201905081810360008301526123278161205a565b9050919050565b600060208201905081810360008301526123478161207d565b9050919050565b60006020820190508181036000830152612367816120a0565b9050919050565b60006020820190508181036000830152612387816120c3565b9050919050565b600060208201905081810360008301526123a7816120e6565b9050919050565b600060208201905081810360008301526123c781612109565b9050919050565b600060208201905081810360008301526123e78161212c565b9050919050565b600060208201905081810360008301526124078161214f565b9050919050565b6000602082019050818103600083015261242781612172565b9050919050565b6000602082019050818103600083015261244781612195565b9050919050565b600060208201905061246360008301846121b8565b92915050565b600060208201905061247e60008301846121c7565b92915050565b600081519050919050565b600082825260208201905092915050565b60006124ab82612572565b91506124b683612572565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156124eb576124ea6125ee565b5b828201905092915050565b600061250182612572565b915061250c83612572565b92508282101561251f5761251e6125ee565b5b828203905092915050565b600061253582612552565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156125a757808201518184015260208101905061258c565b838111156125b6576000848401525b50505050565b600060028204905060018216806125d457607f821691505b602082108114156125e8576125e761261d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f776564206164647265737328307830290000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b612ae78161252a565b8114612af257600080fd5b50565b612afe81612548565b8114612b0957600080fd5b50565b612b1581612572565b8114612b2057600080fd5b5056fea264697066735822122055d38b20e0a4f26f9e28638be549a2eeb01f79324de0dce83098a2d728e8210264736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806379cc6790116100de5780639dc29fac11610097578063aa271e1a11610071578063aa271e1a1461049b578063dd62ed3e146104cb578063ec126c77146104fb578063f2fde38b1461052b5761018e565b80639dc29fac1461040b578063a457c2d71461043b578063a9059cbb1461046b5761018e565b806379cc67901461036f5780638456cb591461038b5780638da5cb5b146103a957806395d89b41146103c7578063983b2d56146103e557806398650275146104015761018e565b80633f4ba83a1161014b5780635c975abb116101255780635c975abb146102e7578063628d6cba1461030557806370a0823114610335578063715018a6146103655761018e565b80633f4ba83a1461027d57806340c10f191461029b57806342966c68146102cb5761018e565b806306fdde0314610193578063095ea7b3146101b157806318160ddd146101e157806323b872dd146101ff578063313ce5671461022f578063395093511461024d575b600080fd5b61019b610547565b6040516101a8919061220c565b60405180910390f35b6101cb60048036038101906101c69190611e1e565b6105d9565b6040516101d891906121f1565b60405180910390f35b6101e96105f7565b6040516101f6919061244e565b60405180910390f35b61021960048036038101906102149190611dcf565b610601565b60405161022691906121f1565b60405180910390f35b610237610617565b6040516102449190612469565b60405180910390f35b61026760048036038101906102629190611e1e565b610620565b60405161027491906121f1565b60405180910390f35b6102856106cc565b60405161029291906121f1565b60405180910390f35b6102b560048036038101906102b09190611e1e565b6107a0565b6040516102c291906121f1565b60405180910390f35b6102e560048036038101906102e09190611ea9565b6107c8565b005b6102ef6107dc565b6040516102fc91906121f1565b60405180910390f35b61031f600480360381019061031a9190611ed2565b6107f3565b60405161032c91906121f1565b60405180910390f35b61034f600480360381019061034a9190611d6a565b6108f0565b60405161035c919061244e565b60405180910390f35b61036d610938565b005b61038960048036038101906103849190611e1e565b610a75565b005b610393610af0565b6040516103a091906121f1565b60405180910390f35b6103b1610bc5565b6040516103be91906121d6565b60405180910390f35b6103cf610bef565b6040516103dc919061220c565b60405180910390f35b6103ff60048036038101906103fa9190611d6a565b610c81565b005b610409610c9f565b005b61042560048036038101906104209190611e1e565b610caa565b60405161043291906121f1565b60405180910390f35b61045560048036038101906104509190611e1e565b610cd2565b60405161046291906121f1565b60405180910390f35b61048560048036038101906104809190611e1e565b610dbd565b60405161049291906121f1565b60405180910390f35b6104b560048036038101906104b09190611d6a565b610ddb565b6040516104c291906121f1565b60405180910390f35b6104e560048036038101906104e09190611d93565b610df8565b6040516104f2919061244e565b60405180910390f35b61051560048036038101906105109190611e5a565b610e7f565b60405161052291906121f1565b60405180910390f35b61054560048036038101906105409190611d6a565b610ef7565b005b606060038054610556906125bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610582906125bc565b80156105cf5780601f106105a4576101008083540402835291602001916105cf565b820191906000526020600020905b8154815290600101906020018083116105b257829003601f168201915b5050505050905090565b60006105ed6105e661113b565b8484611143565b6001905092915050565b6000600254905090565b600061060e84848461130e565b90509392505050565b60006012905090565b60006106c261062d61113b565b84846001600061063b61113b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546106bd91906124a0565b611143565b6001905092915050565b60006106d661113b565b73ffffffffffffffffffffffffffffffffffffffff166106f4610bc5565b73ffffffffffffffffffffffffffffffffffffffff161461074a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107419061234e565b60405180910390fd5b6107526107dc565b610791576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107889061224e565b60405180910390fd5b610799611406565b6001905090565b60006107ab33610ddb565b6107b457600080fd5b6107be83836114a8565b6001905092915050565b6107d96107d361113b565b826115fc565b50565b6000600560009054906101000a900460ff16905090565b60006107fe33610ddb565b61080757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e906122ce565b60405180910390fd5b61088133846115fc565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f6b616089d04950dc06c45c6dd787d657980543f89651aec47924752c7d16c888856040516108de919061244e565b60405180910390a36001905092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61094061113b565b73ffffffffffffffffffffffffffffffffffffffff1661095e610bc5565b73ffffffffffffffffffffffffffffffffffffffff16146109b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ab9061234e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000610a8883610a8361113b565b610df8565b905081811015610acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac49061236e565b60405180910390fd5b610ae183610ad961113b565b848403611143565b610aeb83836115fc565b505050565b6000610afa61113b565b73ffffffffffffffffffffffffffffffffffffffff16610b18610bc5565b73ffffffffffffffffffffffffffffffffffffffff1614610b6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b659061234e565b60405180910390fd5b610b766107dc565b15610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad9061230e565b60405180910390fd5b610bbe6117c7565b6001905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054610bfe906125bc565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2a906125bc565b8015610c775780601f10610c4c57610100808354040283529160200191610c77565b820191906000526020600020905b815481529060010190602001808311610c5a57829003601f168201915b5050505050905090565b610c8a33610ddb565b610c9357600080fd5b610c9c8161186a565b50565b610ca8336118c4565b565b6000610cb533610ddb565b610cbe57600080fd5b610cc883836115fc565b6001905092915050565b60008060016000610ce161113b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610d9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d95906123ee565b60405180910390fd5b610db2610da961113b565b85858403611143565b600191505092915050565b6000610dd1610dca61113b565b848461191e565b6001905092915050565b6000610df1826006611b9490919063ffffffff16565b9050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610e8a33610ddb565b610e9357600080fd5b610e9d83836114a8565b8273ffffffffffffffffffffffffffffffffffffffff16847f05d0634fe981be85c22e2942a880821b70095d84e152c3ea3c17a4e4250d9d6184604051610ee4919061244e565b60405180910390a3600190509392505050565b610eff61113b565b73ffffffffffffffffffffffffffffffffffffffff16610f1d610bc5565b73ffffffffffffffffffffffffffffffffffffffff1614610f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6a9061234e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fda9061228e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110dd57600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156111b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111aa906123ce565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121a906122ae565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611301919061244e565b60405180910390a3505050565b600061131b84848461191e565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061136661113b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050828110156113e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113dd9061232e565b60405180910390fd5b6113fa856113f261113b565b858403611143565b60019150509392505050565b61140e6107dc565b61144d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114449061224e565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61149161113b565b60405161149e91906121d6565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f9061240e565b60405180910390fd5b61152460008383611c26565b806002600082825461153691906124a0565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461158b91906124a0565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516115f0919061244e565b60405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561166c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116639061238e565b60405180910390fd5b61167882600083611c26565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156116fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f59061226e565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816002600082825461175591906124f6565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516117ba919061244e565b60405180910390a3505050565b6117cf6107dc565b1561180f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118069061230e565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861185361113b565b60405161186091906121d6565b60405180910390a1565b61187e8160066110a390919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a250565b6118d8816006611c3690919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561198e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611985906123ae565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f59061222e565b60405180910390fd5b611a09838383611c26565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a86906122ee565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b2291906124a0565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611b86919061244e565b60405180910390a350505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bcf57600080fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c31838383611cce565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c7057600080fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611cd9838383611d26565b611ce16107dc565b15611d21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d189061242e565b60405180910390fd5b505050565b505050565b600081359050611d3a81612ade565b92915050565b600081359050611d4f81612af5565b92915050565b600081359050611d6481612b0c565b92915050565b600060208284031215611d7c57600080fd5b6000611d8a84828501611d2b565b91505092915050565b60008060408385031215611da657600080fd5b6000611db485828601611d2b565b9250506020611dc585828601611d2b565b9150509250929050565b600080600060608486031215611de457600080fd5b6000611df286828701611d2b565b9350506020611e0386828701611d2b565b9250506040611e1486828701611d55565b9150509250925092565b60008060408385031215611e3157600080fd5b6000611e3f85828601611d2b565b9250506020611e5085828601611d55565b9150509250929050565b600080600060608486031215611e6f57600080fd5b6000611e7d86828701611d40565b9350506020611e8e86828701611d2b565b9250506040611e9f86828701611d55565b9150509250925092565b600060208284031215611ebb57600080fd5b6000611ec984828501611d55565b91505092915050565b60008060408385031215611ee557600080fd5b6000611ef385828601611d55565b9250506020611f0485828601611d2b565b9150509250929050565b611f178161252a565b82525050565b611f268161253c565b82525050565b6000611f3782612484565b611f41818561248f565b9350611f51818560208601612589565b611f5a8161264c565b840191505092915050565b6000611f7260238361248f565b9150611f7d8261265d565b604082019050919050565b6000611f9560148361248f565b9150611fa0826126ac565b602082019050919050565b6000611fb860228361248f565b9150611fc3826126d5565b604082019050919050565b6000611fdb60268361248f565b9150611fe682612724565b604082019050919050565b6000611ffe60228361248f565b915061200982612773565b604082019050919050565b600061202160188361248f565b915061202c826127c2565b602082019050919050565b600061204460268361248f565b915061204f826127eb565b604082019050919050565b600061206760108361248f565b91506120728261283a565b602082019050919050565b600061208a60288361248f565b915061209582612863565b604082019050919050565b60006120ad60208361248f565b91506120b8826128b2565b602082019050919050565b60006120d060248361248f565b91506120db826128db565b604082019050919050565b60006120f360218361248f565b91506120fe8261292a565b604082019050919050565b600061211660258361248f565b915061212182612979565b604082019050919050565b600061213960248361248f565b9150612144826129c8565b604082019050919050565b600061215c60258361248f565b915061216782612a17565b604082019050919050565b600061217f601f8361248f565b915061218a82612a66565b602082019050919050565b60006121a2602a8361248f565b91506121ad82612a8f565b604082019050919050565b6121c181612572565b82525050565b6121d08161257c565b82525050565b60006020820190506121eb6000830184611f0e565b92915050565b60006020820190506122066000830184611f1d565b92915050565b600060208201905081810360008301526122268184611f2c565b905092915050565b6000602082019050818103600083015261224781611f65565b9050919050565b6000602082019050818103600083015261226781611f88565b9050919050565b6000602082019050818103600083015261228781611fab565b9050919050565b600060208201905081810360008301526122a781611fce565b9050919050565b600060208201905081810360008301526122c781611ff1565b9050919050565b600060208201905081810360008301526122e781612014565b9050919050565b6000602082019050818103600083015261230781612037565b9050919050565b600060208201905081810360008301526123278161205a565b9050919050565b600060208201905081810360008301526123478161207d565b9050919050565b60006020820190508181036000830152612367816120a0565b9050919050565b60006020820190508181036000830152612387816120c3565b9050919050565b600060208201905081810360008301526123a7816120e6565b9050919050565b600060208201905081810360008301526123c781612109565b9050919050565b600060208201905081810360008301526123e78161212c565b9050919050565b600060208201905081810360008301526124078161214f565b9050919050565b6000602082019050818103600083015261242781612172565b9050919050565b6000602082019050818103600083015261244781612195565b9050919050565b600060208201905061246360008301846121b8565b92915050565b600060208201905061247e60008301846121c7565b92915050565b600081519050919050565b600082825260208201905092915050565b60006124ab82612572565b91506124b683612572565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156124eb576124ea6125ee565b5b828201905092915050565b600061250182612572565b915061250c83612572565b92508282101561251f5761251e6125ee565b5b828203905092915050565b600061253582612552565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b838110156125a757808201518184015260208101905061258c565b838111156125b6576000848401525b50505050565b600060028204905060018216806125d457607f821691505b602082108114156125e8576125e761261d565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420616c6c6f776564206164647265737328307830290000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b7f45524332305061757361626c653a20746f6b656e207472616e7366657220776860008201527f696c652070617573656400000000000000000000000000000000000000000000602082015250565b612ae78161252a565b8114612af257600080fd5b50565b612afe81612548565b8114612b0957600080fd5b50565b612b1581612572565b8114612b2057600080fd5b5056fea264697066735822122055d38b20e0a4f26f9e28638be549a2eeb01f79324de0dce83098a2d728e8210264736f6c63430008040033

Deployed Bytecode Sourcemap

34789:3951:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9136:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35451:161;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10256:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36094:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10098:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12809:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38294:114;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36591:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18387:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20144:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37443:278;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10427:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3352:148;;;:::i;:::-;;18797:356;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38040:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2701:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9355:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34313:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34413:77;;;:::i;:::-;;37068:144;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13527:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35137:167;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34197:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11005:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37222:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3655:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9136:100;9190:13;9223:5;9216:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9136:100;:::o;35451:161::-;35526:4;35543:39;35552:12;:10;:12::i;:::-;35566:7;35575:6;35543:8;:39::i;:::-;35600:4;35593:11;;35451:161;;;;:::o;10256:108::-;10317:7;10344:12;;10337:19;;10256:108;:::o;36094:175::-;36192:4;36216:45;36235:6;36243:9;36254:6;36216:18;:45::i;:::-;36209:52;;36094:175;;;;;:::o;10098:93::-;10156:5;10181:2;10174:9;;10098:93;:::o;12809:215::-;12897:4;12914:80;12923:12;:10;:12::i;:::-;12937:7;12983:10;12946:11;:25;12958:12;:10;:12::i;:::-;12946:25;;;;;;;;;;;;;;;:34;12972:7;12946:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;12914:8;:80::i;:::-;13012:4;13005:11;;12809:215;;;;:::o;38294:114::-;38352:4;2932:12;:10;:12::i;:::-;2921:23;;:7;:5;:7::i;:::-;:23;;;2913:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20747:8:::1;:6;:8::i;:::-;20739:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;38368:10:::2;:8;:10::i;:::-;38396:4;38389:11;;38294:114:::0;:::o;36591:145::-;36667:4;34148:20;34157:10;34148:8;:20::i;:::-;34140:29;;;;;;36684:22:::1;36690:7;36699:6;36684:5;:22::i;:::-;36724:4;36717:11;;36591:145:::0;;;;:::o;18387:91::-;18443:27;18449:12;:10;:12::i;:::-;18463:6;18443:5;:27::i;:::-;18387:91;:::o;20144:86::-;20191:4;20215:7;;;;;;;;;;;20208:14;;20144:86;:::o;37443:278::-;37523:4;34148:20;34157:10;34148:8;:20::i;:::-;34140:29;;;;;;37568:1:::1;37548:22;;:8;:22;;;;37540:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;37610:25;37616:10;37628:6;37610:5;:25::i;:::-;37674:8;37651:40;;37662:10;37651:40;;;37684:6;37651:40;;;;;;:::i;:::-;;;;;;;;37709:4;37702:11;;37443:278:::0;;;;:::o;10427:127::-;10501:7;10528:9;:18;10538:7;10528:18;;;;;;;;;;;;;;;;10521:25;;10427:127;;;:::o;3352:148::-;2932:12;:10;:12::i;:::-;2921:23;;:7;:5;:7::i;:::-;:23;;;2913:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3459:1:::1;3422:40;;3443:6;;;;;;;;;;;3422:40;;;;;;;;;;;;3490:1;3473:6;;:19;;;;;;;;;;;;;;;;;;3352:148::o:0;18797:356::-;18874:24;18901:32;18911:7;18920:12;:10;:12::i;:::-;18901:9;:32::i;:::-;18874:59;;18972:6;18952:16;:26;;18944:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;19047:58;19056:7;19065:12;:10;:12::i;:::-;19098:6;19079:16;:25;19047:8;:58::i;:::-;19123:22;19129:7;19138:6;19123:5;:22::i;:::-;18797:356;;;:::o;38040:113::-;38099:4;2932:12;:10;:12::i;:::-;2921:23;;:7;:5;:7::i;:::-;:23;;;2913:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20470:8:::1;:6;:8::i;:::-;20469:9;20461:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;38115:8:::2;:6;:8::i;:::-;38141:4;38134:11;;38040:113:::0;:::o;2701:87::-;2747:7;2774:6;;;;;;;;;;;2767:13;;2701:87;:::o;9355:104::-;9411:13;9444:7;9437:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9355:104;:::o;34313:92::-;34148:20;34157:10;34148:8;:20::i;:::-;34140:29;;;;;;34378:19:::1;34389:7;34378:10;:19::i;:::-;34313:92:::0;:::o;34413:77::-;34457:25;34471:10;34457:13;:25::i;:::-;34413:77::o;37068:144::-;37144:4;34148:20;34157:10;34148:8;:20::i;:::-;34140:29;;;;;;37160:22:::1;37166:7;37175:6;37160:5;:22::i;:::-;37200:4;37193:11;;37068:144:::0;;;;:::o;13527:401::-;13620:4;13637:24;13664:11;:25;13676:12;:10;:12::i;:::-;13664:25;;;;;;;;;;;;;;;:34;13690:7;13664:34;;;;;;;;;;;;;;;;13637:61;;13737:15;13717:16;:35;;13709:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;13822:67;13831:12;:10;:12::i;:::-;13845:7;13873:15;13854:16;:34;13822:8;:67::i;:::-;13916:4;13909:11;;;13527:401;;;;:::o;35137:167::-;35215:4;35232:42;35242:12;:10;:12::i;:::-;35256:9;35267:6;35232:9;:42::i;:::-;35292:4;35285:11;;35137:167;;;;:::o;34197:108::-;34253:4;34277:20;34289:7;34277;:11;;:20;;;;:::i;:::-;34270:27;;34197:108;;;:::o;11005:151::-;11094:7;11121:11;:18;11133:5;11121:18;;;;;;;;;;;;;;;:27;11140:7;11121:27;;;;;;;;;;;;;;;;11114:34;;11005:151;;;;:::o;37222:213::-;37316:4;34148:20;34157:10;34148:8;:20::i;:::-;34140:29;;;;;;37333:22:::1;37339:7;37348:6;37333:5;:22::i;:::-;37389:7;37371:34;;37381:6;37371:34;37398:6;37371:34;;;;;;:::i;:::-;;;;;;;;37423:4;37416:11;;37222:213:::0;;;;;:::o;3655:244::-;2932:12;:10;:12::i;:::-;2921:23;;:7;:5;:7::i;:::-;:23;;;2913:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3764:1:::1;3744:22;;:8;:22;;;;3736:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3854:8;3825:38;;3846:6;;;;;;;;;;;3825:38;;;;;;;;;;;;3883:8;3874:6;;:17;;;;;;;;;;;;;;;;;;3655:244:::0;:::o;33184:145::-;33280:1;33261:21;;:7;:21;;;;33253:30;;;;;;33317:4;33294;:11;;:20;33306:7;33294:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;33184:145;;:::o;1358:98::-;1411:7;1438:10;1431:17;;1358:98;:::o;16960:346::-;17079:1;17062:19;;:5;:19;;;;17054:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17160:1;17141:21;;:7;:21;;;;17133:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17244:6;17214:11;:18;17226:5;17214:18;;;;;;;;;;;;;;;:27;17233:7;17214:27;;;;;;;;;;;;;;;:36;;;;17282:7;17266:32;;17275:5;17266:32;;;17291:6;17266:32;;;;;;:::i;:::-;;;;;;;;16960:346;;;:::o;11954:446::-;12060:4;12077:36;12087:6;12095:9;12106:6;12077:9;:36::i;:::-;12126:24;12153:11;:19;12165:6;12153:19;;;;;;;;;;;;;;;:33;12173:12;:10;:12::i;:::-;12153:33;;;;;;;;;;;;;;;;12126:60;;12225:6;12205:16;:26;;12197:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;12304:57;12313:6;12321:12;:10;:12::i;:::-;12354:6;12335:16;:25;12304:8;:57::i;:::-;12388:4;12381:11;;;11954:446;;;;;:::o;21203:120::-;20747:8;:6;:8::i;:::-;20739:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;21272:5:::1;21262:7;;:15;;;;;;;;;;;;;;;;;;21293:22;21302:12;:10;:12::i;:::-;21293:22;;;;;;:::i;:::-;;;;;;;;21203:120::o:0;15333:338::-;15436:1;15417:21;;:7;:21;;;;15409:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;15487:49;15516:1;15520:7;15529:6;15487:20;:49::i;:::-;15565:6;15549:12;;:22;;;;;;;:::i;:::-;;;;;;;;15604:6;15582:9;:18;15592:7;15582:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;15647:7;15626:37;;15643:1;15626:37;;;15656:6;15626:37;;;;;;:::i;:::-;;;;;;;;15333:338;;:::o;16004:518::-;16107:1;16088:21;;:7;:21;;;;16080:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16160:49;16181:7;16198:1;16202:6;16160:20;:49::i;:::-;16222:22;16247:9;:18;16257:7;16247:18;;;;;;;;;;;;;;;;16222:43;;16302:6;16284:14;:24;;16276:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;16413:6;16396:14;:23;16375:9;:18;16385:7;16375:18;;;;;;;;;;;;;;;:44;;;;16453:6;16437:12;;:22;;;;;;;:::i;:::-;;;;;;;;16503:1;16477:37;;16486:7;16477:37;;;16507:6;16477:37;;;;;;:::i;:::-;;;;;;;;16004:518;;;:::o;20944:118::-;20470:8;:6;:8::i;:::-;20469:9;20461:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;21014:4:::1;21004:7;;:14;;;;;;;;;;;;;;;;;;21034:20;21041:12;:10;:12::i;:::-;21034:20;;;;;;:::i;:::-;;;;;;;;20944:118::o:0;34498:121::-;34555:20;34567:7;34555;:11;;:20;;;;:::i;:::-;34603:7;34591:20;;;;;;;;;;;;34498:121;:::o;34627:129::-;34687:23;34702:7;34687;:14;;:23;;;;:::i;:::-;34740:7;34726:22;;;;;;;;;;;;34627:129;:::o;14418:628::-;14542:1;14524:20;;:6;:20;;;;14516:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;14626:1;14605:23;;:9;:23;;;;14597:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14681:47;14702:6;14710:9;14721:6;14681:20;:47::i;:::-;14741:21;14765:9;:17;14775:6;14765:17;;;;;;;;;;;;;;;;14741:41;;14818:6;14801:13;:23;;14793:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;14931:6;14915:13;:22;14895:9;:17;14905:6;14895:17;;;;;;;;;;;;;;;:42;;;;14979:6;14955:9;:20;14965:9;14955:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;15020:9;15003:35;;15012:6;15003:35;;;15031:6;15003:35;;;;;;:::i;:::-;;;;;;;;14418:628;;;;:::o;33651:185::-;33738:4;33787:1;33768:21;;:7;:21;;;;33760:30;;;;;;33808:4;:11;;:20;33820:7;33808:20;;;;;;;;;;;;;;;;;;;;;;;;;33801:27;;33651:185;;;;:::o;38562:175::-;38685:44;38712:4;38718:2;38722:6;38685:26;:44::i;:::-;38562:175;;;:::o;33408:149::-;33507:1;33488:21;;:7;:21;;;;33480:30;;;;;;33544:5;33521:4;:11;;:20;33533:7;33521:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;33408:149;;:::o;21813:238::-;21922:44;21949:4;21955:2;21959:6;21922:26;:44::i;:::-;21988:8;:6;:8::i;:::-;21987:9;21979:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;21813:238;;;:::o;17909:92::-;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:139::-;198:5;236:6;223:20;214:29;;252:33;279:5;252:33;:::i;:::-;204:87;;;;:::o;297:139::-;343:5;381:6;368:20;359:29;;397:33;424:5;397:33;:::i;:::-;349:87;;;;:::o;442:262::-;501:6;550:2;538:9;529:7;525:23;521:32;518:2;;;566:1;563;556:12;518:2;609:1;634:53;679:7;670:6;659:9;655:22;634:53;:::i;:::-;624:63;;580:117;508:196;;;;:::o;710:407::-;778:6;786;835:2;823:9;814:7;810:23;806:32;803:2;;;851:1;848;841:12;803:2;894:1;919:53;964:7;955:6;944:9;940:22;919:53;:::i;:::-;909:63;;865:117;1021:2;1047:53;1092:7;1083:6;1072:9;1068:22;1047:53;:::i;:::-;1037:63;;992:118;793:324;;;;;:::o;1123:552::-;1200:6;1208;1216;1265:2;1253:9;1244:7;1240:23;1236:32;1233:2;;;1281:1;1278;1271:12;1233:2;1324:1;1349:53;1394:7;1385:6;1374:9;1370:22;1349:53;:::i;:::-;1339:63;;1295:117;1451:2;1477:53;1522:7;1513:6;1502:9;1498:22;1477:53;:::i;:::-;1467:63;;1422:118;1579:2;1605:53;1650:7;1641:6;1630:9;1626:22;1605:53;:::i;:::-;1595:63;;1550:118;1223:452;;;;;:::o;1681:407::-;1749:6;1757;1806:2;1794:9;1785:7;1781:23;1777:32;1774:2;;;1822:1;1819;1812:12;1774:2;1865:1;1890:53;1935:7;1926:6;1915:9;1911:22;1890:53;:::i;:::-;1880:63;;1836:117;1992:2;2018:53;2063:7;2054:6;2043:9;2039:22;2018:53;:::i;:::-;2008:63;;1963:118;1764:324;;;;;:::o;2094:552::-;2171:6;2179;2187;2236:2;2224:9;2215:7;2211:23;2207:32;2204:2;;;2252:1;2249;2242:12;2204:2;2295:1;2320:53;2365:7;2356:6;2345:9;2341:22;2320:53;:::i;:::-;2310:63;;2266:117;2422:2;2448:53;2493:7;2484:6;2473:9;2469:22;2448:53;:::i;:::-;2438:63;;2393:118;2550:2;2576:53;2621:7;2612:6;2601:9;2597:22;2576:53;:::i;:::-;2566:63;;2521:118;2194:452;;;;;:::o;2652:262::-;2711:6;2760:2;2748:9;2739:7;2735:23;2731:32;2728:2;;;2776:1;2773;2766:12;2728:2;2819:1;2844:53;2889:7;2880:6;2869:9;2865:22;2844:53;:::i;:::-;2834:63;;2790:117;2718:196;;;;:::o;2920:407::-;2988:6;2996;3045:2;3033:9;3024:7;3020:23;3016:32;3013:2;;;3061:1;3058;3051:12;3013:2;3104:1;3129:53;3174:7;3165:6;3154:9;3150:22;3129:53;:::i;:::-;3119:63;;3075:117;3231:2;3257:53;3302:7;3293:6;3282:9;3278:22;3257:53;:::i;:::-;3247:63;;3202:118;3003:324;;;;;:::o;3333:118::-;3420:24;3438:5;3420:24;:::i;:::-;3415:3;3408:37;3398:53;;:::o;3457:109::-;3538:21;3553:5;3538:21;:::i;:::-;3533:3;3526:34;3516:50;;:::o;3572:364::-;3660:3;3688:39;3721:5;3688:39;:::i;:::-;3743:71;3807:6;3802:3;3743:71;:::i;:::-;3736:78;;3823:52;3868:6;3863:3;3856:4;3849:5;3845:16;3823:52;:::i;:::-;3900:29;3922:6;3900:29;:::i;:::-;3895:3;3891:39;3884:46;;3664:272;;;;;:::o;3942:366::-;4084:3;4105:67;4169:2;4164:3;4105:67;:::i;:::-;4098:74;;4181:93;4270:3;4181:93;:::i;:::-;4299:2;4294:3;4290:12;4283:19;;4088:220;;;:::o;4314:366::-;4456:3;4477:67;4541:2;4536:3;4477:67;:::i;:::-;4470:74;;4553:93;4642:3;4553:93;:::i;:::-;4671:2;4666:3;4662:12;4655:19;;4460:220;;;:::o;4686:366::-;4828:3;4849:67;4913:2;4908:3;4849:67;:::i;:::-;4842:74;;4925:93;5014:3;4925:93;:::i;:::-;5043:2;5038:3;5034:12;5027:19;;4832:220;;;:::o;5058:366::-;5200:3;5221:67;5285:2;5280:3;5221:67;:::i;:::-;5214:74;;5297:93;5386:3;5297:93;:::i;:::-;5415:2;5410:3;5406:12;5399:19;;5204:220;;;:::o;5430:366::-;5572:3;5593:67;5657:2;5652:3;5593:67;:::i;:::-;5586:74;;5669:93;5758:3;5669:93;:::i;:::-;5787:2;5782:3;5778:12;5771:19;;5576:220;;;:::o;5802:366::-;5944:3;5965:67;6029:2;6024:3;5965:67;:::i;:::-;5958:74;;6041:93;6130:3;6041:93;:::i;:::-;6159:2;6154:3;6150:12;6143:19;;5948:220;;;:::o;6174:366::-;6316:3;6337:67;6401:2;6396:3;6337:67;:::i;:::-;6330:74;;6413:93;6502:3;6413:93;:::i;:::-;6531:2;6526:3;6522:12;6515:19;;6320:220;;;:::o;6546:366::-;6688:3;6709:67;6773:2;6768:3;6709:67;:::i;:::-;6702:74;;6785:93;6874:3;6785:93;:::i;:::-;6903:2;6898:3;6894:12;6887:19;;6692:220;;;:::o;6918:366::-;7060:3;7081:67;7145:2;7140:3;7081:67;:::i;:::-;7074:74;;7157:93;7246:3;7157:93;:::i;:::-;7275:2;7270:3;7266:12;7259:19;;7064:220;;;:::o;7290:366::-;7432:3;7453:67;7517:2;7512:3;7453:67;:::i;:::-;7446:74;;7529:93;7618:3;7529:93;:::i;:::-;7647:2;7642:3;7638:12;7631:19;;7436:220;;;:::o;7662:366::-;7804:3;7825:67;7889:2;7884:3;7825:67;:::i;:::-;7818:74;;7901:93;7990:3;7901:93;:::i;:::-;8019:2;8014:3;8010:12;8003:19;;7808:220;;;:::o;8034:366::-;8176:3;8197:67;8261:2;8256:3;8197:67;:::i;:::-;8190:74;;8273:93;8362:3;8273:93;:::i;:::-;8391:2;8386:3;8382:12;8375:19;;8180:220;;;:::o;8406:366::-;8548:3;8569:67;8633:2;8628:3;8569:67;:::i;:::-;8562:74;;8645:93;8734:3;8645:93;:::i;:::-;8763:2;8758:3;8754:12;8747:19;;8552:220;;;:::o;8778:366::-;8920:3;8941:67;9005:2;9000:3;8941:67;:::i;:::-;8934:74;;9017:93;9106:3;9017:93;:::i;:::-;9135:2;9130:3;9126:12;9119:19;;8924:220;;;:::o;9150:366::-;9292:3;9313:67;9377:2;9372:3;9313:67;:::i;:::-;9306:74;;9389:93;9478:3;9389:93;:::i;:::-;9507:2;9502:3;9498:12;9491:19;;9296:220;;;:::o;9522:366::-;9664:3;9685:67;9749:2;9744:3;9685:67;:::i;:::-;9678:74;;9761:93;9850:3;9761:93;:::i;:::-;9879:2;9874:3;9870:12;9863:19;;9668:220;;;:::o;9894:366::-;10036:3;10057:67;10121:2;10116:3;10057:67;:::i;:::-;10050:74;;10133:93;10222:3;10133:93;:::i;:::-;10251:2;10246:3;10242:12;10235:19;;10040:220;;;:::o;10266:118::-;10353:24;10371:5;10353:24;:::i;:::-;10348:3;10341:37;10331:53;;:::o;10390:112::-;10473:22;10489:5;10473:22;:::i;:::-;10468:3;10461:35;10451:51;;:::o;10508:222::-;10601:4;10639:2;10628:9;10624:18;10616:26;;10652:71;10720:1;10709:9;10705:17;10696:6;10652:71;:::i;:::-;10606:124;;;;:::o;10736:210::-;10823:4;10861:2;10850:9;10846:18;10838:26;;10874:65;10936:1;10925:9;10921:17;10912:6;10874:65;:::i;:::-;10828:118;;;;:::o;10952:313::-;11065:4;11103:2;11092:9;11088:18;11080:26;;11152:9;11146:4;11142:20;11138:1;11127:9;11123:17;11116:47;11180:78;11253:4;11244:6;11180:78;:::i;:::-;11172:86;;11070:195;;;;:::o;11271:419::-;11437:4;11475:2;11464:9;11460:18;11452:26;;11524:9;11518:4;11514:20;11510:1;11499:9;11495:17;11488:47;11552:131;11678:4;11552:131;:::i;:::-;11544:139;;11442:248;;;:::o;11696:419::-;11862:4;11900:2;11889:9;11885:18;11877:26;;11949:9;11943:4;11939:20;11935:1;11924:9;11920:17;11913:47;11977:131;12103:4;11977:131;:::i;:::-;11969:139;;11867:248;;;:::o;12121:419::-;12287:4;12325:2;12314:9;12310:18;12302:26;;12374:9;12368:4;12364:20;12360:1;12349:9;12345:17;12338:47;12402:131;12528:4;12402:131;:::i;:::-;12394:139;;12292:248;;;:::o;12546:419::-;12712:4;12750:2;12739:9;12735:18;12727:26;;12799:9;12793:4;12789:20;12785:1;12774:9;12770:17;12763:47;12827:131;12953:4;12827:131;:::i;:::-;12819:139;;12717:248;;;:::o;12971:419::-;13137:4;13175:2;13164:9;13160:18;13152:26;;13224:9;13218:4;13214:20;13210:1;13199:9;13195:17;13188:47;13252:131;13378:4;13252:131;:::i;:::-;13244:139;;13142:248;;;:::o;13396:419::-;13562:4;13600:2;13589:9;13585:18;13577:26;;13649:9;13643:4;13639:20;13635:1;13624:9;13620:17;13613:47;13677:131;13803:4;13677:131;:::i;:::-;13669:139;;13567:248;;;:::o;13821:419::-;13987:4;14025:2;14014:9;14010:18;14002:26;;14074:9;14068:4;14064:20;14060:1;14049:9;14045:17;14038:47;14102:131;14228:4;14102:131;:::i;:::-;14094:139;;13992:248;;;:::o;14246:419::-;14412:4;14450:2;14439:9;14435:18;14427:26;;14499:9;14493:4;14489:20;14485:1;14474:9;14470:17;14463:47;14527:131;14653:4;14527:131;:::i;:::-;14519:139;;14417:248;;;:::o;14671:419::-;14837:4;14875:2;14864:9;14860:18;14852:26;;14924:9;14918:4;14914:20;14910:1;14899:9;14895:17;14888:47;14952:131;15078:4;14952:131;:::i;:::-;14944:139;;14842:248;;;:::o;15096:419::-;15262:4;15300:2;15289:9;15285:18;15277:26;;15349:9;15343:4;15339:20;15335:1;15324:9;15320:17;15313:47;15377:131;15503:4;15377:131;:::i;:::-;15369:139;;15267:248;;;:::o;15521:419::-;15687:4;15725:2;15714:9;15710:18;15702:26;;15774:9;15768:4;15764:20;15760:1;15749:9;15745:17;15738:47;15802:131;15928:4;15802:131;:::i;:::-;15794:139;;15692:248;;;:::o;15946:419::-;16112:4;16150:2;16139:9;16135:18;16127:26;;16199:9;16193:4;16189:20;16185:1;16174:9;16170:17;16163:47;16227:131;16353:4;16227:131;:::i;:::-;16219:139;;16117:248;;;:::o;16371:419::-;16537:4;16575:2;16564:9;16560:18;16552:26;;16624:9;16618:4;16614:20;16610:1;16599:9;16595:17;16588:47;16652:131;16778:4;16652:131;:::i;:::-;16644:139;;16542:248;;;:::o;16796:419::-;16962:4;17000:2;16989:9;16985:18;16977:26;;17049:9;17043:4;17039:20;17035:1;17024:9;17020:17;17013:47;17077:131;17203:4;17077:131;:::i;:::-;17069:139;;16967:248;;;:::o;17221:419::-;17387:4;17425:2;17414:9;17410:18;17402:26;;17474:9;17468:4;17464:20;17460:1;17449:9;17445:17;17438:47;17502:131;17628:4;17502:131;:::i;:::-;17494:139;;17392:248;;;:::o;17646:419::-;17812:4;17850:2;17839:9;17835:18;17827:26;;17899:9;17893:4;17889:20;17885:1;17874:9;17870:17;17863:47;17927:131;18053:4;17927:131;:::i;:::-;17919:139;;17817:248;;;:::o;18071:419::-;18237:4;18275:2;18264:9;18260:18;18252:26;;18324:9;18318:4;18314:20;18310:1;18299:9;18295:17;18288:47;18352:131;18478:4;18352:131;:::i;:::-;18344:139;;18242:248;;;:::o;18496:222::-;18589:4;18627:2;18616:9;18612:18;18604:26;;18640:71;18708:1;18697:9;18693:17;18684:6;18640:71;:::i;:::-;18594:124;;;;:::o;18724:214::-;18813:4;18851:2;18840:9;18836:18;18828:26;;18864:67;18928:1;18917:9;18913:17;18904:6;18864:67;:::i;:::-;18818:120;;;;:::o;18944:99::-;18996:6;19030:5;19024:12;19014:22;;19003:40;;;:::o;19049:169::-;19133:11;19167:6;19162:3;19155:19;19207:4;19202:3;19198:14;19183:29;;19145:73;;;;:::o;19224:305::-;19264:3;19283:20;19301:1;19283:20;:::i;:::-;19278:25;;19317:20;19335:1;19317:20;:::i;:::-;19312:25;;19471:1;19403:66;19399:74;19396:1;19393:81;19390:2;;;19477:18;;:::i;:::-;19390:2;19521:1;19518;19514:9;19507:16;;19268:261;;;;:::o;19535:191::-;19575:4;19595:20;19613:1;19595:20;:::i;:::-;19590:25;;19629:20;19647:1;19629:20;:::i;:::-;19624:25;;19668:1;19665;19662:8;19659:2;;;19673:18;;:::i;:::-;19659:2;19718:1;19715;19711:9;19703:17;;19580:146;;;;:::o;19732:96::-;19769:7;19798:24;19816:5;19798:24;:::i;:::-;19787:35;;19777:51;;;:::o;19834:90::-;19868:7;19911:5;19904:13;19897:21;19886:32;;19876:48;;;:::o;19930:77::-;19967:7;19996:5;19985:16;;19975:32;;;:::o;20013:126::-;20050:7;20090:42;20083:5;20079:54;20068:65;;20058:81;;;:::o;20145:77::-;20182:7;20211:5;20200:16;;20190:32;;;:::o;20228:86::-;20263:7;20303:4;20296:5;20292:16;20281:27;;20271:43;;;:::o;20320:307::-;20388:1;20398:113;20412:6;20409:1;20406:13;20398:113;;;20497:1;20492:3;20488:11;20482:18;20478:1;20473:3;20469:11;20462:39;20434:2;20431:1;20427:10;20422:15;;20398:113;;;20529:6;20526:1;20523:13;20520:2;;;20609:1;20600:6;20595:3;20591:16;20584:27;20520:2;20369:258;;;;:::o;20633:320::-;20677:6;20714:1;20708:4;20704:12;20694:22;;20761:1;20755:4;20751:12;20782:18;20772:2;;20838:4;20830:6;20826:17;20816:27;;20772:2;20900;20892:6;20889:14;20869:18;20866:38;20863:2;;;20919:18;;:::i;:::-;20863:2;20684:269;;;;:::o;20959:180::-;21007:77;21004:1;20997:88;21104:4;21101:1;21094:15;21128:4;21125:1;21118:15;21145:180;21193:77;21190:1;21183:88;21290:4;21287:1;21280:15;21314:4;21311:1;21304:15;21331:102;21372:6;21423:2;21419:7;21414:2;21407:5;21403:14;21399:28;21389:38;;21379:54;;;:::o;21439:222::-;21579:34;21575:1;21567:6;21563:14;21556:58;21648:5;21643:2;21635:6;21631:15;21624:30;21545:116;:::o;21667:170::-;21807:22;21803:1;21795:6;21791:14;21784:46;21773:64;:::o;21843:221::-;21983:34;21979:1;21971:6;21967:14;21960:58;22052:4;22047:2;22039:6;22035:15;22028:29;21949:115;:::o;22070:225::-;22210:34;22206:1;22198:6;22194:14;22187:58;22279:8;22274:2;22266:6;22262:15;22255:33;22176:119;:::o;22301:221::-;22441:34;22437:1;22429:6;22425:14;22418:58;22510:4;22505:2;22497:6;22493:15;22486:29;22407:115;:::o;22528:174::-;22668:26;22664:1;22656:6;22652:14;22645:50;22634:68;:::o;22708:225::-;22848:34;22844:1;22836:6;22832:14;22825:58;22917:8;22912:2;22904:6;22900:15;22893:33;22814:119;:::o;22939:166::-;23079:18;23075:1;23067:6;23063:14;23056:42;23045:60;:::o;23111:227::-;23251:34;23247:1;23239:6;23235:14;23228:58;23320:10;23315:2;23307:6;23303:15;23296:35;23217:121;:::o;23344:182::-;23484:34;23480:1;23472:6;23468:14;23461:58;23450:76;:::o;23532:223::-;23672:34;23668:1;23660:6;23656:14;23649:58;23741:6;23736:2;23728:6;23724:15;23717:31;23638:117;:::o;23761:220::-;23901:34;23897:1;23889:6;23885:14;23878:58;23970:3;23965:2;23957:6;23953:15;23946:28;23867:114;:::o;23987:224::-;24127:34;24123:1;24115:6;24111:14;24104:58;24196:7;24191:2;24183:6;24179:15;24172:32;24093:118;:::o;24217:223::-;24357:34;24353:1;24345:6;24341:14;24334:58;24426:6;24421:2;24413:6;24409:15;24402:31;24323:117;:::o;24446:224::-;24586:34;24582:1;24574:6;24570:14;24563:58;24655:7;24650:2;24642:6;24638:15;24631:32;24552:118;:::o;24676:181::-;24816:33;24812:1;24804:6;24800:14;24793:57;24782:75;:::o;24863:229::-;25003:34;24999:1;24991:6;24987:14;24980:58;25072:12;25067:2;25059:6;25055:15;25048:37;24969:123;:::o;25098:122::-;25171:24;25189:5;25171:24;:::i;:::-;25164:5;25161:35;25151:2;;25210:1;25207;25200:12;25151:2;25141:79;:::o;25226:122::-;25299:24;25317:5;25299:24;:::i;:::-;25292:5;25289:35;25279:2;;25338:1;25335;25328:12;25279:2;25269:79;:::o;25354:122::-;25427:24;25445:5;25427:24;:::i;:::-;25420:5;25417:35;25407:2;;25466:1;25463;25456:12;25407:2;25397:79;:::o

Swarm Source

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