POL Price: $0.318641 (-1.18%)
Gas: 30 GWei
 

Overview

Max Total Supply

107,087.39383451 BLKC

Holders

52

Total Transfers

-

Market

Price

$0.0019 @ 0.005986 POL (-1.61%)

Onchain Market Cap

$204.25

Circulating Supply Market Cap

$21,733.00

Other Info

Token Contract (WITH 8 Decimals)

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

OVERVIEW

BlackHat is a privacy-focused coin based on PoS consensus and zk-SNARKs data protection protocol which provides anonymous untraceable transactions.

Market

Volume (24H):$10.46
Market Capitalization:$21,733.00
Circulating Supply:11,394,757.00 BLKC
Market Data Source: Coinmarketcap

Contract Source Code Verified (Exact Match)

Contract Name:
BlackHat

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2023-01-02
*/

// SPDX-License-Identifier: MIT

// File: contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

// File: contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: contracts/utils/cryptography/ECDSA.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.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 {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. 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.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // 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) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @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) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // 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 (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): 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.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @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) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @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 Message, created from `s`. 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(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

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

// File: contracts/utils/cryptography/draft-EIP712.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;


/**
 * @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;
    address private immutable _CACHED_THIS;

    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);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

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

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, 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);
    }
}

// File: contracts/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

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

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

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

// File: contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

// File: contracts/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


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

// File: contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

// File: contracts/token/ERC20/extensions/IERC20Metadata.sol


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

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: contracts/token/ERC20/ERC20.sol


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

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/token/ERC20/extensions/draft-ERC20Permit.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/extensions/draft-ERC20Permit.sol)

pragma solidity ^0.8.0;






/**
 * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * _Available since v3.4._
 */
abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 {
    using Counters for Counters.Counter;

    mapping(address => Counters.Counter) private _nonces;

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private constant _PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    /**
     * @dev In previous versions `_PERMIT_TYPEHASH` was declared as `immutable`.
     * However, to ensure consistency with the upgradeable transpiler, we will continue
     * to reserve a slot.
     * @custom:oz-renamed-from _PERMIT_TYPEHASH
     */
    // solhint-disable-next-line var-name-mixedcase
    bytes32 private _PERMIT_TYPEHASH_DEPRECATED_SLOT;

    /**
     * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`.
     *
     * It's a good idea to use the same `name` that is defined as the ERC20 token name.
     */
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @dev See {IERC20Permit-permit}.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual override {
        require(block.timestamp <= deadline, "ERC20Permit: expired deadline");

        bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline));

        bytes32 hash = _hashTypedDataV4(structHash);

        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");

        _approve(owner, spender, value);
    }

    /**
     * @dev See {IERC20Permit-nonces}.
     */
    function nonces(address owner) public view virtual override returns (uint256) {
        return _nonces[owner].current();
    }

    /**
     * @dev See {IERC20Permit-DOMAIN_SEPARATOR}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view override returns (bytes32) {
        return _domainSeparatorV4();
    }

    /**
     * @dev "Consume a nonce": return the current value and increment.
     *
     * _Available since v4.1._
     */
    function _useNonce(address owner) internal virtual returns (uint256 current) {
        Counters.Counter storage nonce = _nonces[owner];
        current = nonce.current();
        nonce.increment();
    }
}

// File: BlackHat.sol


pragma solidity ^0.8.4;






/// @custom:security-contact [email protected]
contract BlackHat is ERC20, Pausable, Ownable, ERC20Permit {
    bytes32 private constant _BURN_TYPEHASH =
        keccak256("Burn(address owner, uint256 amount)");

    constructor() ERC20("BlackHat", "BLKC") ERC20Permit("BlackHat") {}

    function decimals() public view virtual override returns (uint8) {
        return 8;
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount)
        internal
        whenNotPaused
        override
    {
        super._beforeTokenTransfer(from, to, amount);
    }

    function burn(address owner, uint256 amount, uint8 v, bytes32 r, bytes32 s) public onlyOwner {
        bytes32 burnHash = keccak256(abi.encode(_BURN_TYPEHASH, owner, amount));
        bytes32 hash = _hashTypedDataV4(burnHash);
        address signer = ECDSA.recover(hash, v, r, s);
        require(signer == owner, "ERC20Permit: invalid signature");
        _burn(owner, 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":"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":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101406040523480156200001257600080fd5b506040518060400160405280600881526020017f426c61636b486174000000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f426c61636b4861740000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f424c4b43000000000000000000000000000000000000000000000000000000008152508160039081620000fd91906200058a565b5080600490816200010f91906200058a565b5050506000600560006101000a81548160ff0219169083151502179055506200014d620001416200020660201b60201c565b6200020e60201b60201c565b60008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001b6818484620002d460201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050506200073f565b600033905090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008383834630604051602001620002f1959493929190620006e2565b6040516020818303038152906040528051906020012090509392505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200039257607f821691505b602082108103620003a857620003a76200034a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004127fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003d3565b6200041e8683620003d3565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200046b620004656200045f8462000436565b62000440565b62000436565b9050919050565b6000819050919050565b62000487836200044a565b6200049f620004968262000472565b848454620003e0565b825550505050565b600090565b620004b6620004a7565b620004c38184846200047c565b505050565b5b81811015620004eb57620004df600082620004ac565b600181019050620004c9565b5050565b601f8211156200053a576200050481620003ae565b6200050f84620003c3565b810160208510156200051f578190505b620005376200052e85620003c3565b830182620004c8565b50505b505050565b600082821c905092915050565b60006200055f600019846008026200053f565b1980831691505092915050565b60006200057a83836200054c565b9150826002028217905092915050565b620005958262000310565b67ffffffffffffffff811115620005b157620005b06200031b565b5b620005bd825462000379565b620005ca828285620004ef565b600060209050601f831160018114620006025760008415620005ed578287015190505b620005f985826200056c565b86555062000669565b601f1984166200061286620003ae565b60005b828110156200063c5784890151825560018201915060208501945060208101905062000615565b868310156200065c578489015162000658601f8916826200054c565b8355505b6001600288020188555050505b505050505050565b6000819050919050565b620006868162000671565b82525050565b620006978162000436565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006ca826200069d565b9050919050565b620006dc81620006bd565b82525050565b600060a082019050620006f960008301886200067b565b6200070860208301876200067b565b6200071760408301866200067b565b6200072660608301856200068c565b620007356080830184620006d1565b9695505050505050565b60805160a05160c05160e0516101005161012051612f576200078f600039600061133b0152600061137d0152600061135c01526000611291015260006112e7015260006113100152612f576000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063a457c2d71161007c578063a457c2d714610343578063a9059cbb14610373578063cd92086f146103a3578063d505accf146103bf578063dd62ed3e146103db578063f2fde38b1461040b57610142565b8063715018a6146102c35780637ecebe00146102cd5780638456cb59146102fd5780638da5cb5b1461030757806395d89b411461032557610142565b80633644e5151161010a5780633644e51514610201578063395093511461021f5780633f4ba83a1461024f57806340c10f19146102595780635c975abb1461027557806370a082311461029357610142565b806306fdde0314610147578063095ea7b31461016557806318160ddd1461019557806323b872dd146101b3578063313ce567146101e3575b600080fd5b61014f610427565b60405161015c9190611de5565b60405180910390f35b61017f600480360381019061017a9190611ea0565b6104b9565b60405161018c9190611efb565b60405180910390f35b61019d6104dc565b6040516101aa9190611f25565b60405180910390f35b6101cd60048036038101906101c89190611f40565b6104e6565b6040516101da9190611efb565b60405180910390f35b6101eb610515565b6040516101f89190611faf565b60405180910390f35b61020961051e565b6040516102169190611fe3565b60405180910390f35b61023960048036038101906102349190611ea0565b61052d565b6040516102469190611efb565b60405180910390f35b610257610564565b005b610273600480360381019061026e9190611ea0565b6105ea565b005b61027d610674565b60405161028a9190611efb565b60405180910390f35b6102ad60048036038101906102a89190611ffe565b61068b565b6040516102ba9190611f25565b60405180910390f35b6102cb6106d3565b005b6102e760048036038101906102e29190611ffe565b61075b565b6040516102f49190611f25565b60405180910390f35b6103056107ab565b005b61030f610831565b60405161031c919061203a565b60405180910390f35b61032d61085b565b60405161033a9190611de5565b60405180910390f35b61035d60048036038101906103589190611ea0565b6108ed565b60405161036a9190611efb565b60405180910390f35b61038d60048036038101906103889190611ea0565b610964565b60405161039a9190611efb565b60405180910390f35b6103bd60048036038101906103b891906120ad565b610987565b005b6103d960048036038101906103d49190612128565b610af1565b005b6103f560048036038101906103f091906121ca565b610c33565b6040516104029190611f25565b60405180910390f35b61042560048036038101906104209190611ffe565b610cba565b005b60606003805461043690612239565b80601f016020809104026020016040519081016040528092919081815260200182805461046290612239565b80156104af5780601f10610484576101008083540402835291602001916104af565b820191906000526020600020905b81548152906001019060200180831161049257829003601f168201915b5050505050905090565b6000806104c4610db1565b90506104d1818585610db9565b600191505092915050565b6000600254905090565b6000806104f1610db1565b90506104fe858285610f82565b61050985858561100e565b60019150509392505050565b60006008905090565b600061052861128d565b905090565b600080610538610db1565b905061055981858561054a8589610c33565b6105549190612299565b610db9565b600191505092915050565b61056c610db1565b73ffffffffffffffffffffffffffffffffffffffff1661058a610831565b73ffffffffffffffffffffffffffffffffffffffff16146105e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d790612319565b60405180910390fd5b6105e86113a7565b565b6105f2610db1565b73ffffffffffffffffffffffffffffffffffffffff16610610610831565b73ffffffffffffffffffffffffffffffffffffffff1614610666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065d90612319565b60405180910390fd5b6106708282611449565b5050565b6000600560009054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6106db610db1565b73ffffffffffffffffffffffffffffffffffffffff166106f9610831565b73ffffffffffffffffffffffffffffffffffffffff161461074f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074690612319565b60405180910390fd5b61075960006115a8565b565b60006107a4600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061166e565b9050919050565b6107b3610db1565b73ffffffffffffffffffffffffffffffffffffffff166107d1610831565b73ffffffffffffffffffffffffffffffffffffffff1614610827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081e90612319565b60405180910390fd5b61082f61167c565b565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461086a90612239565b80601f016020809104026020016040519081016040528092919081815260200182805461089690612239565b80156108e35780601f106108b8576101008083540402835291602001916108e3565b820191906000526020600020905b8154815290600101906020018083116108c657829003601f168201915b5050505050905090565b6000806108f8610db1565b905060006109068286610c33565b90508381101561094b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610942906123ab565b60405180910390fd5b6109588286868403610db9565b60019250505092915050565b60008061096f610db1565b905061097c81858561100e565b600191505092915050565b61098f610db1565b73ffffffffffffffffffffffffffffffffffffffff166109ad610831565b73ffffffffffffffffffffffffffffffffffffffff1614610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa90612319565b60405180910390fd5b60007f28980585956f7cc3c66aa008d3deb2b80df7465aee92697387b443b7e602263d8686604051602001610a3a939291906123cb565b6040516020818303038152906040528051906020012090506000610a5d8261171f565b90506000610a6d82878787611739565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad49061244e565b60405180910390fd5b610ae78888611764565b5050505050505050565b83421115610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b906124ba565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610b638c61193a565b89604051602001610b79969594939291906124da565b6040516020818303038152906040528051906020012090506000610b9c8261171f565b90506000610bac82878787611739565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c139061244e565b60405180910390fd5b610c278a8a8a610db9565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610cc2610db1565b73ffffffffffffffffffffffffffffffffffffffff16610ce0610831565b73ffffffffffffffffffffffffffffffffffffffff1614610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90612319565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c906125ad565b60405180910390fd5b610dae816115a8565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f9061263f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e906126d1565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f759190611f25565b60405180910390a3505050565b6000610f8e8484610c33565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110085781811015610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff19061273d565b60405180910390fd5b6110078484848403610db9565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361107d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611074906127cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e390612861565b60405180910390fd5b6110f7838383611998565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561117d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611174906128f3565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112109190612299565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112749190611f25565b60405180910390a36112878484846119f0565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561130957507f000000000000000000000000000000000000000000000000000000000000000046145b15611336577f000000000000000000000000000000000000000000000000000000000000000090506113a4565b6113a17f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006119f5565b90505b90565b6113af610674565b6113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e59061295f565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611432610db1565b60405161143f919061203a565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af906129cb565b60405180910390fd5b6114c460008383611998565b80600260008282546114d69190612299565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461152b9190612299565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516115909190611f25565b60405180910390a36115a4600083836119f0565b5050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b611684610674565b156116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb90612a37565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611708610db1565b604051611715919061203a565b60405180910390a1565b600061173261172c61128d565b83611a2f565b9050919050565b600080600061174a87878787611a62565b9150915061175781611b6e565b8192505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90612ac9565b60405180910390fd5b6117df82600083611998565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90612b5b565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546118bc9190612b7b565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119219190611f25565b60405180910390a3611935836000846119f0565b505050565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506119878161166e565b915061199281611d3a565b50919050565b6119a0610674565b156119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790612a37565b60405180910390fd5b6119eb838383611d50565b505050565b505050565b60008383834630604051602001611a10959493929190612baf565b6040516020818303038152906040528051906020012090509392505050565b60008282604051602001611a44929190612c7a565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611a9d576000600391509150611b65565b601b8560ff1614158015611ab55750601c8560ff1614155b15611ac7576000600491509150611b65565b600060018787878760405160008152602001604052604051611aec9493929190612cb1565b6020604051602081039080840390855afa158015611b0e573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b5c57600060019250925050611b65565b80600092509250505b94509492505050565b60006004811115611b8257611b81612cf6565b5b816004811115611b9557611b94612cf6565b5b0315611d375760016004811115611baf57611bae612cf6565b5b816004811115611bc257611bc1612cf6565b5b03611c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf990612d71565b60405180910390fd5b60026004811115611c1657611c15612cf6565b5b816004811115611c2957611c28612cf6565b5b03611c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6090612ddd565b60405180910390fd5b60036004811115611c7d57611c7c612cf6565b5b816004811115611c9057611c8f612cf6565b5b03611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790612e6f565b60405180910390fd5b600480811115611ce357611ce2612cf6565b5b816004811115611cf657611cf5612cf6565b5b03611d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2d90612f01565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611d8f578082015181840152602081019050611d74565b60008484015250505050565b6000601f19601f8301169050919050565b6000611db782611d55565b611dc18185611d60565b9350611dd1818560208601611d71565b611dda81611d9b565b840191505092915050565b60006020820190508181036000830152611dff8184611dac565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e3782611e0c565b9050919050565b611e4781611e2c565b8114611e5257600080fd5b50565b600081359050611e6481611e3e565b92915050565b6000819050919050565b611e7d81611e6a565b8114611e8857600080fd5b50565b600081359050611e9a81611e74565b92915050565b60008060408385031215611eb757611eb6611e07565b5b6000611ec585828601611e55565b9250506020611ed685828601611e8b565b9150509250929050565b60008115159050919050565b611ef581611ee0565b82525050565b6000602082019050611f106000830184611eec565b92915050565b611f1f81611e6a565b82525050565b6000602082019050611f3a6000830184611f16565b92915050565b600080600060608486031215611f5957611f58611e07565b5b6000611f6786828701611e55565b9350506020611f7886828701611e55565b9250506040611f8986828701611e8b565b9150509250925092565b600060ff82169050919050565b611fa981611f93565b82525050565b6000602082019050611fc46000830184611fa0565b92915050565b6000819050919050565b611fdd81611fca565b82525050565b6000602082019050611ff86000830184611fd4565b92915050565b60006020828403121561201457612013611e07565b5b600061202284828501611e55565b91505092915050565b61203481611e2c565b82525050565b600060208201905061204f600083018461202b565b92915050565b61205e81611f93565b811461206957600080fd5b50565b60008135905061207b81612055565b92915050565b61208a81611fca565b811461209557600080fd5b50565b6000813590506120a781612081565b92915050565b600080600080600060a086880312156120c9576120c8611e07565b5b60006120d788828901611e55565b95505060206120e888828901611e8b565b94505060406120f98882890161206c565b935050606061210a88828901612098565b925050608061211b88828901612098565b9150509295509295909350565b600080600080600080600060e0888a03121561214757612146611e07565b5b60006121558a828b01611e55565b97505060206121668a828b01611e55565b96505060406121778a828b01611e8b565b95505060606121888a828b01611e8b565b94505060806121998a828b0161206c565b93505060a06121aa8a828b01612098565b92505060c06121bb8a828b01612098565b91505092959891949750929550565b600080604083850312156121e1576121e0611e07565b5b60006121ef85828601611e55565b925050602061220085828601611e55565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061225157607f821691505b6020821081036122645761226361220a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006122a482611e6a565b91506122af83611e6a565b92508282019050808211156122c7576122c661226a565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612303602083611d60565b915061230e826122cd565b602082019050919050565b60006020820190508181036000830152612332816122f6565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612395602583611d60565b91506123a082612339565b604082019050919050565b600060208201905081810360008301526123c481612388565b9050919050565b60006060820190506123e06000830186611fd4565b6123ed602083018561202b565b6123fa6040830184611f16565b949350505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612438601e83611d60565b915061244382612402565b602082019050919050565b600060208201905081810360008301526124678161242b565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b60006124a4601d83611d60565b91506124af8261246e565b602082019050919050565b600060208201905081810360008301526124d381612497565b9050919050565b600060c0820190506124ef6000830189611fd4565b6124fc602083018861202b565b612509604083018761202b565b6125166060830186611f16565b6125236080830185611f16565b61253060a0830184611f16565b979650505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612597602683611d60565b91506125a28261253b565b604082019050919050565b600060208201905081810360008301526125c68161258a565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612629602483611d60565b9150612634826125cd565b604082019050919050565b600060208201905081810360008301526126588161261c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006126bb602283611d60565b91506126c68261265f565b604082019050919050565b600060208201905081810360008301526126ea816126ae565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612727601d83611d60565b9150612732826126f1565b602082019050919050565b600060208201905081810360008301526127568161271a565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006127b9602583611d60565b91506127c48261275d565b604082019050919050565b600060208201905081810360008301526127e8816127ac565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061284b602383611d60565b9150612856826127ef565b604082019050919050565b6000602082019050818103600083015261287a8161283e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006128dd602683611d60565b91506128e882612881565b604082019050919050565b6000602082019050818103600083015261290c816128d0565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612949601483611d60565b915061295482612913565b602082019050919050565b600060208201905081810360008301526129788161293c565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006129b5601f83611d60565b91506129c08261297f565b602082019050919050565b600060208201905081810360008301526129e4816129a8565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612a21601083611d60565b9150612a2c826129eb565b602082019050919050565b60006020820190508181036000830152612a5081612a14565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ab3602183611d60565b9150612abe82612a57565b604082019050919050565b60006020820190508181036000830152612ae281612aa6565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b45602283611d60565b9150612b5082612ae9565b604082019050919050565b60006020820190508181036000830152612b7481612b38565b9050919050565b6000612b8682611e6a565b9150612b9183611e6a565b9250828203905081811115612ba957612ba861226a565b5b92915050565b600060a082019050612bc46000830188611fd4565b612bd16020830187611fd4565b612bde6040830186611fd4565b612beb6060830185611f16565b612bf8608083018461202b565b9695505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000612c43600283612c02565b9150612c4e82612c0d565b600282019050919050565b6000819050919050565b612c74612c6f82611fca565b612c59565b82525050565b6000612c8582612c36565b9150612c918285612c63565b602082019150612ca18284612c63565b6020820191508190509392505050565b6000608082019050612cc66000830187611fd4565b612cd36020830186611fa0565b612ce06040830185611fd4565b612ced6060830184611fd4565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612d5b601883611d60565b9150612d6682612d25565b602082019050919050565b60006020820190508181036000830152612d8a81612d4e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612dc7601f83611d60565b9150612dd282612d91565b602082019050919050565b60006020820190508181036000830152612df681612dba565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e59602283611d60565b9150612e6482612dfd565b604082019050919050565b60006020820190508181036000830152612e8881612e4c565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612eeb602283611d60565b9150612ef682612e8f565b604082019050919050565b60006020820190508181036000830152612f1a81612ede565b905091905056fea26469706673582212205dd51b62ecb0f381ecc6879907fe3516e6a113e21357d021f3ea8d64f4b5e7aa64736f6c63430008110033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063715018a6116100b8578063a457c2d71161007c578063a457c2d714610343578063a9059cbb14610373578063cd92086f146103a3578063d505accf146103bf578063dd62ed3e146103db578063f2fde38b1461040b57610142565b8063715018a6146102c35780637ecebe00146102cd5780638456cb59146102fd5780638da5cb5b1461030757806395d89b411461032557610142565b80633644e5151161010a5780633644e51514610201578063395093511461021f5780633f4ba83a1461024f57806340c10f19146102595780635c975abb1461027557806370a082311461029357610142565b806306fdde0314610147578063095ea7b31461016557806318160ddd1461019557806323b872dd146101b3578063313ce567146101e3575b600080fd5b61014f610427565b60405161015c9190611de5565b60405180910390f35b61017f600480360381019061017a9190611ea0565b6104b9565b60405161018c9190611efb565b60405180910390f35b61019d6104dc565b6040516101aa9190611f25565b60405180910390f35b6101cd60048036038101906101c89190611f40565b6104e6565b6040516101da9190611efb565b60405180910390f35b6101eb610515565b6040516101f89190611faf565b60405180910390f35b61020961051e565b6040516102169190611fe3565b60405180910390f35b61023960048036038101906102349190611ea0565b61052d565b6040516102469190611efb565b60405180910390f35b610257610564565b005b610273600480360381019061026e9190611ea0565b6105ea565b005b61027d610674565b60405161028a9190611efb565b60405180910390f35b6102ad60048036038101906102a89190611ffe565b61068b565b6040516102ba9190611f25565b60405180910390f35b6102cb6106d3565b005b6102e760048036038101906102e29190611ffe565b61075b565b6040516102f49190611f25565b60405180910390f35b6103056107ab565b005b61030f610831565b60405161031c919061203a565b60405180910390f35b61032d61085b565b60405161033a9190611de5565b60405180910390f35b61035d60048036038101906103589190611ea0565b6108ed565b60405161036a9190611efb565b60405180910390f35b61038d60048036038101906103889190611ea0565b610964565b60405161039a9190611efb565b60405180910390f35b6103bd60048036038101906103b891906120ad565b610987565b005b6103d960048036038101906103d49190612128565b610af1565b005b6103f560048036038101906103f091906121ca565b610c33565b6040516104029190611f25565b60405180910390f35b61042560048036038101906104209190611ffe565b610cba565b005b60606003805461043690612239565b80601f016020809104026020016040519081016040528092919081815260200182805461046290612239565b80156104af5780601f10610484576101008083540402835291602001916104af565b820191906000526020600020905b81548152906001019060200180831161049257829003601f168201915b5050505050905090565b6000806104c4610db1565b90506104d1818585610db9565b600191505092915050565b6000600254905090565b6000806104f1610db1565b90506104fe858285610f82565b61050985858561100e565b60019150509392505050565b60006008905090565b600061052861128d565b905090565b600080610538610db1565b905061055981858561054a8589610c33565b6105549190612299565b610db9565b600191505092915050565b61056c610db1565b73ffffffffffffffffffffffffffffffffffffffff1661058a610831565b73ffffffffffffffffffffffffffffffffffffffff16146105e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105d790612319565b60405180910390fd5b6105e86113a7565b565b6105f2610db1565b73ffffffffffffffffffffffffffffffffffffffff16610610610831565b73ffffffffffffffffffffffffffffffffffffffff1614610666576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065d90612319565b60405180910390fd5b6106708282611449565b5050565b6000600560009054906101000a900460ff16905090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6106db610db1565b73ffffffffffffffffffffffffffffffffffffffff166106f9610831565b73ffffffffffffffffffffffffffffffffffffffff161461074f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074690612319565b60405180910390fd5b61075960006115a8565b565b60006107a4600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061166e565b9050919050565b6107b3610db1565b73ffffffffffffffffffffffffffffffffffffffff166107d1610831565b73ffffffffffffffffffffffffffffffffffffffff1614610827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081e90612319565b60405180910390fd5b61082f61167c565b565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461086a90612239565b80601f016020809104026020016040519081016040528092919081815260200182805461089690612239565b80156108e35780601f106108b8576101008083540402835291602001916108e3565b820191906000526020600020905b8154815290600101906020018083116108c657829003601f168201915b5050505050905090565b6000806108f8610db1565b905060006109068286610c33565b90508381101561094b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610942906123ab565b60405180910390fd5b6109588286868403610db9565b60019250505092915050565b60008061096f610db1565b905061097c81858561100e565b600191505092915050565b61098f610db1565b73ffffffffffffffffffffffffffffffffffffffff166109ad610831565b73ffffffffffffffffffffffffffffffffffffffff1614610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa90612319565b60405180910390fd5b60007f28980585956f7cc3c66aa008d3deb2b80df7465aee92697387b443b7e602263d8686604051602001610a3a939291906123cb565b6040516020818303038152906040528051906020012090506000610a5d8261171f565b90506000610a6d82878787611739565b90508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610add576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad49061244e565b60405180910390fd5b610ae78888611764565b5050505050505050565b83421115610b34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2b906124ba565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610b638c61193a565b89604051602001610b79969594939291906124da565b6040516020818303038152906040528051906020012090506000610b9c8261171f565b90506000610bac82878787611739565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c139061244e565b60405180910390fd5b610c278a8a8a610db9565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610cc2610db1565b73ffffffffffffffffffffffffffffffffffffffff16610ce0610831565b73ffffffffffffffffffffffffffffffffffffffff1614610d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2d90612319565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c906125ad565b60405180910390fd5b610dae816115a8565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1f9061263f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8e906126d1565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610f759190611f25565b60405180910390a3505050565b6000610f8e8484610c33565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146110085781811015610ffa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff19061273d565b60405180910390fd5b6110078484848403610db9565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361107d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611074906127cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036110ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e390612861565b60405180910390fd5b6110f7838383611998565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561117d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611174906128f3565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112109190612299565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516112749190611f25565b60405180910390a36112878484846119f0565b50505050565b60007f0000000000000000000000008626264b6a1b4e920905efd381002aba52ea0eea73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561130957507f000000000000000000000000000000000000000000000000000000000000008946145b15611336577f86a81b3f4225bbf73a928c9adf70b2c70eafdb7ffb55d9e5f0dd39b93c81168a90506113a4565b6113a17f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fa9afdec156c499e7bb1982e4eb46a69d91c6c25a13d86fa3a7da46fc8c079da67fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66119f5565b90505b90565b6113af610674565b6113ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e59061295f565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611432610db1565b60405161143f919061203a565b60405180910390a1565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af906129cb565b60405180910390fd5b6114c460008383611998565b80600260008282546114d69190612299565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461152b9190612299565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516115909190611f25565b60405180910390a36115a4600083836119f0565b5050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b611684610674565b156116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb90612a37565b60405180910390fd5b6001600560006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611708610db1565b604051611715919061203a565b60405180910390a1565b600061173261172c61128d565b83611a2f565b9050919050565b600080600061174a87878787611a62565b9150915061175781611b6e565b8192505050949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ca90612ac9565b60405180910390fd5b6117df82600083611998565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c90612b5b565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546118bc9190612b7b565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516119219190611f25565b60405180910390a3611935836000846119f0565b505050565b600080600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506119878161166e565b915061199281611d3a565b50919050565b6119a0610674565b156119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d790612a37565b60405180910390fd5b6119eb838383611d50565b505050565b505050565b60008383834630604051602001611a10959493929190612baf565b6040516020818303038152906040528051906020012090509392505050565b60008282604051602001611a44929190612c7a565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115611a9d576000600391509150611b65565b601b8560ff1614158015611ab55750601c8560ff1614155b15611ac7576000600491509150611b65565b600060018787878760405160008152602001604052604051611aec9493929190612cb1565b6020604051602081039080840390855afa158015611b0e573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b5c57600060019250925050611b65565b80600092509250505b94509492505050565b60006004811115611b8257611b81612cf6565b5b816004811115611b9557611b94612cf6565b5b0315611d375760016004811115611baf57611bae612cf6565b5b816004811115611bc257611bc1612cf6565b5b03611c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf990612d71565b60405180910390fd5b60026004811115611c1657611c15612cf6565b5b816004811115611c2957611c28612cf6565b5b03611c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6090612ddd565b60405180910390fd5b60036004811115611c7d57611c7c612cf6565b5b816004811115611c9057611c8f612cf6565b5b03611cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc790612e6f565b60405180910390fd5b600480811115611ce357611ce2612cf6565b5b816004811115611cf657611cf5612cf6565b5b03611d36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2d90612f01565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611d8f578082015181840152602081019050611d74565b60008484015250505050565b6000601f19601f8301169050919050565b6000611db782611d55565b611dc18185611d60565b9350611dd1818560208601611d71565b611dda81611d9b565b840191505092915050565b60006020820190508181036000830152611dff8184611dac565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e3782611e0c565b9050919050565b611e4781611e2c565b8114611e5257600080fd5b50565b600081359050611e6481611e3e565b92915050565b6000819050919050565b611e7d81611e6a565b8114611e8857600080fd5b50565b600081359050611e9a81611e74565b92915050565b60008060408385031215611eb757611eb6611e07565b5b6000611ec585828601611e55565b9250506020611ed685828601611e8b565b9150509250929050565b60008115159050919050565b611ef581611ee0565b82525050565b6000602082019050611f106000830184611eec565b92915050565b611f1f81611e6a565b82525050565b6000602082019050611f3a6000830184611f16565b92915050565b600080600060608486031215611f5957611f58611e07565b5b6000611f6786828701611e55565b9350506020611f7886828701611e55565b9250506040611f8986828701611e8b565b9150509250925092565b600060ff82169050919050565b611fa981611f93565b82525050565b6000602082019050611fc46000830184611fa0565b92915050565b6000819050919050565b611fdd81611fca565b82525050565b6000602082019050611ff86000830184611fd4565b92915050565b60006020828403121561201457612013611e07565b5b600061202284828501611e55565b91505092915050565b61203481611e2c565b82525050565b600060208201905061204f600083018461202b565b92915050565b61205e81611f93565b811461206957600080fd5b50565b60008135905061207b81612055565b92915050565b61208a81611fca565b811461209557600080fd5b50565b6000813590506120a781612081565b92915050565b600080600080600060a086880312156120c9576120c8611e07565b5b60006120d788828901611e55565b95505060206120e888828901611e8b565b94505060406120f98882890161206c565b935050606061210a88828901612098565b925050608061211b88828901612098565b9150509295509295909350565b600080600080600080600060e0888a03121561214757612146611e07565b5b60006121558a828b01611e55565b97505060206121668a828b01611e55565b96505060406121778a828b01611e8b565b95505060606121888a828b01611e8b565b94505060806121998a828b0161206c565b93505060a06121aa8a828b01612098565b92505060c06121bb8a828b01612098565b91505092959891949750929550565b600080604083850312156121e1576121e0611e07565b5b60006121ef85828601611e55565b925050602061220085828601611e55565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061225157607f821691505b6020821081036122645761226361220a565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006122a482611e6a565b91506122af83611e6a565b92508282019050808211156122c7576122c661226a565b5b92915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612303602083611d60565b915061230e826122cd565b602082019050919050565b60006020820190508181036000830152612332816122f6565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612395602583611d60565b91506123a082612339565b604082019050919050565b600060208201905081810360008301526123c481612388565b9050919050565b60006060820190506123e06000830186611fd4565b6123ed602083018561202b565b6123fa6040830184611f16565b949350505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612438601e83611d60565b915061244382612402565b602082019050919050565b600060208201905081810360008301526124678161242b565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b60006124a4601d83611d60565b91506124af8261246e565b602082019050919050565b600060208201905081810360008301526124d381612497565b9050919050565b600060c0820190506124ef6000830189611fd4565b6124fc602083018861202b565b612509604083018761202b565b6125166060830186611f16565b6125236080830185611f16565b61253060a0830184611f16565b979650505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612597602683611d60565b91506125a28261253b565b604082019050919050565b600060208201905081810360008301526125c68161258a565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000612629602483611d60565b9150612634826125cd565b604082019050919050565b600060208201905081810360008301526126588161261c565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006126bb602283611d60565b91506126c68261265f565b604082019050919050565b600060208201905081810360008301526126ea816126ae565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000612727601d83611d60565b9150612732826126f1565b602082019050919050565b600060208201905081810360008301526127568161271a565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006127b9602583611d60565b91506127c48261275d565b604082019050919050565b600060208201905081810360008301526127e8816127ac565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061284b602383611d60565b9150612856826127ef565b604082019050919050565b6000602082019050818103600083015261287a8161283e565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006128dd602683611d60565b91506128e882612881565b604082019050919050565b6000602082019050818103600083015261290c816128d0565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612949601483611d60565b915061295482612913565b602082019050919050565b600060208201905081810360008301526129788161293c565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006129b5601f83611d60565b91506129c08261297f565b602082019050919050565b600060208201905081810360008301526129e4816129a8565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612a21601083611d60565b9150612a2c826129eb565b602082019050919050565b60006020820190508181036000830152612a5081612a14565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ab3602183611d60565b9150612abe82612a57565b604082019050919050565b60006020820190508181036000830152612ae281612aa6565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612b45602283611d60565b9150612b5082612ae9565b604082019050919050565b60006020820190508181036000830152612b7481612b38565b9050919050565b6000612b8682611e6a565b9150612b9183611e6a565b9250828203905081811115612ba957612ba861226a565b5b92915050565b600060a082019050612bc46000830188611fd4565b612bd16020830187611fd4565b612bde6040830186611fd4565b612beb6060830185611f16565b612bf8608083018461202b565b9695505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b6000612c43600283612c02565b9150612c4e82612c0d565b600282019050919050565b6000819050919050565b612c74612c6f82611fca565b612c59565b82525050565b6000612c8582612c36565b9150612c918285612c63565b602082019150612ca18284612c63565b6020820191508190509392505050565b6000608082019050612cc66000830187611fd4565b612cd36020830186611fa0565b612ce06040830185611fd4565b612ced6060830184611fd4565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b6000612d5b601883611d60565b9150612d6682612d25565b602082019050919050565b60006020820190508181036000830152612d8a81612d4e565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b6000612dc7601f83611d60565b9150612dd282612d91565b602082019050919050565b60006020820190508181036000830152612df681612dba565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612e59602283611d60565b9150612e6482612dfd565b604082019050919050565b60006020820190508181036000830152612e8881612e4c565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b6000612eeb602283611d60565b9150612ef682612e8f565b604082019050919050565b60006020820190508181036000830152612f1a81612ede565b905091905056fea26469706673582212205dd51b62ecb0f381ecc6879907fe3516e6a113e21357d021f3ea8d64f4b5e7aa64736f6c63430008110033

Deployed Bytecode Sourcemap

45684:1194:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31501:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33852:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32621:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34633:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45932:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45101:115;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35337:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46101:65;;;:::i;:::-;;46174:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24597:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32792:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22662:103;;;:::i;:::-;;44843:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46032:61;;;:::i;:::-;;22011:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31720:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36078:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33125:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46484:391;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44132:645;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33381:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22920:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31501:100;31555:13;31588:5;31581:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31501:100;:::o;33852:201::-;33935:4;33952:13;33968:12;:10;:12::i;:::-;33952:28;;33991:32;34000:5;34007:7;34016:6;33991:8;:32::i;:::-;34041:4;34034:11;;;33852:201;;;;:::o;32621:108::-;32682:7;32709:12;;32702:19;;32621:108;:::o;34633:295::-;34764:4;34781:15;34799:12;:10;:12::i;:::-;34781:30;;34822:38;34838:4;34844:7;34853:6;34822:15;:38::i;:::-;34871:27;34881:4;34887:2;34891:6;34871:9;:27::i;:::-;34916:4;34909:11;;;34633:295;;;;;:::o;45932:92::-;45990:5;46015:1;46008:8;;45932:92;:::o;45101:115::-;45161:7;45188:20;:18;:20::i;:::-;45181:27;;45101:115;:::o;35337:238::-;35425:4;35442:13;35458:12;:10;:12::i;:::-;35442:28;;35481:64;35490:5;35497:7;35534:10;35506:25;35516:5;35523:7;35506:9;:25::i;:::-;:38;;;;:::i;:::-;35481:8;:64::i;:::-;35563:4;35556:11;;;35337:238;;;;:::o;46101:65::-;22242:12;:10;:12::i;:::-;22231:23;;:7;:5;:7::i;:::-;:23;;;22223:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46148:10:::1;:8;:10::i;:::-;46101:65::o:0;46174:95::-;22242:12;:10;:12::i;:::-;22231:23;;:7;:5;:7::i;:::-;:23;;;22223:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46244:17:::1;46250:2;46254:6;46244:5;:17::i;:::-;46174:95:::0;;:::o;24597:86::-;24644:4;24668:7;;;;;;;;;;;24661:14;;24597:86;:::o;32792:127::-;32866:7;32893:9;:18;32903:7;32893:18;;;;;;;;;;;;;;;;32886:25;;32792:127;;;:::o;22662:103::-;22242:12;:10;:12::i;:::-;22231:23;;:7;:5;:7::i;:::-;:23;;;22223:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22727:30:::1;22754:1;22727:18;:30::i;:::-;22662:103::o:0;44843:128::-;44912:7;44939:24;:7;:14;44947:5;44939:14;;;;;;;;;;;;;;;:22;:24::i;:::-;44932:31;;44843:128;;;:::o;46032:61::-;22242:12;:10;:12::i;:::-;22231:23;;:7;:5;:7::i;:::-;:23;;;22223:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46077:8:::1;:6;:8::i;:::-;46032:61::o:0;22011:87::-;22057:7;22084:6;;;;;;;;;;;22077:13;;22011:87;:::o;31720:104::-;31776:13;31809:7;31802:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31720:104;:::o;36078:436::-;36171:4;36188:13;36204:12;:10;:12::i;:::-;36188:28;;36227:24;36254:25;36264:5;36271:7;36254:9;:25::i;:::-;36227:52;;36318:15;36298:16;:35;;36290:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36411:60;36420:5;36427:7;36455:15;36436:16;:34;36411:8;:60::i;:::-;36502:4;36495:11;;;;36078:436;;;;:::o;33125:193::-;33204:4;33221:13;33237:12;:10;:12::i;:::-;33221:28;;33260;33270:5;33277:2;33281:6;33260:9;:28::i;:::-;33306:4;33299:11;;;33125:193;;;;:::o;46484:391::-;22242:12;:10;:12::i;:::-;22231:23;;:7;:5;:7::i;:::-;:23;;;22223:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46588:16:::1;45801:48;46644:5;46651:6;46617:41;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46607:52;;;;;;46588:71;;46670:12;46685:26;46702:8;46685:16;:26::i;:::-;46670:41;;46722:14;46739:28;46753:4;46759:1;46762;46765;46739:13;:28::i;:::-;46722:45;;46796:5;46786:15;;:6;:15;;;46778:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;46847:20;46853:5;46860:6;46847:5;:20::i;:::-;46577:298;;;46484:391:::0;;;;;:::o;44132:645::-;44376:8;44357:15;:27;;44349:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44431:18;43307:95;44491:5;44498:7;44507:5;44514:16;44524:5;44514:9;:16::i;:::-;44532:8;44462:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44452:90;;;;;;44431:111;;44555:12;44570:28;44587:10;44570:16;:28::i;:::-;44555:43;;44611:14;44628:28;44642:4;44648:1;44651;44654;44628:13;:28::i;:::-;44611:45;;44685:5;44675:15;;:6;:15;;;44667:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44738:31;44747:5;44754:7;44763:5;44738:8;:31::i;:::-;44338:439;;;44132:645;;;;;;;:::o;33381:151::-;33470:7;33497:11;:18;33509:5;33497:18;;;;;;;;;;;;;;;:27;33516:7;33497:27;;;;;;;;;;;;;;;;33490:34;;33381:151;;;;:::o;22920:201::-;22242:12;:10;:12::i;:::-;22231:23;;:7;:5;:7::i;:::-;:23;;;22223:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;23029:1:::1;23009:22;;:8;:22;;::::0;23001:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;23085:28;23104:8;23085:18;:28::i;:::-;22920:201:::0;:::o;20749:98::-;20802:7;20829:10;20822:17;;20749:98;:::o;39712:380::-;39865:1;39848:19;;:5;:19;;;39840:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39946:1;39927:21;;:7;:21;;;39919:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40030:6;40000:11;:18;40012:5;40000:18;;;;;;;;;;;;;;;:27;40019:7;40000:27;;;;;;;;;;;;;;;:36;;;;40068:7;40052:32;;40061:5;40052:32;;;40077:6;40052:32;;;;;;:::i;:::-;;;;;;;;39712:380;;;:::o;40383:453::-;40518:24;40545:25;40555:5;40562:7;40545:9;:25::i;:::-;40518:52;;40605:17;40585:16;:37;40581:248;;40667:6;40647:16;:26;;40639:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40751:51;40760:5;40767:7;40795:6;40776:16;:25;40751:8;:51::i;:::-;40581:248;40507:329;40383:453;;;:::o;36993:671::-;37140:1;37124:18;;:4;:18;;;37116:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37217:1;37203:16;;:2;:16;;;37195:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;37272:38;37293:4;37299:2;37303:6;37272:20;:38::i;:::-;37323:19;37345:9;:15;37355:4;37345:15;;;;;;;;;;;;;;;;37323:37;;37394:6;37379:11;:21;;37371:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;37511:6;37497:11;:20;37479:9;:15;37489:4;37479:15;;;;;;;;;;;;;;;:38;;;;37556:6;37539:9;:13;37549:2;37539:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;37595:2;37580:26;;37589:4;37580:26;;;37599:6;37580:26;;;;;;:::i;:::-;;;;;;;;37619:37;37639:4;37645:2;37649:6;37619:19;:37::i;:::-;37105:559;36993:671;;;:::o;16332:314::-;16385:7;16426:12;16409:29;;16417:4;16409:29;;;:66;;;;;16459:16;16442:13;:33;16409:66;16405:234;;;16499:24;16492:31;;;;16405:234;16563:64;16585:10;16597:12;16611:15;16563:21;:64::i;:::-;16556:71;;16332:314;;:::o;25656:120::-;25200:8;:6;:8::i;:::-;25192:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;25725:5:::1;25715:7;;:15;;;;;;;;;;;;;;;;;;25746:22;25755:12;:10;:12::i;:::-;25746:22;;;;;;:::i;:::-;;;;;;;;25656:120::o:0;37951:399::-;38054:1;38035:21;;:7;:21;;;38027:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38105:49;38134:1;38138:7;38147:6;38105:20;:49::i;:::-;38183:6;38167:12;;:22;;;;;;;:::i;:::-;;;;;;;;38222:6;38200:9;:18;38210:7;38200:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;38265:7;38244:37;;38261:1;38244:37;;;38274:6;38244:37;;;;;;:::i;:::-;;;;;;;;38294:48;38322:1;38326:7;38335:6;38294:19;:48::i;:::-;37951:399;;:::o;23281:191::-;23355:16;23374:6;;;;;;;;;;;23355:25;;23400:8;23391:6;;:17;;;;;;;;;;;;;;;;;;23455:8;23424:40;;23445:8;23424:40;;;;;;;;;;;;23344:128;23281:191;:::o;893:114::-;958:7;985;:14;;;978:21;;893:114;;;:::o;25397:118::-;24923:8;:6;:8::i;:::-;24922:9;24914:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;25467:4:::1;25457:7;;:14;;;;;;;;;;;;;;;;;;25487:20;25494:12;:10;:12::i;:::-;25487:20;;;;;;:::i;:::-;;;;;;;;25397:118::o:0;17559:167::-;17636:7;17663:55;17685:20;:18;:20::i;:::-;17707:10;17663:21;:55::i;:::-;17656:62;;17559:167;;;:::o;11222:279::-;11350:7;11371:17;11390:18;11412:25;11423:4;11429:1;11432;11435;11412:10;:25::i;:::-;11370:67;;;;11448:18;11460:5;11448:11;:18::i;:::-;11484:9;11477:16;;;;11222:279;;;;;;:::o;38683:591::-;38786:1;38767:21;;:7;:21;;;38759:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38839:49;38860:7;38877:1;38881:6;38839:20;:49::i;:::-;38901:22;38926:9;:18;38936:7;38926:18;;;;;;;;;;;;;;;;38901:43;;38981:6;38963:14;:24;;38955:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;39100:6;39083:14;:23;39062:9;:18;39072:7;39062:18;;;;;;;;;;;;;;;:44;;;;39144:6;39128:12;;:22;;;;;;;:::i;:::-;;;;;;;;39194:1;39168:37;;39177:7;39168:37;;;39198:6;39168:37;;;;;;:::i;:::-;;;;;;;;39218:48;39238:7;39255:1;39259:6;39218:19;:48::i;:::-;38748:526;38683:591;;:::o;45354:207::-;45414:15;45442:30;45475:7;:14;45483:5;45475:14;;;;;;;;;;;;;;;45442:47;;45510:15;:5;:13;:15::i;:::-;45500:25;;45536:17;:5;:15;:17::i;:::-;45431:130;45354:207;;;:::o;46277:199::-;24923:8;:6;:8::i;:::-;24922:9;24914:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;46424:44:::1;46451:4;46457:2;46461:6;46424:26;:44::i;:::-;46277:199:::0;;;:::o;42165:124::-;;;;:::o;16654:263::-;16798:7;16846:8;16856;16866:11;16879:13;16902:4;16835:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16825:84;;;;;;16818:91;;16654:263;;;;;:::o;12913:196::-;13006:7;13072:15;13089:10;13043:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13033:68;;;;;;13026:75;;12913:196;;;;:::o;9451:1632::-;9582:7;9591:12;10516:66;10511:1;10503:10;;:79;10499:163;;;10615:1;10619:30;10599:51;;;;;;10499:163;10681:2;10676:1;:7;;;;:18;;;;;10692:2;10687:1;:7;;;;10676:18;10672:102;;;10727:1;10731:30;10711:51;;;;;;10672:102;10871:14;10888:24;10898:4;10904:1;10907;10910;10888:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10871:41;;10945:1;10927:20;;:6;:20;;;10923:103;;10980:1;10984:29;10964:50;;;;;;;10923:103;11046:6;11054:20;11038:37;;;;;9451:1632;;;;;;;;:::o;4160:643::-;4238:20;4229:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;4225:571;4275:7;4225:571;4336:29;4327:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;4323:473;;4382:34;;;;;;;;;;:::i;:::-;;;;;;;;4323:473;4447:35;4438:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;4434:362;;4499:41;;;;;;;;;;:::i;:::-;;;;;;;;4434:362;4571:30;4562:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;4558:238;;4618:44;;;;;;;;;;:::i;:::-;;;;;;;;4558:238;4693:30;4684:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;4680:116;;4740:44;;;;;;;;;;:::i;:::-;;;;;;;;4680:116;4160:643;;:::o;1015:127::-;1122:1;1104:7;:14;;;:19;;;;;;;;;;;1015:127;:::o;41436:125::-;;;;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:619::-;3875:6;3883;3891;3940:2;3928:9;3919:7;3915:23;3911:32;3908:119;;;3946:79;;:::i;:::-;3908:119;4066:1;4091:53;4136:7;4127:6;4116:9;4112:22;4091:53;:::i;:::-;4081:63;;4037:117;4193:2;4219:53;4264:7;4255:6;4244:9;4240:22;4219:53;:::i;:::-;4209:63;;4164:118;4321:2;4347:53;4392:7;4383:6;4372:9;4368:22;4347:53;:::i;:::-;4337:63;;4292:118;3798:619;;;;;:::o;4423:86::-;4458:7;4498:4;4491:5;4487:16;4476:27;;4423:86;;;:::o;4515:112::-;4598:22;4614:5;4598:22;:::i;:::-;4593:3;4586:35;4515:112;;:::o;4633:214::-;4722:4;4760:2;4749:9;4745:18;4737:26;;4773:67;4837:1;4826:9;4822:17;4813:6;4773:67;:::i;:::-;4633:214;;;;:::o;4853:77::-;4890:7;4919:5;4908:16;;4853:77;;;:::o;4936:118::-;5023:24;5041:5;5023:24;:::i;:::-;5018:3;5011:37;4936:118;;:::o;5060:222::-;5153:4;5191:2;5180:9;5176:18;5168:26;;5204:71;5272:1;5261:9;5257:17;5248:6;5204:71;:::i;:::-;5060:222;;;;:::o;5288:329::-;5347:6;5396:2;5384:9;5375:7;5371:23;5367:32;5364:119;;;5402:79;;:::i;:::-;5364:119;5522:1;5547:53;5592:7;5583:6;5572:9;5568:22;5547:53;:::i;:::-;5537:63;;5493:117;5288:329;;;;:::o;5623:118::-;5710:24;5728:5;5710:24;:::i;:::-;5705:3;5698:37;5623:118;;:::o;5747:222::-;5840:4;5878:2;5867:9;5863:18;5855:26;;5891:71;5959:1;5948:9;5944:17;5935:6;5891:71;:::i;:::-;5747:222;;;;:::o;5975:118::-;6046:22;6062:5;6046:22;:::i;:::-;6039:5;6036:33;6026:61;;6083:1;6080;6073:12;6026:61;5975:118;:::o;6099:135::-;6143:5;6181:6;6168:20;6159:29;;6197:31;6222:5;6197:31;:::i;:::-;6099:135;;;;:::o;6240:122::-;6313:24;6331:5;6313:24;:::i;:::-;6306:5;6303:35;6293:63;;6352:1;6349;6342:12;6293:63;6240:122;:::o;6368:139::-;6414:5;6452:6;6439:20;6430:29;;6468:33;6495:5;6468:33;:::i;:::-;6368:139;;;;:::o;6513:907::-;6606:6;6614;6622;6630;6638;6687:3;6675:9;6666:7;6662:23;6658:33;6655:120;;;6694:79;;:::i;:::-;6655:120;6814:1;6839:53;6884:7;6875:6;6864:9;6860:22;6839:53;:::i;:::-;6829:63;;6785:117;6941:2;6967:53;7012:7;7003:6;6992:9;6988:22;6967:53;:::i;:::-;6957:63;;6912:118;7069:2;7095:51;7138:7;7129:6;7118:9;7114:22;7095:51;:::i;:::-;7085:61;;7040:116;7195:2;7221:53;7266:7;7257:6;7246:9;7242:22;7221:53;:::i;:::-;7211:63;;7166:118;7323:3;7350:53;7395:7;7386:6;7375:9;7371:22;7350:53;:::i;:::-;7340:63;;7294:119;6513:907;;;;;;;;:::o;7426:1199::-;7537:6;7545;7553;7561;7569;7577;7585;7634:3;7622:9;7613:7;7609:23;7605:33;7602:120;;;7641:79;;:::i;:::-;7602:120;7761:1;7786:53;7831:7;7822:6;7811:9;7807:22;7786:53;:::i;:::-;7776:63;;7732:117;7888:2;7914:53;7959:7;7950:6;7939:9;7935:22;7914:53;:::i;:::-;7904:63;;7859:118;8016:2;8042:53;8087:7;8078:6;8067:9;8063:22;8042:53;:::i;:::-;8032:63;;7987:118;8144:2;8170:53;8215:7;8206:6;8195:9;8191:22;8170:53;:::i;:::-;8160:63;;8115:118;8272:3;8299:51;8342:7;8333:6;8322:9;8318:22;8299:51;:::i;:::-;8289:61;;8243:117;8399:3;8426:53;8471:7;8462:6;8451:9;8447:22;8426:53;:::i;:::-;8416:63;;8370:119;8528:3;8555:53;8600:7;8591:6;8580:9;8576:22;8555:53;:::i;:::-;8545:63;;8499:119;7426:1199;;;;;;;;;;:::o;8631:474::-;8699:6;8707;8756:2;8744:9;8735:7;8731:23;8727:32;8724:119;;;8762:79;;:::i;:::-;8724:119;8882:1;8907:53;8952:7;8943:6;8932:9;8928:22;8907:53;:::i;:::-;8897:63;;8853:117;9009:2;9035:53;9080:7;9071:6;9060:9;9056:22;9035:53;:::i;:::-;9025:63;;8980:118;8631:474;;;;;:::o;9111:180::-;9159:77;9156:1;9149:88;9256:4;9253:1;9246:15;9280:4;9277:1;9270:15;9297:320;9341:6;9378:1;9372:4;9368:12;9358:22;;9425:1;9419:4;9415:12;9446:18;9436:81;;9502:4;9494:6;9490:17;9480:27;;9436:81;9564:2;9556:6;9553:14;9533:18;9530:38;9527:84;;9583:18;;:::i;:::-;9527:84;9348:269;9297:320;;;:::o;9623:180::-;9671:77;9668:1;9661:88;9768:4;9765:1;9758:15;9792:4;9789:1;9782:15;9809:191;9849:3;9868:20;9886:1;9868:20;:::i;:::-;9863:25;;9902:20;9920:1;9902:20;:::i;:::-;9897:25;;9945:1;9942;9938:9;9931:16;;9966:3;9963:1;9960:10;9957:36;;;9973:18;;:::i;:::-;9957:36;9809:191;;;;:::o;10006:182::-;10146:34;10142:1;10134:6;10130:14;10123:58;10006:182;:::o;10194:366::-;10336:3;10357:67;10421:2;10416:3;10357:67;:::i;:::-;10350:74;;10433:93;10522:3;10433:93;:::i;:::-;10551:2;10546:3;10542:12;10535:19;;10194:366;;;:::o;10566:419::-;10732:4;10770:2;10759:9;10755:18;10747:26;;10819:9;10813:4;10809:20;10805:1;10794:9;10790:17;10783:47;10847:131;10973:4;10847:131;:::i;:::-;10839:139;;10566:419;;;:::o;10991:224::-;11131:34;11127:1;11119:6;11115:14;11108:58;11200:7;11195:2;11187:6;11183:15;11176:32;10991:224;:::o;11221:366::-;11363:3;11384:67;11448:2;11443:3;11384:67;:::i;:::-;11377:74;;11460:93;11549:3;11460:93;:::i;:::-;11578:2;11573:3;11569:12;11562:19;;11221:366;;;:::o;11593:419::-;11759:4;11797:2;11786:9;11782:18;11774:26;;11846:9;11840:4;11836:20;11832:1;11821:9;11817:17;11810:47;11874:131;12000:4;11874:131;:::i;:::-;11866:139;;11593:419;;;:::o;12018:442::-;12167:4;12205:2;12194:9;12190:18;12182:26;;12218:71;12286:1;12275:9;12271:17;12262:6;12218:71;:::i;:::-;12299:72;12367:2;12356:9;12352:18;12343:6;12299:72;:::i;:::-;12381;12449:2;12438:9;12434:18;12425:6;12381:72;:::i;:::-;12018:442;;;;;;:::o;12466:180::-;12606:32;12602:1;12594:6;12590:14;12583:56;12466:180;:::o;12652:366::-;12794:3;12815:67;12879:2;12874:3;12815:67;:::i;:::-;12808:74;;12891:93;12980:3;12891:93;:::i;:::-;13009:2;13004:3;13000:12;12993:19;;12652:366;;;:::o;13024:419::-;13190:4;13228:2;13217:9;13213:18;13205:26;;13277:9;13271:4;13267:20;13263:1;13252:9;13248:17;13241:47;13305:131;13431:4;13305:131;:::i;:::-;13297:139;;13024:419;;;:::o;13449:179::-;13589:31;13585:1;13577:6;13573:14;13566:55;13449:179;:::o;13634:366::-;13776:3;13797:67;13861:2;13856:3;13797:67;:::i;:::-;13790:74;;13873:93;13962:3;13873:93;:::i;:::-;13991:2;13986:3;13982:12;13975:19;;13634:366;;;:::o;14006:419::-;14172:4;14210:2;14199:9;14195:18;14187:26;;14259:9;14253:4;14249:20;14245:1;14234:9;14230:17;14223:47;14287:131;14413:4;14287:131;:::i;:::-;14279:139;;14006:419;;;:::o;14431:775::-;14664:4;14702:3;14691:9;14687:19;14679:27;;14716:71;14784:1;14773:9;14769:17;14760:6;14716:71;:::i;:::-;14797:72;14865:2;14854:9;14850:18;14841:6;14797:72;:::i;:::-;14879;14947:2;14936:9;14932:18;14923:6;14879:72;:::i;:::-;14961;15029:2;15018:9;15014:18;15005:6;14961:72;:::i;:::-;15043:73;15111:3;15100:9;15096:19;15087:6;15043:73;:::i;:::-;15126;15194:3;15183:9;15179:19;15170:6;15126:73;:::i;:::-;14431:775;;;;;;;;;:::o;15212:225::-;15352:34;15348:1;15340:6;15336:14;15329:58;15421:8;15416:2;15408:6;15404:15;15397:33;15212:225;:::o;15443:366::-;15585:3;15606:67;15670:2;15665:3;15606:67;:::i;:::-;15599:74;;15682:93;15771:3;15682:93;:::i;:::-;15800:2;15795:3;15791:12;15784:19;;15443:366;;;:::o;15815:419::-;15981:4;16019:2;16008:9;16004:18;15996:26;;16068:9;16062:4;16058:20;16054:1;16043:9;16039:17;16032:47;16096:131;16222:4;16096:131;:::i;:::-;16088:139;;15815:419;;;:::o;16240:223::-;16380:34;16376:1;16368:6;16364:14;16357:58;16449:6;16444:2;16436:6;16432:15;16425:31;16240:223;:::o;16469:366::-;16611:3;16632:67;16696:2;16691:3;16632:67;:::i;:::-;16625:74;;16708:93;16797:3;16708:93;:::i;:::-;16826:2;16821:3;16817:12;16810:19;;16469:366;;;:::o;16841:419::-;17007:4;17045:2;17034:9;17030:18;17022:26;;17094:9;17088:4;17084:20;17080:1;17069:9;17065:17;17058:47;17122:131;17248:4;17122:131;:::i;:::-;17114:139;;16841:419;;;:::o;17266:221::-;17406:34;17402:1;17394:6;17390:14;17383:58;17475:4;17470:2;17462:6;17458:15;17451:29;17266:221;:::o;17493:366::-;17635:3;17656:67;17720:2;17715:3;17656:67;:::i;:::-;17649:74;;17732:93;17821:3;17732:93;:::i;:::-;17850:2;17845:3;17841:12;17834:19;;17493:366;;;:::o;17865:419::-;18031:4;18069:2;18058:9;18054:18;18046:26;;18118:9;18112:4;18108:20;18104:1;18093:9;18089:17;18082:47;18146:131;18272:4;18146:131;:::i;:::-;18138:139;;17865:419;;;:::o;18290:179::-;18430:31;18426:1;18418:6;18414:14;18407:55;18290:179;:::o;18475:366::-;18617:3;18638:67;18702:2;18697:3;18638:67;:::i;:::-;18631:74;;18714:93;18803:3;18714:93;:::i;:::-;18832:2;18827:3;18823:12;18816:19;;18475:366;;;:::o;18847:419::-;19013:4;19051:2;19040:9;19036:18;19028:26;;19100:9;19094:4;19090:20;19086:1;19075:9;19071:17;19064:47;19128:131;19254:4;19128:131;:::i;:::-;19120:139;;18847:419;;;:::o;19272:224::-;19412:34;19408:1;19400:6;19396:14;19389:58;19481:7;19476:2;19468:6;19464:15;19457:32;19272:224;:::o;19502:366::-;19644:3;19665:67;19729:2;19724:3;19665:67;:::i;:::-;19658:74;;19741:93;19830:3;19741:93;:::i;:::-;19859:2;19854:3;19850:12;19843:19;;19502:366;;;:::o;19874:419::-;20040:4;20078:2;20067:9;20063:18;20055:26;;20127:9;20121:4;20117:20;20113:1;20102:9;20098:17;20091:47;20155:131;20281:4;20155:131;:::i;:::-;20147:139;;19874:419;;;:::o;20299:222::-;20439:34;20435:1;20427:6;20423:14;20416:58;20508:5;20503:2;20495:6;20491:15;20484:30;20299:222;:::o;20527:366::-;20669:3;20690:67;20754:2;20749:3;20690:67;:::i;:::-;20683:74;;20766:93;20855:3;20766:93;:::i;:::-;20884:2;20879:3;20875:12;20868:19;;20527:366;;;:::o;20899:419::-;21065:4;21103:2;21092:9;21088:18;21080:26;;21152:9;21146:4;21142:20;21138:1;21127:9;21123:17;21116:47;21180:131;21306:4;21180:131;:::i;:::-;21172:139;;20899:419;;;:::o;21324:225::-;21464:34;21460:1;21452:6;21448:14;21441:58;21533:8;21528:2;21520:6;21516:15;21509:33;21324:225;:::o;21555:366::-;21697:3;21718:67;21782:2;21777:3;21718:67;:::i;:::-;21711:74;;21794:93;21883:3;21794:93;:::i;:::-;21912:2;21907:3;21903:12;21896:19;;21555:366;;;:::o;21927:419::-;22093:4;22131:2;22120:9;22116:18;22108:26;;22180:9;22174:4;22170:20;22166:1;22155:9;22151:17;22144:47;22208:131;22334:4;22208:131;:::i;:::-;22200:139;;21927:419;;;:::o;22352:170::-;22492:22;22488:1;22480:6;22476:14;22469:46;22352:170;:::o;22528:366::-;22670:3;22691:67;22755:2;22750:3;22691:67;:::i;:::-;22684:74;;22767:93;22856:3;22767:93;:::i;:::-;22885:2;22880:3;22876:12;22869:19;;22528:366;;;:::o;22900:419::-;23066:4;23104:2;23093:9;23089:18;23081:26;;23153:9;23147:4;23143:20;23139:1;23128:9;23124:17;23117:47;23181:131;23307:4;23181:131;:::i;:::-;23173:139;;22900:419;;;:::o;23325:181::-;23465:33;23461:1;23453:6;23449:14;23442:57;23325:181;:::o;23512:366::-;23654:3;23675:67;23739:2;23734:3;23675:67;:::i;:::-;23668:74;;23751:93;23840:3;23751:93;:::i;:::-;23869:2;23864:3;23860:12;23853:19;;23512:366;;;:::o;23884:419::-;24050:4;24088:2;24077:9;24073:18;24065:26;;24137:9;24131:4;24127:20;24123:1;24112:9;24108:17;24101:47;24165:131;24291:4;24165:131;:::i;:::-;24157:139;;23884:419;;;:::o;24309:166::-;24449:18;24445:1;24437:6;24433:14;24426:42;24309:166;:::o;24481:366::-;24623:3;24644:67;24708:2;24703:3;24644:67;:::i;:::-;24637:74;;24720:93;24809:3;24720:93;:::i;:::-;24838:2;24833:3;24829:12;24822:19;;24481:366;;;:::o;24853:419::-;25019:4;25057:2;25046:9;25042:18;25034:26;;25106:9;25100:4;25096:20;25092:1;25081:9;25077:17;25070:47;25134:131;25260:4;25134:131;:::i;:::-;25126:139;;24853:419;;;:::o;25278:220::-;25418:34;25414:1;25406:6;25402:14;25395:58;25487:3;25482:2;25474:6;25470:15;25463:28;25278:220;:::o;25504:366::-;25646:3;25667:67;25731:2;25726:3;25667:67;:::i;:::-;25660:74;;25743:93;25832:3;25743:93;:::i;:::-;25861:2;25856:3;25852:12;25845:19;;25504:366;;;:::o;25876:419::-;26042:4;26080:2;26069:9;26065:18;26057:26;;26129:9;26123:4;26119:20;26115:1;26104:9;26100:17;26093:47;26157:131;26283:4;26157:131;:::i;:::-;26149:139;;25876:419;;;:::o;26301:221::-;26441:34;26437:1;26429:6;26425:14;26418:58;26510:4;26505:2;26497:6;26493:15;26486:29;26301:221;:::o;26528:366::-;26670:3;26691:67;26755:2;26750:3;26691:67;:::i;:::-;26684:74;;26767:93;26856:3;26767:93;:::i;:::-;26885:2;26880:3;26876:12;26869:19;;26528:366;;;:::o;26900:419::-;27066:4;27104:2;27093:9;27089:18;27081:26;;27153:9;27147:4;27143:20;27139:1;27128:9;27124:17;27117:47;27181:131;27307:4;27181:131;:::i;:::-;27173:139;;26900:419;;;:::o;27325:194::-;27365:4;27385:20;27403:1;27385:20;:::i;:::-;27380:25;;27419:20;27437:1;27419:20;:::i;:::-;27414:25;;27463:1;27460;27456:9;27448:17;;27487:1;27481:4;27478:11;27475:37;;;27492:18;;:::i;:::-;27475:37;27325:194;;;;:::o;27525:664::-;27730:4;27768:3;27757:9;27753:19;27745:27;;27782:71;27850:1;27839:9;27835:17;27826:6;27782:71;:::i;:::-;27863:72;27931:2;27920:9;27916:18;27907:6;27863:72;:::i;:::-;27945;28013:2;28002:9;27998:18;27989:6;27945:72;:::i;:::-;28027;28095:2;28084:9;28080:18;28071:6;28027:72;:::i;:::-;28109:73;28177:3;28166:9;28162:19;28153:6;28109:73;:::i;:::-;27525:664;;;;;;;;:::o;28195:148::-;28297:11;28334:3;28319:18;;28195:148;;;;:::o;28349:214::-;28489:66;28485:1;28477:6;28473:14;28466:90;28349:214;:::o;28569:400::-;28729:3;28750:84;28832:1;28827:3;28750:84;:::i;:::-;28743:91;;28843:93;28932:3;28843:93;:::i;:::-;28961:1;28956:3;28952:11;28945:18;;28569:400;;;:::o;28975:79::-;29014:7;29043:5;29032:16;;28975:79;;;:::o;29060:157::-;29165:45;29185:24;29203:5;29185:24;:::i;:::-;29165:45;:::i;:::-;29160:3;29153:58;29060:157;;:::o;29223:663::-;29464:3;29486:148;29630:3;29486:148;:::i;:::-;29479:155;;29644:75;29715:3;29706:6;29644:75;:::i;:::-;29744:2;29739:3;29735:12;29728:19;;29757:75;29828:3;29819:6;29757:75;:::i;:::-;29857:2;29852:3;29848:12;29841:19;;29877:3;29870:10;;29223:663;;;;;:::o;29892:545::-;30065:4;30103:3;30092:9;30088:19;30080:27;;30117:71;30185:1;30174:9;30170:17;30161:6;30117:71;:::i;:::-;30198:68;30262:2;30251:9;30247:18;30238:6;30198:68;:::i;:::-;30276:72;30344:2;30333:9;30329:18;30320:6;30276:72;:::i;:::-;30358;30426:2;30415:9;30411:18;30402:6;30358:72;:::i;:::-;29892:545;;;;;;;:::o;30443:180::-;30491:77;30488:1;30481:88;30588:4;30585:1;30578:15;30612:4;30609:1;30602:15;30629:174;30769:26;30765:1;30757:6;30753:14;30746:50;30629:174;:::o;30809:366::-;30951:3;30972:67;31036:2;31031:3;30972:67;:::i;:::-;30965:74;;31048:93;31137:3;31048:93;:::i;:::-;31166:2;31161:3;31157:12;31150:19;;30809:366;;;:::o;31181:419::-;31347:4;31385:2;31374:9;31370:18;31362:26;;31434:9;31428:4;31424:20;31420:1;31409:9;31405:17;31398:47;31462:131;31588:4;31462:131;:::i;:::-;31454:139;;31181:419;;;:::o;31606:181::-;31746:33;31742:1;31734:6;31730:14;31723:57;31606:181;:::o;31793:366::-;31935:3;31956:67;32020:2;32015:3;31956:67;:::i;:::-;31949:74;;32032:93;32121:3;32032:93;:::i;:::-;32150:2;32145:3;32141:12;32134:19;;31793:366;;;:::o;32165:419::-;32331:4;32369:2;32358:9;32354:18;32346:26;;32418:9;32412:4;32408:20;32404:1;32393:9;32389:17;32382:47;32446:131;32572:4;32446:131;:::i;:::-;32438:139;;32165:419;;;:::o;32590:221::-;32730:34;32726:1;32718:6;32714:14;32707:58;32799:4;32794:2;32786:6;32782:15;32775:29;32590:221;:::o;32817:366::-;32959:3;32980:67;33044:2;33039:3;32980:67;:::i;:::-;32973:74;;33056:93;33145:3;33056:93;:::i;:::-;33174:2;33169:3;33165:12;33158:19;;32817:366;;;:::o;33189:419::-;33355:4;33393:2;33382:9;33378:18;33370:26;;33442:9;33436:4;33432:20;33428:1;33417:9;33413:17;33406:47;33470:131;33596:4;33470:131;:::i;:::-;33462:139;;33189:419;;;:::o;33614:221::-;33754:34;33750:1;33742:6;33738:14;33731:58;33823:4;33818:2;33810:6;33806:15;33799:29;33614:221;:::o;33841:366::-;33983:3;34004:67;34068:2;34063:3;34004:67;:::i;:::-;33997:74;;34080:93;34169:3;34080:93;:::i;:::-;34198:2;34193:3;34189:12;34182:19;;33841:366;;;:::o;34213:419::-;34379:4;34417:2;34406:9;34402:18;34394:26;;34466:9;34460:4;34456:20;34452:1;34441:9;34437:17;34430:47;34494:131;34620:4;34494:131;:::i;:::-;34486:139;;34213:419;;;:::o

Swarm Source

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