ETH Price: $2,283.09 (-2.71%)

Token

Hulkshare (HST)
 

Overview

Max Total Supply

1,000,000 HST

Holders

7

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
100,000 HST

Value
$0.00
0x17Ab1f88C4C90E5A5290cFb8550CDa1279E84531
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:
Hulkshare

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 9 of 14: HulkshareToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

import "./ERC20.sol";
import "./draft-ERC20Permit.sol";
import "./ERC20Votes.sol";

contract Hulkshare is ERC20, ERC20Permit, ERC20Votes {
    constructor() ERC20("Hulkshare", "HST") ERC20Permit("Hulkshare") {
        _mint(address(0xD247a42bBe3Af7b5E8b0bE9d0AD2c2Fa3716894e), 200000 * 10 ** decimals());
        _mint(address(0xb961F3a5585DB0168Dbb730Fc40e514040d10953), 200000 * 10 ** decimals());
        _mint(address(0x94e3cEBF2215d0738d02Aa4ED79c8377eB17f29f), 100000 * 10 ** decimals());
        _mint(address(0x3737409DD7C8a0ba1CE4D52B7ec0153f7497c2BE), 100000 * 10 ** decimals());
        _mint(address(0x7D69bA7791805d33B922F6604488638aC96A65AC), 100000 * 10 ** decimals());
        _mint(address(0x17Ab1f88C4C90E5A5290cFb8550CDa1279E84531), 100000 * 10 ** decimals());
        _mint(address(0x17Ab1f88C4C90E5A5290cFb8550CDa1279E84531), 200000 * 10 ** decimals());
    }

    // The following functions are overrides required by Solidity.

    function _afterTokenTransfer(address from, address to, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._afterTokenTransfer(from, to, amount);
    }

    function _mint(address to, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._mint(to, amount);
    }

    function _burn(address account, uint256 amount)
        internal
        override(ERC20, ERC20Votes)
    {
        super._burn(account, amount);
    }
}


File 1 of 14: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 2 of 14: Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

File 3 of 14: draft-EIP712.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;

import "./ECDSA.sol";

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

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

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

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

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

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

File 4 of 14: draft-ERC20Permit.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-ERC20Permit.sol)

pragma solidity ^0.8.0;

import "./draft-IERC20Permit.sol";
import "./ERC20.sol";
import "./draft-EIP712.sol";
import "./ECDSA.sol";
import "./Counters.sol";

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

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

    // solhint-disable-next-line var-name-mixedcase
    bytes32 private immutable _PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

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

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

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

        bytes32 hash = _hashTypedDataV4(structHash);

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

        _approve(owner, spender, value);
    }

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

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

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

File 5 of 14: draft-IERC20Permit.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

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

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

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

File 6 of 14: ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "./Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

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

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

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

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

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

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

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

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

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

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

File 7 of 14: ERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 14: ERC20Votes.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/ERC20Votes.sol)

pragma solidity ^0.8.0;

import "./draft-ERC20Permit.sol";
import "./Math.sol";
import "./SafeCast.sol";
import "./ECDSA.sol";

/**
 * @dev Extension of ERC20 to support Compound-like voting and delegation. This version is more generic than Compound's,
 * and supports token supply up to 2^224^ - 1, while COMP is limited to 2^96^ - 1.
 *
 * NOTE: If exact COMP compatibility is required, use the {ERC20VotesComp} variant of this module.
 *
 * This extension keeps a history (checkpoints) of each account's vote power. Vote power can be delegated either
 * by calling the {delegate} function directly, or by providing a signature to be used with {delegateBySig}. Voting
 * power can be queried through the public accessors {getVotes} and {getPastVotes}.
 *
 * By default, token balance does not account for voting power. This makes transfers cheaper. The downside is that it
 * requires users to delegate to themselves in order to activate checkpoints and have their voting power tracked.
 * Enabling self-delegation can easily be done by overriding the {delegates} function. Keep in mind however that this
 * will significantly increase the base gas cost of transfers.
 *
 * _Available since v4.2._
 */
abstract contract ERC20Votes is ERC20Permit {
    struct Checkpoint {
        uint32 fromBlock;
        uint224 votes;
    }

    bytes32 private constant _DELEGATION_TYPEHASH =
        keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    mapping(address => address) private _delegates;
    mapping(address => Checkpoint[]) private _checkpoints;
    Checkpoint[] private _totalSupplyCheckpoints;

    /**
     * @dev Emitted when an account changes their delegate.
     */
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /**
     * @dev Emitted when a token transfer or delegate change results in changes to an account's voting power.
     */
    event DelegateVotesChanged(address indexed delegate, uint256 previousBalance, uint256 newBalance);

    /**
     * @dev Get the `pos`-th checkpoint for `account`.
     */
    function checkpoints(address account, uint32 pos) public view virtual returns (Checkpoint memory) {
        return _checkpoints[account][pos];
    }

    /**
     * @dev Get number of checkpoints for `account`.
     */
    function numCheckpoints(address account) public view virtual returns (uint32) {
        return SafeCast.toUint32(_checkpoints[account].length);
    }

    /**
     * @dev Get the address `account` is currently delegating to.
     */
    function delegates(address account) public view virtual returns (address) {
        return _delegates[account];
    }

    /**
     * @dev Gets the current votes balance for `account`
     */
    function getVotes(address account) public view returns (uint256) {
        uint256 pos = _checkpoints[account].length;
        return pos == 0 ? 0 : _checkpoints[account][pos - 1].votes;
    }

    /**
     * @dev Retrieve the number of votes for `account` at the end of `blockNumber`.
     *
     * Requirements:
     *
     * - `blockNumber` must have been already mined
     */
    function getPastVotes(address account, uint256 blockNumber) public view returns (uint256) {
        require(blockNumber < block.number, "ERC20Votes: block not yet mined");
        return _checkpointsLookup(_checkpoints[account], blockNumber);
    }

    /**
     * @dev Retrieve the `totalSupply` at the end of `blockNumber`. Note, this value is the sum of all balances.
     * It is but NOT the sum of all the delegated votes!
     *
     * Requirements:
     *
     * - `blockNumber` must have been already mined
     */
    function getPastTotalSupply(uint256 blockNumber) public view returns (uint256) {
        require(blockNumber < block.number, "ERC20Votes: block not yet mined");
        return _checkpointsLookup(_totalSupplyCheckpoints, blockNumber);
    }

    /**
     * @dev Lookup a value in a list of (sorted) checkpoints.
     */
    function _checkpointsLookup(Checkpoint[] storage ckpts, uint256 blockNumber) private view returns (uint256) {
        // We run a binary search to look for the earliest checkpoint taken after `blockNumber`.
        //
        // During the loop, the index of the wanted checkpoint remains in the range [low-1, high).
        // With each iteration, either `low` or `high` is moved towards the middle of the range to maintain the invariant.
        // - If the middle checkpoint is after `blockNumber`, we look in [low, mid)
        // - If the middle checkpoint is before or equal to `blockNumber`, we look in [mid+1, high)
        // Once we reach a single value (when low == high), we've found the right checkpoint at the index high-1, if not
        // out of bounds (in which case we're looking too far in the past and the result is 0).
        // Note that if the latest checkpoint available is exactly for `blockNumber`, we end up with an index that is
        // past the end of the array, so we technically don't find a checkpoint after `blockNumber`, but it works out
        // the same.
        uint256 high = ckpts.length;
        uint256 low = 0;
        while (low < high) {
            uint256 mid = Math.average(low, high);
            if (ckpts[mid].fromBlock > blockNumber) {
                high = mid;
            } else {
                low = mid + 1;
            }
        }

        return high == 0 ? 0 : ckpts[high - 1].votes;
    }

    /**
     * @dev Delegate votes from the sender to `delegatee`.
     */
    function delegate(address delegatee) public virtual {
        _delegate(_msgSender(), delegatee);
    }

    /**
     * @dev Delegates votes from signer to `delegatee`
     */
    function delegateBySig(
        address delegatee,
        uint256 nonce,
        uint256 expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(block.timestamp <= expiry, "ERC20Votes: signature expired");
        address signer = ECDSA.recover(
            _hashTypedDataV4(keccak256(abi.encode(_DELEGATION_TYPEHASH, delegatee, nonce, expiry))),
            v,
            r,
            s
        );
        require(nonce == _useNonce(signer), "ERC20Votes: invalid nonce");
        _delegate(signer, delegatee);
    }

    /**
     * @dev Maximum token supply. Defaults to `type(uint224).max` (2^224^ - 1).
     */
    function _maxSupply() internal view virtual returns (uint224) {
        return type(uint224).max;
    }

    /**
     * @dev Snapshots the totalSupply after it has been increased.
     */
    function _mint(address account, uint256 amount) internal virtual override {
        super._mint(account, amount);
        require(totalSupply() <= _maxSupply(), "ERC20Votes: total supply risks overflowing votes");

        _writeCheckpoint(_totalSupplyCheckpoints, _add, amount);
    }

    /**
     * @dev Snapshots the totalSupply after it has been decreased.
     */
    function _burn(address account, uint256 amount) internal virtual override {
        super._burn(account, amount);

        _writeCheckpoint(_totalSupplyCheckpoints, _subtract, amount);
    }

    /**
     * @dev Move voting power when tokens are transferred.
     *
     * Emits a {DelegateVotesChanged} event.
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        super._afterTokenTransfer(from, to, amount);

        _moveVotingPower(delegates(from), delegates(to), amount);
    }

    /**
     * @dev Change delegation for `delegator` to `delegatee`.
     *
     * Emits events {DelegateChanged} and {DelegateVotesChanged}.
     */
    function _delegate(address delegator, address delegatee) internal virtual {
        address currentDelegate = delegates(delegator);
        uint256 delegatorBalance = balanceOf(delegator);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveVotingPower(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveVotingPower(
        address src,
        address dst,
        uint256 amount
    ) private {
        if (src != dst && amount > 0) {
            if (src != address(0)) {
                (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[src], _subtract, amount);
                emit DelegateVotesChanged(src, oldWeight, newWeight);
            }

            if (dst != address(0)) {
                (uint256 oldWeight, uint256 newWeight) = _writeCheckpoint(_checkpoints[dst], _add, amount);
                emit DelegateVotesChanged(dst, oldWeight, newWeight);
            }
        }
    }

    function _writeCheckpoint(
        Checkpoint[] storage ckpts,
        function(uint256, uint256) view returns (uint256) op,
        uint256 delta
    ) private returns (uint256 oldWeight, uint256 newWeight) {
        uint256 pos = ckpts.length;
        oldWeight = pos == 0 ? 0 : ckpts[pos - 1].votes;
        newWeight = op(oldWeight, delta);

        if (pos > 0 && ckpts[pos - 1].fromBlock == block.number) {
            ckpts[pos - 1].votes = SafeCast.toUint224(newWeight);
        } else {
            ckpts.push(Checkpoint({fromBlock: SafeCast.toUint32(block.number), votes: SafeCast.toUint224(newWeight)}));
        }
    }

    function _add(uint256 a, uint256 b) private pure returns (uint256) {
        return a + b;
    }

    function _subtract(uint256 a, uint256 b) private pure returns (uint256) {
        return a - b;
    }
}

File 10 of 14: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 11 of 14: IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";

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

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

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

File 12 of 14: Math.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @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 / b + (a % b == 0 ? 0 : 1);
    }
}

File 13 of 14: SafeCast.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeCast.sol)

pragma solidity ^0.8.0;

/**
 * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow
 * checks.
 *
 * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can
 * easily result in undesired exploitation or bugs, since developers usually
 * assume that overflows raise errors. `SafeCast` restores this intuition by
 * reverting the transaction when such an operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 *
 * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing
 * all math on `uint256` and `int256` and then downcasting.
 */
library SafeCast {
    /**
     * @dev Returns the downcasted uint224 from uint256, reverting on
     * overflow (when the input is greater than largest uint224).
     *
     * Counterpart to Solidity's `uint224` operator.
     *
     * Requirements:
     *
     * - input must fit into 224 bits
     */
    function toUint224(uint256 value) internal pure returns (uint224) {
        require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits");
        return uint224(value);
    }

    /**
     * @dev Returns the downcasted uint128 from uint256, reverting on
     * overflow (when the input is greater than largest uint128).
     *
     * Counterpart to Solidity's `uint128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     */
    function toUint128(uint256 value) internal pure returns (uint128) {
        require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits");
        return uint128(value);
    }

    /**
     * @dev Returns the downcasted uint96 from uint256, reverting on
     * overflow (when the input is greater than largest uint96).
     *
     * Counterpart to Solidity's `uint96` operator.
     *
     * Requirements:
     *
     * - input must fit into 96 bits
     */
    function toUint96(uint256 value) internal pure returns (uint96) {
        require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits");
        return uint96(value);
    }

    /**
     * @dev Returns the downcasted uint64 from uint256, reverting on
     * overflow (when the input is greater than largest uint64).
     *
     * Counterpart to Solidity's `uint64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     */
    function toUint64(uint256 value) internal pure returns (uint64) {
        require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits");
        return uint64(value);
    }

    /**
     * @dev Returns the downcasted uint32 from uint256, reverting on
     * overflow (when the input is greater than largest uint32).
     *
     * Counterpart to Solidity's `uint32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     */
    function toUint32(uint256 value) internal pure returns (uint32) {
        require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits");
        return uint32(value);
    }

    /**
     * @dev Returns the downcasted uint16 from uint256, reverting on
     * overflow (when the input is greater than largest uint16).
     *
     * Counterpart to Solidity's `uint16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     */
    function toUint16(uint256 value) internal pure returns (uint16) {
        require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits");
        return uint16(value);
    }

    /**
     * @dev Returns the downcasted uint8 from uint256, reverting on
     * overflow (when the input is greater than largest uint8).
     *
     * Counterpart to Solidity's `uint8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     */
    function toUint8(uint256 value) internal pure returns (uint8) {
        require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits");
        return uint8(value);
    }

    /**
     * @dev Converts a signed int256 into an unsigned uint256.
     *
     * Requirements:
     *
     * - input must be greater than or equal to 0.
     */
    function toUint256(int256 value) internal pure returns (uint256) {
        require(value >= 0, "SafeCast: value must be positive");
        return uint256(value);
    }

    /**
     * @dev Returns the downcasted int128 from int256, reverting on
     * overflow (when the input is less than smallest int128 or
     * greater than largest int128).
     *
     * Counterpart to Solidity's `int128` operator.
     *
     * Requirements:
     *
     * - input must fit into 128 bits
     *
     * _Available since v3.1._
     */
    function toInt128(int256 value) internal pure returns (int128) {
        require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits");
        return int128(value);
    }

    /**
     * @dev Returns the downcasted int64 from int256, reverting on
     * overflow (when the input is less than smallest int64 or
     * greater than largest int64).
     *
     * Counterpart to Solidity's `int64` operator.
     *
     * Requirements:
     *
     * - input must fit into 64 bits
     *
     * _Available since v3.1._
     */
    function toInt64(int256 value) internal pure returns (int64) {
        require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits");
        return int64(value);
    }

    /**
     * @dev Returns the downcasted int32 from int256, reverting on
     * overflow (when the input is less than smallest int32 or
     * greater than largest int32).
     *
     * Counterpart to Solidity's `int32` operator.
     *
     * Requirements:
     *
     * - input must fit into 32 bits
     *
     * _Available since v3.1._
     */
    function toInt32(int256 value) internal pure returns (int32) {
        require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits");
        return int32(value);
    }

    /**
     * @dev Returns the downcasted int16 from int256, reverting on
     * overflow (when the input is less than smallest int16 or
     * greater than largest int16).
     *
     * Counterpart to Solidity's `int16` operator.
     *
     * Requirements:
     *
     * - input must fit into 16 bits
     *
     * _Available since v3.1._
     */
    function toInt16(int256 value) internal pure returns (int16) {
        require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits");
        return int16(value);
    }

    /**
     * @dev Returns the downcasted int8 from int256, reverting on
     * overflow (when the input is less than smallest int8 or
     * greater than largest int8).
     *
     * Counterpart to Solidity's `int8` operator.
     *
     * Requirements:
     *
     * - input must fit into 8 bits.
     *
     * _Available since v3.1._
     */
    function toInt8(int256 value) internal pure returns (int8) {
        require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits");
        return int8(value);
    }

    /**
     * @dev Converts an unsigned uint256 into a signed int256.
     *
     * Requirements:
     *
     * - input must be less than or equal to maxInt256.
     */
    function toInt256(uint256 value) internal pure returns (int256) {
        // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive
        require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256");
        return int256(value);
    }
}

File 14 of 14: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","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":"account","type":"address"},{"internalType":"uint32","name":"pos","type":"uint32"}],"name":"checkpoints","outputs":[{"components":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint224","name":"votes","type":"uint224"}],"internalType":"struct ERC20Votes.Checkpoint","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPastVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":[{"internalType":"address","name":"account","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140908152503480156200003a57600080fd5b506040518060400160405280600981526020017f48756c6b73686172650000000000000000000000000000000000000000000000815250806040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280600981526020017f48756c6b736861726500000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f485354000000000000000000000000000000000000000000000000000000000081525081600390805190602001906200012c92919062000db3565b5080600490805190602001906200014592919062000db3565b50505060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508260e081815250508161010081815250504660a08181525050620001b18184846200044660201b60201c565b608081815250503073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508061012081815250505050505050506200024e73d247a42bbe3af7b5e8b0be9d0ad2c2fa3716894e620002246200048260201b60201c565b600a62000232919062000ffd565b62030d406200024291906200104e565b6200048b60201b60201c565b620002a173b961f3a5585db0168dbb730fc40e514040d10953620002776200048260201b60201c565b600a62000285919062000ffd565b62030d406200029591906200104e565b6200048b60201b60201c565b620002f47394e3cebf2215d0738d02aa4ed79c8377eb17f29f620002ca6200048260201b60201c565b600a620002d8919062000ffd565b620186a0620002e891906200104e565b6200048b60201b60201c565b62000347733737409dd7c8a0ba1ce4d52b7ec0153f7497c2be6200031d6200048260201b60201c565b600a6200032b919062000ffd565b620186a06200033b91906200104e565b6200048b60201b60201c565b6200039a737d69ba7791805d33b922f6604488638ac96a65ac620003706200048260201b60201c565b600a6200037e919062000ffd565b620186a06200038e91906200104e565b6200048b60201b60201c565b620003ed7317ab1f88c4c90e5a5290cfb8550cda1279e84531620003c36200048260201b60201c565b600a620003d1919062000ffd565b620186a0620003e191906200104e565b6200048b60201b60201c565b620004407317ab1f88c4c90e5a5290cfb8550cda1279e84531620004166200048260201b60201c565b600a62000424919062000ffd565b62030d406200043491906200104e565b6200048b60201b60201c565b6200153e565b600083838346306040516020016200046395949392919062001120565b6040516020818303038152906040528051906020012090509392505050565b60006012905090565b620004a28282620004a660201b620010231760201c565b5050565b620004bd82826200056460201b620010b01760201c565b620004cd620006dd60201b60201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16620004fb6200070160201b60201c565b11156200053f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005369062001204565b60405180910390fd5b6200055e60086200070b60201b6200121017836200072360201b60201c565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620005d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005ce9062001276565b60405180910390fd5b620005eb60008383620009d460201b60201c565b8060026000828254620005ff919062001298565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825462000656919062001298565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051620006bd9190620012f5565b60405180910390a3620006d960008383620009d960201b60201c565b5050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b6000600254905090565b600081836200071b919062001298565b905092915050565b6000806000858054905090506000811462000798578560018262000748919062001312565b815481106200075c576200075b6200134d565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166200079b565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250620007c783858760201c565b91506000811180156200082057504386600183620007e6919062001312565b81548110620007fa57620007f96200134d565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15620008c1576200083c82620009f660201b620012261760201c565b866001836200084c919062001312565b8154811062000860576200085f6200134d565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550620009cb565b856040518060400160405280620008e34362000a6460201b620012911760201c565b63ffffffff1681526020016200090485620009f660201b620012261760201c565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b620009f183838362000aba60201b620012e41760201c565b505050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff801682111562000a5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000a5390620013f2565b60405180910390fd5b819050919050565b600063ffffffff801682111562000ab2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000aa9906200148a565b60405180910390fd5b819050919050565b62000ad283838362000b0a60201b6200130f1760201c565b62000b0562000ae78462000b0f60201b60201c565b62000af88462000b0f60201b60201c565b8362000b7860201b60201c565b505050565b505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801562000bb55750600081115b1562000d9657600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000ca85760008062000c4f600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000d9b60201b6200131417856200072360201b60201c565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000c9d929190620014ac565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000d955760008062000d3c600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206200070b60201b6200121017856200072360201b60201c565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724838360405162000d8a929190620014ac565b60405180910390a250505b5b505050565b6000818362000dab919062001312565b905092915050565b82805462000dc19062001508565b90600052602060002090601f01602090048101928262000de5576000855562000e31565b82601f1062000e0057805160ff191683800117855562000e31565b8280016001018555821562000e31579182015b8281111562000e3057825182559160200191906001019062000e13565b5b50905062000e40919062000e44565b5090565b5b8082111562000e5f57600081600090555060010162000e45565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111562000ef15780860481111562000ec95762000ec862000e63565b5b600185161562000ed95780820291505b808102905062000ee98562000e92565b945062000ea9565b94509492505050565b60008262000f0c576001905062000fdf565b8162000f1c576000905062000fdf565b816001811462000f35576002811462000f405762000f76565b600191505062000fdf565b60ff84111562000f555762000f5462000e63565b5b8360020a91508482111562000f6f5762000f6e62000e63565b5b5062000fdf565b5060208310610133831016604e8410600b841016171562000fb05782820a90508381111562000faa5762000fa962000e63565b5b62000fdf565b62000fbf848484600162000e9f565b9250905081840481111562000fd95762000fd862000e63565b5b81810290505b9392505050565b6000819050919050565b600060ff82169050919050565b60006200100a8262000fe6565b9150620010178362000ff0565b9250620010467fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000efa565b905092915050565b60006200105b8262000fe6565b9150620010688362000fe6565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620010a457620010a362000e63565b5b828202905092915050565b6000819050919050565b620010c481620010af565b82525050565b620010d58162000fe6565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200110882620010db565b9050919050565b6200111a81620010fb565b82525050565b600060a082019050620011376000830188620010b9565b620011466020830187620010b9565b620011556040830186620010b9565b620011646060830185620010ca565b6200117360808301846200110f565b9695505050505050565b600082825260208201905092915050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000620011ec6030836200117d565b9150620011f9826200118e565b604082019050919050565b600060208201905081810360008301526200121f81620011dd565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b60006200125e601f836200117d565b91506200126b8262001226565b602082019050919050565b6000602082019050818103600083015262001291816200124f565b9050919050565b6000620012a58262000fe6565b9150620012b28362000fe6565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620012ea57620012e962000e63565b5b828201905092915050565b60006020820190506200130c6000830184620010ca565b92915050565b60006200131f8262000fe6565b91506200132c8362000fe6565b92508282101562001342576200134162000e63565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b6000620013da6027836200117d565b9150620013e7826200137c565b604082019050919050565b600060208201905081810360008301526200140d81620013cb565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b6000620014726026836200117d565b91506200147f8262001414565b604082019050919050565b60006020820190508181036000830152620014a58162001463565b9050919050565b6000604082019050620014c36000830185620010ca565b620014d26020830184620010ca565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200152157607f821691505b60208210811415620015385762001537620014d9565b5b50919050565b60805160a05160c05160e051610100516101205161014051613871620015996000396000610d910152600061182c0152600061186e0152600061184d01526000611782015260006117d80152600061180101526138716000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146103d9578063a9059cbb14610409578063c3cda52014610439578063d505accf14610455578063dd62ed3e14610471578063f1127ed8146104a157610142565b806370a08231146102fb5780637ecebe001461032b5780638e539e8c1461035b57806395d89b411461038b5780639ab24eb0146103a957610142565b80633644e5151161010a5780633644e51514610201578063395093511461021f5780633a46b1a81461024f578063587cde1e1461027f5780635c19a95c146102af5780636fcfff45146102cb57610142565b806306fdde0314610147578063095ea7b31461016557806318160ddd1461019557806323b872dd146101b3578063313ce567146101e3575b600080fd5b61014f6104d1565b60405161015c919061247b565b60405180910390f35b61017f600480360381019061017a9190612536565b610563565b60405161018c9190612591565b60405180910390f35b61019d610581565b6040516101aa91906125bb565b60405180910390f35b6101cd60048036038101906101c891906125d6565b61058b565b6040516101da9190612591565b60405180910390f35b6101eb610683565b6040516101f89190612645565b60405180910390f35b61020961068c565b6040516102169190612679565b60405180910390f35b61023960048036038101906102349190612536565b61069b565b6040516102469190612591565b60405180910390f35b61026960048036038101906102649190612536565b610747565b60405161027691906125bb565b60405180910390f35b61029960048036038101906102949190612694565b6107db565b6040516102a691906126d0565b60405180910390f35b6102c960048036038101906102c49190612694565b610844565b005b6102e560048036038101906102e09190612694565b610858565b6040516102f2919061270a565b60405180910390f35b61031560048036038101906103109190612694565b6108ac565b60405161032291906125bb565b60405180910390f35b61034560048036038101906103409190612694565b6108f4565b60405161035291906125bb565b60405180910390f35b61037560048036038101906103709190612725565b610944565b60405161038291906125bb565b60405180910390f35b61039361099a565b6040516103a0919061247b565b60405180910390f35b6103c360048036038101906103be9190612694565b610a2c565b6040516103d091906125bb565b60405180910390f35b6103f360048036038101906103ee9190612536565b610b3d565b6040516104009190612591565b60405180910390f35b610423600480360381019061041e9190612536565b610c28565b6040516104309190612591565b60405180910390f35b610453600480360381019061044e91906127aa565b610c46565b005b61046f600480360381019061046a9190612837565b610d4a565b005b61048b600480360381019061048691906128d9565b610e8c565b60405161049891906125bb565b60405180910390f35b6104bb60048036038101906104b69190612945565b610f13565b6040516104c891906129fa565b60405180910390f35b6060600380546104e090612a44565b80601f016020809104026020016040519081016040528092919081815260200182805461050c90612a44565b80156105595780601f1061052e57610100808354040283529160200191610559565b820191906000526020600020905b81548152906001019060200180831161053c57829003601f168201915b5050505050905090565b600061057761057061132a565b8484611332565b6001905092915050565b6000600254905090565b60006105988484846114fd565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006105e361132a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065a90612ae8565b60405180910390fd5b6106778561066f61132a565b858403611332565b60019150509392505050565b60006012905090565b600061069661177e565b905090565b600061073d6106a861132a565b8484600160006106b661132a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107389190612b37565b611332565b6001905092915050565b600043821061078b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078290612bd9565b60405180910390fd5b6107d3600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611898565b905092915050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61085561084f61132a565b826119a4565b50565b60006108a5600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611291565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061093d600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611abe565b9050919050565b6000438210610988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097f90612bd9565b60405180910390fd5b610993600883611898565b9050919050565b6060600480546109a990612a44565b80601f01602080910402602001604051908101604052809291908181526020018280546109d590612a44565b8015610a225780601f106109f757610100808354040283529160200191610a22565b820191906000526020600020905b815481529060010190602001808311610a0557829003601f168201915b5050505050905090565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610b1457600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610ac89190612bf9565b81548110610ad957610ad8612c2d565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b17565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b60008060016000610b4c61132a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0090612cce565b60405180910390fd5b610c1d610c1461132a565b85858403611332565b600191505092915050565b6000610c3c610c3561132a565b84846114fd565b6001905092915050565b83421115610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090612d3a565b60405180910390fd5b6000610ceb610ce37fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610cc89493929190612d5a565b60405160208183030381529060405280519060200120611acc565b858585611ae6565b9050610cf681611b11565b8614610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e90612deb565b60405180910390fd5b610d4181886119a4565b50505050505050565b83421115610d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8490612e57565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000888888610dbc8c611b11565b89604051602001610dd296959493929190612e77565b6040516020818303038152906040528051906020012090506000610df582611acc565b90506000610e0582878787611ae6565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6c90612f24565b60405180910390fd5b610e808a8a8a611332565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f1b6123a4565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610f7257610f71612c2d565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b61102d82826110b0565b611035611b6f565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661105b610581565b111561109c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109390612fb6565b60405180910390fd5b6110aa600861121083611b93565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111790613022565b60405180910390fd5b61112c60008383611e0b565b806002600082825461113e9190612b37565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111939190612b37565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516111f891906125bb565b60405180910390a361120c60008383611e10565b5050565b6000818361121e9190612b37565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611289576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611280906130b4565b60405180910390fd5b819050919050565b600063ffffffff80168211156112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390613146565b60405180910390fd5b819050919050565b6112ef83838361130f565b61130a6112fb846107db565b611304846107db565b83611e20565b505050565b505050565b600081836113229190612bf9565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611399906131d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611412576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114099061326a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516114f091906125bb565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561156d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611564906132fc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d49061338e565b60405180910390fd5b6115e8838383611e0b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561166e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166590613420565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117019190612b37565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161176591906125bb565b60405180910390a3611778848484611e10565b50505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156117fa57507f000000000000000000000000000000000000000000000000000000000000000046145b15611827577f00000000000000000000000000000000000000000000000000000000000000009050611895565b6118927f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612019565b90505b90565b6000808380549050905060005b818110156119175760006118b98284612053565b9050848682815481106118cf576118ce612c2d565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16111561190157809250611911565b60018161190e9190612b37565b91505b506118a5565b60008214611979578460018361192d9190612bf9565b8154811061193e5761193d612c2d565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661197c565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b60006119af836107db565b905060006119bc846108ac565b905082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611ab8828483611e20565b50505050565b600081600001549050919050565b6000611adf611ad961177e565b83612079565b9050919050565b6000806000611af7878787876120ac565b91509150611b04816121b9565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611b5e81611abe565b9150611b698161238e565b50919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611c015785600182611bb59190612bf9565b81548110611bc657611bc5612c2d565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611c04565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611c3283858763ffffffff16565b9150600081118015611c8557504386600183611c4e9190612bf9565b81548110611c5f57611c5e612c2d565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611d1257611c9382611226565b86600183611ca19190612bf9565b81548110611cb257611cb1612c2d565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611e02565b856040518060400160405280611d2743611291565b63ffffffff168152602001611d3b85611226565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b611e1b8383836112e4565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611e5c5750600081115b1561201457600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611f3a57600080611ee3600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061131485611b93565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611f2f929190613440565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461201357600080611fbc600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061121085611b93565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612008929190613440565b60405180910390a250505b5b505050565b60008383834630604051602001612034959493929190613469565b6040516020818303038152906040528051906020012090509392505050565b6000600282841861206491906134eb565b8284166120719190612b37565b905092915050565b6000828260405160200161208e929190613594565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156120e75760006003915091506121b0565b601b8560ff16141580156120ff5750601c8560ff1614155b156121115760006004915091506121b0565b60006001878787876040516000815260200160405260405161213694939291906135cb565b6020604051602081039080840390855afa158015612158573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121a7576000600192509250506121b0565b80600092509250505b94509492505050565b600060048111156121cd576121cc613610565b5b8160048111156121e0576121df613610565b5b14156121eb5761238b565b600160048111156121ff576121fe613610565b5b81600481111561221257612211613610565b5b1415612253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224a9061368b565b60405180910390fd5b6002600481111561226757612266613610565b5b81600481111561227a57612279613610565b5b14156122bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b2906136f7565b60405180910390fd5b600360048111156122cf576122ce613610565b5b8160048111156122e2576122e1613610565b5b1415612323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231a90613789565b60405180910390fd5b60048081111561233657612335613610565b5b81600481111561234957612348613610565b5b141561238a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123819061381b565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561241c578082015181840152602081019050612401565b8381111561242b576000848401525b50505050565b6000601f19601f8301169050919050565b600061244d826123e2565b61245781856123ed565b93506124678185602086016123fe565b61247081612431565b840191505092915050565b600060208201905081810360008301526124958184612442565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006124cd826124a2565b9050919050565b6124dd816124c2565b81146124e857600080fd5b50565b6000813590506124fa816124d4565b92915050565b6000819050919050565b61251381612500565b811461251e57600080fd5b50565b6000813590506125308161250a565b92915050565b6000806040838503121561254d5761254c61249d565b5b600061255b858286016124eb565b925050602061256c85828601612521565b9150509250929050565b60008115159050919050565b61258b81612576565b82525050565b60006020820190506125a66000830184612582565b92915050565b6125b581612500565b82525050565b60006020820190506125d060008301846125ac565b92915050565b6000806000606084860312156125ef576125ee61249d565b5b60006125fd868287016124eb565b935050602061260e868287016124eb565b925050604061261f86828701612521565b9150509250925092565b600060ff82169050919050565b61263f81612629565b82525050565b600060208201905061265a6000830184612636565b92915050565b6000819050919050565b61267381612660565b82525050565b600060208201905061268e600083018461266a565b92915050565b6000602082840312156126aa576126a961249d565b5b60006126b8848285016124eb565b91505092915050565b6126ca816124c2565b82525050565b60006020820190506126e560008301846126c1565b92915050565b600063ffffffff82169050919050565b612704816126eb565b82525050565b600060208201905061271f60008301846126fb565b92915050565b60006020828403121561273b5761273a61249d565b5b600061274984828501612521565b91505092915050565b61275b81612629565b811461276657600080fd5b50565b60008135905061277881612752565b92915050565b61278781612660565b811461279257600080fd5b50565b6000813590506127a48161277e565b92915050565b60008060008060008060c087890312156127c7576127c661249d565b5b60006127d589828a016124eb565b96505060206127e689828a01612521565b95505060406127f789828a01612521565b945050606061280889828a01612769565b935050608061281989828a01612795565b92505060a061282a89828a01612795565b9150509295509295509295565b600080600080600080600060e0888a0312156128565761285561249d565b5b60006128648a828b016124eb565b97505060206128758a828b016124eb565b96505060406128868a828b01612521565b95505060606128978a828b01612521565b94505060806128a88a828b01612769565b93505060a06128b98a828b01612795565b92505060c06128ca8a828b01612795565b91505092959891949750929550565b600080604083850312156128f0576128ef61249d565b5b60006128fe858286016124eb565b925050602061290f858286016124eb565b9150509250929050565b612922816126eb565b811461292d57600080fd5b50565b60008135905061293f81612919565b92915050565b6000806040838503121561295c5761295b61249d565b5b600061296a858286016124eb565b925050602061297b85828601612930565b9150509250929050565b61298e816126eb565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6129c581612994565b82525050565b6040820160008201516129e16000850182612985565b5060208201516129f460208501826129bc565b50505050565b6000604082019050612a0f60008301846129cb565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a5c57607f821691505b60208210811415612a7057612a6f612a15565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000612ad26028836123ed565b9150612add82612a76565b604082019050919050565b60006020820190508181036000830152612b0181612ac5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b4282612500565b9150612b4d83612500565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b8257612b81612b08565b5b828201905092915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612bc3601f836123ed565b9150612bce82612b8d565b602082019050919050565b60006020820190508181036000830152612bf281612bb6565b9050919050565b6000612c0482612500565b9150612c0f83612500565b925082821015612c2257612c21612b08565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612cb86025836123ed565b9150612cc382612c5c565b604082019050919050565b60006020820190508181036000830152612ce781612cab565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b6000612d24601d836123ed565b9150612d2f82612cee565b602082019050919050565b60006020820190508181036000830152612d5381612d17565b9050919050565b6000608082019050612d6f600083018761266a565b612d7c60208301866126c1565b612d8960408301856125ac565b612d9660608301846125ac565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b6000612dd56019836123ed565b9150612de082612d9f565b602082019050919050565b60006020820190508181036000830152612e0481612dc8565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000612e41601d836123ed565b9150612e4c82612e0b565b602082019050919050565b60006020820190508181036000830152612e7081612e34565b9050919050565b600060c082019050612e8c600083018961266a565b612e9960208301886126c1565b612ea660408301876126c1565b612eb360608301866125ac565b612ec060808301856125ac565b612ecd60a08301846125ac565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612f0e601e836123ed565b9150612f1982612ed8565b602082019050919050565b60006020820190508181036000830152612f3d81612f01565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000612fa06030836123ed565b9150612fab82612f44565b604082019050919050565b60006020820190508181036000830152612fcf81612f93565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061300c601f836123ed565b915061301782612fd6565b602082019050919050565b6000602082019050818103600083015261303b81612fff565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b600061309e6027836123ed565b91506130a982613042565b604082019050919050565b600060208201905081810360008301526130cd81613091565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b60006131306026836123ed565b915061313b826130d4565b604082019050919050565b6000602082019050818103600083015261315f81613123565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006131c26024836123ed565b91506131cd82613166565b604082019050919050565b600060208201905081810360008301526131f1816131b5565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006132546022836123ed565b915061325f826131f8565b604082019050919050565b6000602082019050818103600083015261328381613247565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006132e66025836123ed565b91506132f18261328a565b604082019050919050565b60006020820190508181036000830152613315816132d9565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006133786023836123ed565b91506133838261331c565b604082019050919050565b600060208201905081810360008301526133a78161336b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061340a6026836123ed565b9150613415826133ae565b604082019050919050565b60006020820190508181036000830152613439816133fd565b9050919050565b600060408201905061345560008301856125ac565b61346260208301846125ac565b9392505050565b600060a08201905061347e600083018861266a565b61348b602083018761266a565b613498604083018661266a565b6134a560608301856125ac565b6134b260808301846126c1565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006134f682612500565b915061350183612500565b925082613511576135106134bc565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061355d60028361351c565b915061356882613527565b600282019050919050565b6000819050919050565b61358e61358982612660565b613573565b82525050565b600061359f82613550565b91506135ab828561357d565b6020820191506135bb828461357d565b6020820191508190509392505050565b60006080820190506135e0600083018761266a565b6135ed6020830186612636565b6135fa604083018561266a565b613607606083018461266a565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006136756018836123ed565b91506136808261363f565b602082019050919050565b600060208201905081810360008301526136a481613668565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006136e1601f836123ed565b91506136ec826136ab565b602082019050919050565b60006020820190508181036000830152613710816136d4565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006137736022836123ed565b915061377e82613717565b604082019050919050565b600060208201905081810360008301526137a281613766565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006138056022836123ed565b9150613810826137a9565b604082019050919050565b60006020820190508181036000830152613834816137f8565b905091905056fea2646970667358221220bb5f938b5fd56ec8f047c714237093cee9811569b955c31053ee44725d55e9ac64736f6c634300080b0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a457c2d71161007c578063a457c2d7146103d9578063a9059cbb14610409578063c3cda52014610439578063d505accf14610455578063dd62ed3e14610471578063f1127ed8146104a157610142565b806370a08231146102fb5780637ecebe001461032b5780638e539e8c1461035b57806395d89b411461038b5780639ab24eb0146103a957610142565b80633644e5151161010a5780633644e51514610201578063395093511461021f5780633a46b1a81461024f578063587cde1e1461027f5780635c19a95c146102af5780636fcfff45146102cb57610142565b806306fdde0314610147578063095ea7b31461016557806318160ddd1461019557806323b872dd146101b3578063313ce567146101e3575b600080fd5b61014f6104d1565b60405161015c919061247b565b60405180910390f35b61017f600480360381019061017a9190612536565b610563565b60405161018c9190612591565b60405180910390f35b61019d610581565b6040516101aa91906125bb565b60405180910390f35b6101cd60048036038101906101c891906125d6565b61058b565b6040516101da9190612591565b60405180910390f35b6101eb610683565b6040516101f89190612645565b60405180910390f35b61020961068c565b6040516102169190612679565b60405180910390f35b61023960048036038101906102349190612536565b61069b565b6040516102469190612591565b60405180910390f35b61026960048036038101906102649190612536565b610747565b60405161027691906125bb565b60405180910390f35b61029960048036038101906102949190612694565b6107db565b6040516102a691906126d0565b60405180910390f35b6102c960048036038101906102c49190612694565b610844565b005b6102e560048036038101906102e09190612694565b610858565b6040516102f2919061270a565b60405180910390f35b61031560048036038101906103109190612694565b6108ac565b60405161032291906125bb565b60405180910390f35b61034560048036038101906103409190612694565b6108f4565b60405161035291906125bb565b60405180910390f35b61037560048036038101906103709190612725565b610944565b60405161038291906125bb565b60405180910390f35b61039361099a565b6040516103a0919061247b565b60405180910390f35b6103c360048036038101906103be9190612694565b610a2c565b6040516103d091906125bb565b60405180910390f35b6103f360048036038101906103ee9190612536565b610b3d565b6040516104009190612591565b60405180910390f35b610423600480360381019061041e9190612536565b610c28565b6040516104309190612591565b60405180910390f35b610453600480360381019061044e91906127aa565b610c46565b005b61046f600480360381019061046a9190612837565b610d4a565b005b61048b600480360381019061048691906128d9565b610e8c565b60405161049891906125bb565b60405180910390f35b6104bb60048036038101906104b69190612945565b610f13565b6040516104c891906129fa565b60405180910390f35b6060600380546104e090612a44565b80601f016020809104026020016040519081016040528092919081815260200182805461050c90612a44565b80156105595780601f1061052e57610100808354040283529160200191610559565b820191906000526020600020905b81548152906001019060200180831161053c57829003601f168201915b5050505050905090565b600061057761057061132a565b8484611332565b6001905092915050565b6000600254905090565b60006105988484846114fd565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006105e361132a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161065a90612ae8565b60405180910390fd5b6106778561066f61132a565b858403611332565b60019150509392505050565b60006012905090565b600061069661177e565b905090565b600061073d6106a861132a565b8484600160006106b661132a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107389190612b37565b611332565b6001905092915050565b600043821061078b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161078290612bd9565b60405180910390fd5b6107d3600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083611898565b905092915050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b61085561084f61132a565b826119a4565b50565b60006108a5600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050611291565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600061093d600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611abe565b9050919050565b6000438210610988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097f90612bd9565b60405180910390fd5b610993600883611898565b9050919050565b6060600480546109a990612a44565b80601f01602080910402602001604051908101604052809291908181526020018280546109d590612a44565b8015610a225780601f106109f757610100808354040283529160200191610a22565b820191906000526020600020905b815481529060010190602001808311610a0557829003601f168201915b5050505050905090565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060008114610b1457600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600182610ac89190612bf9565b81548110610ad957610ad8612c2d565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b17565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16915050919050565b60008060016000610b4c61132a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610c09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0090612cce565b60405180910390fd5b610c1d610c1461132a565b85858403611332565b600191505092915050565b6000610c3c610c3561132a565b84846114fd565b6001905092915050565b83421115610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090612d3a565b60405180910390fd5b6000610ceb610ce37fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf898989604051602001610cc89493929190612d5a565b60405160208183030381529060405280519060200120611acc565b858585611ae6565b9050610cf681611b11565b8614610d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2e90612deb565b60405180910390fd5b610d4181886119a4565b50505050505050565b83421115610d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8490612e57565b60405180910390fd5b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610dbc8c611b11565b89604051602001610dd296959493929190612e77565b6040516020818303038152906040528051906020012090506000610df582611acc565b90506000610e0582878787611ae6565b90508973ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6c90612f24565b60405180910390fd5b610e808a8a8a611332565b50505050505050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b610f1b6123a4565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208263ffffffff1681548110610f7257610f71612c2d565b5b906000526020600020016040518060400160405290816000820160009054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525050905092915050565b61102d82826110b0565b611035611b6f565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661105b610581565b111561109c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109390612fb6565b60405180910390fd5b6110aa600861121083611b93565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111790613022565b60405180910390fd5b61112c60008383611e0b565b806002600082825461113e9190612b37565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111939190612b37565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516111f891906125bb565b60405180910390a361120c60008383611e10565b5050565b6000818361121e9190612b37565b905092915050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8016821115611289576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611280906130b4565b60405180910390fd5b819050919050565b600063ffffffff80168211156112dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d390613146565b60405180910390fd5b819050919050565b6112ef83838361130f565b61130a6112fb846107db565b611304846107db565b83611e20565b505050565b505050565b600081836113229190612bf9565b905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611399906131d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611412576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114099061326a565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516114f091906125bb565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561156d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611564906132fc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d49061338e565b60405180910390fd5b6115e8838383611e0b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561166e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161166590613420565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117019190612b37565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161176591906125bb565b60405180910390a3611778848484611e10565b50505050565b60007f0000000000000000000000001a1e6bf848dd8ee149ed39e5c5faecb703d9c8d473ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161480156117fa57507f000000000000000000000000000000000000000000000000000000000000000146145b15611827577fd80e4a24e4d82996dd64948ff573fb2c8524ed80b122f99ff019278f58d3aa739050611895565b6118927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f8bee2927996e1de81e5ad088ce13d54e4852397220c12e47e84169968d73c4b37fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6612019565b90505b90565b6000808380549050905060005b818110156119175760006118b98284612053565b9050848682815481106118cf576118ce612c2d565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16111561190157809250611911565b60018161190e9190612b37565b91505b506118a5565b60008214611979578460018361192d9190612bf9565b8154811061193e5761193d612c2d565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661197c565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250505092915050565b60006119af836107db565b905060006119bc846108ac565b905082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f60405160405180910390a4611ab8828483611e20565b50505050565b600081600001549050919050565b6000611adf611ad961177e565b83612079565b9050919050565b6000806000611af7878787876120ac565b91509150611b04816121b9565b8192505050949350505050565b600080600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050611b5e81611abe565b9150611b698161238e565b50919050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff905090565b60008060008580549050905060008114611c015785600182611bb59190612bf9565b81548110611bc657611bc5612c2d565b5b9060005260206000200160000160049054906101000a90047bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16611c04565b60005b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169250611c3283858763ffffffff16565b9150600081118015611c8557504386600183611c4e9190612bf9565b81548110611c5f57611c5e612c2d565b5b9060005260206000200160000160009054906101000a900463ffffffff1663ffffffff16145b15611d1257611c9382611226565b86600183611ca19190612bf9565b81548110611cb257611cb1612c2d565b5b9060005260206000200160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff160217905550611e02565b856040518060400160405280611d2743611291565b63ffffffff168152602001611d3b85611226565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168152509080600181540180825580915050600190039060005260206000200160009091909190915060008201518160000160006101000a81548163ffffffff021916908363ffffffff16021790555060208201518160000160046101000a8154817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff02191690837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16021790555050505b50935093915050565b505050565b611e1b8383836112e4565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015611e5c5750600081115b1561201457600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614611f3a57600080611ee3600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061131485611b93565b915091508473ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051611f2f929190613440565b60405180910390a250505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461201357600080611fbc600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061121085611b93565b915091508373ffffffffffffffffffffffffffffffffffffffff167fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a7248383604051612008929190613440565b60405180910390a250505b5b505050565b60008383834630604051602001612034959493929190613469565b6040516020818303038152906040528051906020012090509392505050565b6000600282841861206491906134eb565b8284166120719190612b37565b905092915050565b6000828260405160200161208e929190613594565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156120e75760006003915091506121b0565b601b8560ff16141580156120ff5750601c8560ff1614155b156121115760006004915091506121b0565b60006001878787876040516000815260200160405260405161213694939291906135cb565b6020604051602081039080840390855afa158015612158573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121a7576000600192509250506121b0565b80600092509250505b94509492505050565b600060048111156121cd576121cc613610565b5b8160048111156121e0576121df613610565b5b14156121eb5761238b565b600160048111156121ff576121fe613610565b5b81600481111561221257612211613610565b5b1415612253576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224a9061368b565b60405180910390fd5b6002600481111561226757612266613610565b5b81600481111561227a57612279613610565b5b14156122bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b2906136f7565b60405180910390fd5b600360048111156122cf576122ce613610565b5b8160048111156122e2576122e1613610565b5b1415612323576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231a90613789565b60405180910390fd5b60048081111561233657612335613610565b5b81600481111561234957612348613610565b5b141561238a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123819061381b565b60405180910390fd5b5b50565b6001816000016000828254019250508190555050565b6040518060400160405280600063ffffffff16815260200160007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681525090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561241c578082015181840152602081019050612401565b8381111561242b576000848401525b50505050565b6000601f19601f8301169050919050565b600061244d826123e2565b61245781856123ed565b93506124678185602086016123fe565b61247081612431565b840191505092915050565b600060208201905081810360008301526124958184612442565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006124cd826124a2565b9050919050565b6124dd816124c2565b81146124e857600080fd5b50565b6000813590506124fa816124d4565b92915050565b6000819050919050565b61251381612500565b811461251e57600080fd5b50565b6000813590506125308161250a565b92915050565b6000806040838503121561254d5761254c61249d565b5b600061255b858286016124eb565b925050602061256c85828601612521565b9150509250929050565b60008115159050919050565b61258b81612576565b82525050565b60006020820190506125a66000830184612582565b92915050565b6125b581612500565b82525050565b60006020820190506125d060008301846125ac565b92915050565b6000806000606084860312156125ef576125ee61249d565b5b60006125fd868287016124eb565b935050602061260e868287016124eb565b925050604061261f86828701612521565b9150509250925092565b600060ff82169050919050565b61263f81612629565b82525050565b600060208201905061265a6000830184612636565b92915050565b6000819050919050565b61267381612660565b82525050565b600060208201905061268e600083018461266a565b92915050565b6000602082840312156126aa576126a961249d565b5b60006126b8848285016124eb565b91505092915050565b6126ca816124c2565b82525050565b60006020820190506126e560008301846126c1565b92915050565b600063ffffffff82169050919050565b612704816126eb565b82525050565b600060208201905061271f60008301846126fb565b92915050565b60006020828403121561273b5761273a61249d565b5b600061274984828501612521565b91505092915050565b61275b81612629565b811461276657600080fd5b50565b60008135905061277881612752565b92915050565b61278781612660565b811461279257600080fd5b50565b6000813590506127a48161277e565b92915050565b60008060008060008060c087890312156127c7576127c661249d565b5b60006127d589828a016124eb565b96505060206127e689828a01612521565b95505060406127f789828a01612521565b945050606061280889828a01612769565b935050608061281989828a01612795565b92505060a061282a89828a01612795565b9150509295509295509295565b600080600080600080600060e0888a0312156128565761285561249d565b5b60006128648a828b016124eb565b97505060206128758a828b016124eb565b96505060406128868a828b01612521565b95505060606128978a828b01612521565b94505060806128a88a828b01612769565b93505060a06128b98a828b01612795565b92505060c06128ca8a828b01612795565b91505092959891949750929550565b600080604083850312156128f0576128ef61249d565b5b60006128fe858286016124eb565b925050602061290f858286016124eb565b9150509250929050565b612922816126eb565b811461292d57600080fd5b50565b60008135905061293f81612919565b92915050565b6000806040838503121561295c5761295b61249d565b5b600061296a858286016124eb565b925050602061297b85828601612930565b9150509250929050565b61298e816126eb565b82525050565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff82169050919050565b6129c581612994565b82525050565b6040820160008201516129e16000850182612985565b5060208201516129f460208501826129bc565b50505050565b6000604082019050612a0f60008301846129cb565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612a5c57607f821691505b60208210811415612a7057612a6f612a15565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000612ad26028836123ed565b9150612add82612a76565b604082019050919050565b60006020820190508181036000830152612b0181612ac5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b4282612500565b9150612b4d83612500565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b8257612b81612b08565b5b828201905092915050565b7f4552433230566f7465733a20626c6f636b206e6f7420796574206d696e656400600082015250565b6000612bc3601f836123ed565b9150612bce82612b8d565b602082019050919050565b60006020820190508181036000830152612bf281612bb6565b9050919050565b6000612c0482612500565b9150612c0f83612500565b925082821015612c2257612c21612b08565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000612cb86025836123ed565b9150612cc382612c5c565b604082019050919050565b60006020820190508181036000830152612ce781612cab565b9050919050565b7f4552433230566f7465733a207369676e61747572652065787069726564000000600082015250565b6000612d24601d836123ed565b9150612d2f82612cee565b602082019050919050565b60006020820190508181036000830152612d5381612d17565b9050919050565b6000608082019050612d6f600083018761266a565b612d7c60208301866126c1565b612d8960408301856125ac565b612d9660608301846125ac565b95945050505050565b7f4552433230566f7465733a20696e76616c6964206e6f6e636500000000000000600082015250565b6000612dd56019836123ed565b9150612de082612d9f565b602082019050919050565b60006020820190508181036000830152612e0481612dc8565b9050919050565b7f45524332305065726d69743a206578706972656420646561646c696e65000000600082015250565b6000612e41601d836123ed565b9150612e4c82612e0b565b602082019050919050565b60006020820190508181036000830152612e7081612e34565b9050919050565b600060c082019050612e8c600083018961266a565b612e9960208301886126c1565b612ea660408301876126c1565b612eb360608301866125ac565b612ec060808301856125ac565b612ecd60a08301846125ac565b979650505050505050565b7f45524332305065726d69743a20696e76616c6964207369676e61747572650000600082015250565b6000612f0e601e836123ed565b9150612f1982612ed8565b602082019050919050565b60006020820190508181036000830152612f3d81612f01565b9050919050565b7f4552433230566f7465733a20746f74616c20737570706c79207269736b73206f60008201527f766572666c6f77696e6720766f74657300000000000000000000000000000000602082015250565b6000612fa06030836123ed565b9150612fab82612f44565b604082019050919050565b60006020820190508181036000830152612fcf81612f93565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600061300c601f836123ed565b915061301782612fd6565b602082019050919050565b6000602082019050818103600083015261303b81612fff565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203260008201527f3234206269747300000000000000000000000000000000000000000000000000602082015250565b600061309e6027836123ed565b91506130a982613042565b604082019050919050565b600060208201905081810360008301526130cd81613091565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203360008201527f3220626974730000000000000000000000000000000000000000000000000000602082015250565b60006131306026836123ed565b915061313b826130d4565b604082019050919050565b6000602082019050818103600083015261315f81613123565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006131c26024836123ed565b91506131cd82613166565b604082019050919050565b600060208201905081810360008301526131f1816131b5565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006132546022836123ed565b915061325f826131f8565b604082019050919050565b6000602082019050818103600083015261328381613247565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006132e66025836123ed565b91506132f18261328a565b604082019050919050565b60006020820190508181036000830152613315816132d9565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b60006133786023836123ed565b91506133838261331c565b604082019050919050565b600060208201905081810360008301526133a78161336b565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b600061340a6026836123ed565b9150613415826133ae565b604082019050919050565b60006020820190508181036000830152613439816133fd565b9050919050565b600060408201905061345560008301856125ac565b61346260208301846125ac565b9392505050565b600060a08201905061347e600083018861266a565b61348b602083018761266a565b613498604083018661266a565b6134a560608301856125ac565b6134b260808301846126c1565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006134f682612500565b915061350183612500565b925082613511576135106134bc565b5b828204905092915050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b600061355d60028361351c565b915061356882613527565b600282019050919050565b6000819050919050565b61358e61358982612660565b613573565b82525050565b600061359f82613550565b91506135ab828561357d565b6020820191506135bb828461357d565b6020820191508190509392505050565b60006080820190506135e0600083018761266a565b6135ed6020830186612636565b6135fa604083018561266a565b613607606083018461266a565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b60006136756018836123ed565b91506136808261363f565b602082019050919050565b600060208201905081810360008301526136a481613668565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b60006136e1601f836123ed565b91506136ec826136ab565b602082019050919050565b60006020820190508181036000830152613710816136d4565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006137736022836123ed565b915061377e82613717565b604082019050919050565b600060208201905081810360008301526137a281613766565b9050919050565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b60006138056022836123ed565b9150613810826137a9565b604082019050919050565b60006020820190508181036000830152613834816137f8565b905091905056fea2646970667358221220bb5f938b5fd56ec8f047c714237093cee9811569b955c31053ee44725d55e9ac64736f6c634300080b0033

Deployed Bytecode Sourcemap

141:1362:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2120:98:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4217:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3208:106;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4850:478;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3057:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2440:113:12;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5723:212:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3267:248:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2686:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5656:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2449:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3372:125:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2190:126:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3794:239:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2331:102:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2882:192:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6422:405:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3700:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5836:565:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1503:626:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3930:149:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2226:148:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2120:98:3;2174:13;2206:5;2199:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2120:98;:::o;4217:166::-;4300:4;4316:39;4325:12;:10;:12::i;:::-;4339:7;4348:6;4316:8;:39::i;:::-;4372:4;4365:11;;4217:166;;;;:::o;3208:106::-;3269:7;3295:12;;3288:19;;3208:106;:::o;4850:478::-;4986:4;5002:36;5012:6;5020:9;5031:6;5002:9;:36::i;:::-;5049:24;5076:11;:19;5088:6;5076:19;;;;;;;;;;;;;;;:33;5096:12;:10;:12::i;:::-;5076:33;;;;;;;;;;;;;;;;5049:60;;5147:6;5127:16;:26;;5119:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;5232:57;5241:6;5249:12;:10;:12::i;:::-;5282:6;5263:16;:25;5232:8;:57::i;:::-;5317:4;5310:11;;;4850:478;;;;;:::o;3057:91::-;3115:5;3139:2;3132:9;;3057:91;:::o;2440:113:12:-;2500:7;2526:20;:18;:20::i;:::-;2519:27;;2440:113;:::o;5723:212:3:-;5811:4;5827:80;5836:12;:10;:12::i;:::-;5850:7;5896:10;5859:11;:25;5871:12;:10;:12::i;:::-;5859:25;;;;;;;;;;;;;;;:34;5885:7;5859:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;5827:8;:80::i;:::-;5924:4;5917:11;;5723:212;;;;:::o;3267:248:4:-;3348:7;3389:12;3375:11;:26;3367:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;3454:54;3473:12;:21;3486:7;3473:21;;;;;;;;;;;;;;;3496:11;3454:18;:54::i;:::-;3447:61;;3267:248;;;;:::o;2686:117::-;2751:7;2777:10;:19;2788:7;2777:19;;;;;;;;;;;;;;;;;;;;;;;;;2770:26;;2686:117;;;:::o;5656:103::-;5718:34;5728:12;:10;:12::i;:::-;5742:9;5718;:34::i;:::-;5656:103;:::o;2449:149::-;2519:6;2544:47;2562:12;:21;2575:7;2562:21;;;;;;;;;;;;;;;:28;;;;2544:17;:47::i;:::-;2537:54;;2449:149;;;:::o;3372:125:3:-;3446:7;3472:9;:18;3482:7;3472:18;;;;;;;;;;;;;;;;3465:25;;3372:125;;;:::o;2190:126:12:-;2259:7;2285:24;:7;:14;2293:5;2285:14;;;;;;;;;;;;;;;:22;:24::i;:::-;2278:31;;2190:126;;;:::o;3794:239:4:-;3864:7;3905:12;3891:11;:26;3883:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;3970:56;3989:23;4014:11;3970:18;:56::i;:::-;3963:63;;3794:239;;;:::o;2331:102:3:-;2387:13;2419:7;2412:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2331:102;:::o;2882:192:4:-;2938:7;2957:11;2971:12;:21;2984:7;2971:21;;;;;;;;;;;;;;;:28;;;;2957:42;;3023:1;3016:3;:8;:51;;3031:12;:21;3044:7;3031:21;;;;;;;;;;;;;;;3059:1;3053:3;:7;;;;:::i;:::-;3031:30;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;;;;;;;;;3016:51;;;3027:1;3016:51;3009:58;;;;;2882:192;;;:::o;6422:405:3:-;6515:4;6531:24;6558:11;:25;6570:12;:10;:12::i;:::-;6558:25;;;;;;;;;;;;;;;:34;6584:7;6558:34;;;;;;;;;;;;;;;;6531:61;;6630:15;6610:16;:35;;6602:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;6721:67;6730:12;:10;:12::i;:::-;6744:7;6772:15;6753:16;:34;6721:8;:67::i;:::-;6816:4;6809:11;;;6422:405;;;;:::o;3700:172::-;3786:4;3802:42;3812:12;:10;:12::i;:::-;3826:9;3837:6;3802:9;:42::i;:::-;3861:4;3854:11;;3700:172;;;;:::o;5836:565:4:-;6046:6;6027:15;:25;;6019:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;6096:14;6113:169;6140:87;1496:71;6200:9;6211:5;6218:6;6167:58;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6157:69;;;;;;6140:16;:87::i;:::-;6241:1;6256;6271;6113:13;:169::i;:::-;6096:186;;6309:17;6319:6;6309:9;:17::i;:::-;6300:5;:26;6292:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;6366:28;6376:6;6384:9;6366;:28::i;:::-;6009:392;5836:565;;;;;;:::o;1503:626:12:-;1738:8;1719:15;:27;;1711:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1791:18;1833:16;1851:5;1858:7;1867:5;1874:16;1884:5;1874:9;:16::i;:::-;1892:8;1822:79;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1812:90;;;;;;1791:111;;1913:12;1928:28;1945:10;1928:16;:28::i;:::-;1913:43;;1967:14;1984:28;1998:4;2004:1;2007;2010;1984:13;:28::i;:::-;1967:45;;2040:5;2030:15;;:6;:15;;;2022:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;2091:31;2100:5;2107:7;2116:5;2091:8;:31::i;:::-;1701:428;;;1503:626;;;;;;;:::o;3930:149:3:-;4019:7;4045:11;:18;4057:5;4045:18;;;;;;;;;;;;;;;:27;4064:7;4045:27;;;;;;;;;;;;;;;;4038:34;;3930:149;;;;:::o;2226:148:4:-;2305:17;;:::i;:::-;2341:12;:21;2354:7;2341:21;;;;;;;;;;;;;;;2363:3;2341:26;;;;;;;;;;:::i;:::-;;;;;;;;;2334:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2226:148;;;;:::o;6695:285::-;6779:28;6791:7;6800:6;6779:11;:28::i;:::-;6842:12;:10;:12::i;:::-;6825:29;;:13;:11;:13::i;:::-;:29;;6817:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;6918:55;6935:23;6960:4;6966:6;6918:16;:55::i;:::-;;;6695:285;;:::o;8290:389:3:-;8392:1;8373:21;;:7;:21;;;;8365:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;8441:49;8470:1;8474:7;8483:6;8441:20;:49::i;:::-;8517:6;8501:12;;:22;;;;;;;:::i;:::-;;;;;;;;8555:6;8533:9;:18;8543:7;8533:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;8597:7;8576:37;;8593:1;8576:37;;;8606:6;8576:37;;;;;;:::i;:::-;;;;;;;;8624:48;8652:1;8656:7;8665:6;8624:19;:48::i;:::-;8290:389;;:::o;9459:96:4:-;9517:7;9547:1;9543;:5;;;;:::i;:::-;9536:12;;9459:96;;;;:::o;1135:192:9:-;1192:7;1228:17;1219:26;;:5;:26;;1211:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;1314:5;1299:21;;1135:192;;;:::o;3045:187::-;3101:6;3136:16;3127:25;;:5;:25;;3119:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;3219:5;3205:20;;3045:187;;;:::o;7392:254:4:-;7529:43;7555:4;7561:2;7565:6;7529:25;:43::i;:::-;7583:56;7600:15;7610:4;7600:9;:15::i;:::-;7617:13;7627:2;7617:9;:13::i;:::-;7632:6;7583:16;:56::i;:::-;7392:254;;;:::o;11661:120:3:-;;;;:::o;9561:101:4:-;9624:7;9654:1;9650;:5;;;;:::i;:::-;9643:12;;9561:101;;;;:::o;640:96:0:-;693:7;719:10;712:17;;640:96;:::o;9998:370:3:-;10146:1;10129:19;;:5;:19;;;;10121:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10226:1;10207:21;;:7;:21;;;;10199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10308:6;10278:11;:18;10290:5;10278:18;;;;;;;;;;;;;;;:27;10297:7;10278:27;;;;;;;;;;;;;;;:36;;;;10345:7;10329:32;;10338:5;10329:32;;;10354:6;10329:32;;;;;;:::i;:::-;;;;;;;;9998:370;;;:::o;7301:713::-;7454:1;7436:20;;:6;:20;;;;7428:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;7537:1;7516:23;;:9;:23;;;;7508:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;7590:47;7611:6;7619:9;7630:6;7590:20;:47::i;:::-;7648:21;7672:9;:17;7682:6;7672:17;;;;;;;;;;;;;;;;7648:41;;7724:6;7707:13;:23;;7699:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7843:6;7827:13;:22;7807:9;:17;7817:6;7807:17;;;;;;;;;;;;;;;:42;;;;7893:6;7869:9;:20;7879:9;7869:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;7932:9;7915:35;;7924:6;7915:35;;;7943:6;7915:35;;;;;;:::i;:::-;;;;;;;;7961:46;7981:6;7989:9;8000:6;7961:19;:46::i;:::-;7418:596;7301:713;;;:::o;3143:308:11:-;3196:7;3236:12;3219:29;;3227:4;3219:29;;;:66;;;;;3269:16;3252:13;:33;3219:66;3215:230;;;3308:24;3301:31;;;;3215:230;3370:64;3392:10;3404:12;3418:15;3370:21;:64::i;:::-;3363:71;;3143:308;;:::o;4117:1458:4:-;4216:7;5223:12;5238:5;:12;;;;5223:27;;5260:11;5285:229;5298:4;5292:3;:10;5285:229;;;5318:11;5332:23;5345:3;5350:4;5332:12;:23::i;:::-;5318:37;;5396:11;5373:5;5379:3;5373:10;;;;;;;;:::i;:::-;;;;;;;;;:20;;;;;;;;;;;;:34;;;5369:135;;;5434:3;5427:10;;5369:135;;;5488:1;5482:3;:7;;;;:::i;:::-;5476:13;;5369:135;5304:210;5285:229;;;5539:1;5531:4;:9;:37;;5547:5;5560:1;5553:4;:8;;;;:::i;:::-;5547:15;;;;;;;;:::i;:::-;;;;;;;;;:21;;;;;;;;;;;;5531:37;;;5543:1;5531:37;5524:44;;;;;;4117:1458;;;;:::o;7803:380::-;7887:23;7913:20;7923:9;7913;:20::i;:::-;7887:46;;7943:24;7970:20;7980:9;7970;:20::i;:::-;7943:47;;8024:9;8000:10;:21;8011:9;8000:21;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;8093:9;8049:54;;8076:15;8049:54;;8065:9;8049:54;;;;;;;;;;;;8114:62;8131:15;8148:9;8159:16;8114;:62::i;:::-;7877:306;;7803:380;;:::o;827:112:1:-;892:7;918;:14;;;911:21;;827:112;;;:::o;4339:165:11:-;4416:7;4442:55;4464:20;:18;:20::i;:::-;4486:10;4442:21;:55::i;:::-;4435:62;;4339:165;;;:::o;7479:270:2:-;7602:7;7622:17;7641:18;7663:25;7674:4;7680:1;7683;7686;7663:10;:25::i;:::-;7621:67;;;;7698:18;7710:5;7698:11;:18::i;:::-;7733:9;7726:16;;;;7479:270;;;;;;:::o;2684:203:12:-;2744:15;2771:30;2804:7;:14;2812:5;2804:14;;;;;;;;;;;;;;;2771:47;;2838:15;:5;:13;:15::i;:::-;2828:25;;2863:17;:5;:15;:17::i;:::-;2761:126;2684:203;;;:::o;6503:103:4:-;6556:7;6582:17;6575:24;;6503:103;:::o;8822:631::-;8992:17;9011;9040:11;9054:5;:12;;;;9040:26;;9095:1;9088:3;:8;:35;;9103:5;9115:1;9109:3;:7;;;;:::i;:::-;9103:14;;;;;;;;:::i;:::-;;;;;;;;;:20;;;;;;;;;;;;9088:35;;;9099:1;9088:35;9076:47;;;;9145:20;9148:9;9159:5;9145:2;:20;;:::i;:::-;9133:32;;9186:1;9180:3;:7;:51;;;;;9219:12;9191:5;9203:1;9197:3;:7;;;;:::i;:::-;9191:14;;;;;;;;:::i;:::-;;;;;;;;;:24;;;;;;;;;;;;:40;;;9180:51;9176:271;;;9270:29;9289:9;9270:18;:29::i;:::-;9247:5;9259:1;9253:3;:7;;;;:::i;:::-;9247:14;;;;;;;;:::i;:::-;;;;;;;;;:20;;;:52;;;;;;;;;;;;;;;;;;9176:271;;;9330:5;9341:94;;;;;;;;9364:31;9382:12;9364:17;:31::i;:::-;9341:94;;;;;;9404:29;9423:9;9404:18;:29::i;:::-;9341:94;;;;;9330:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9176:271;9030:423;8822:631;;;;;;:::o;10952:121:3:-;;;;:::o;1011:188:5:-;1149:43;1175:4;1181:2;1185:6;1149:25;:43::i;:::-;1011:188;;;:::o;8189:627:4:-;8316:3;8309:10;;:3;:10;;;;:24;;;;;8332:1;8323:6;:10;8309:24;8305:505;;;8368:1;8353:17;;:3;:17;;;8349:221;;8391:17;8410;8431:54;8448:12;:17;8461:3;8448:17;;;;;;;;;;;;;;;8467:9;8478:6;8431:16;:54::i;:::-;8390:95;;;;8529:3;8508:47;;;8534:9;8545;8508:47;;;;;;;:::i;:::-;;;;;;;;8372:198;;8349:221;8603:1;8588:17;;:3;:17;;;8584:216;;8626:17;8645;8666:49;8683:12;:17;8696:3;8683:17;;;;;;;;;;;;;;;8702:4;8708:6;8666:16;:49::i;:::-;8625:90;;;;8759:3;8738:47;;;8764:9;8775;8738:47;;;;;;;:::i;:::-;;;;;;;;8607:193;;8584:216;8305:505;8189:627;;;:::o;3457:257:11:-;3597:7;3644:8;3654;3664:11;3677:13;3700:4;3633:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3623:84;;;;;;3616:91;;3457:257;;;;;:::o;663:153:8:-;725:7;808:1;803;799;:5;798:11;;;;:::i;:::-;793:1;789;:5;788:21;;;;:::i;:::-;781:28;;663:153;;;;:::o;9124:194:2:-;9217:7;9282:15;9299:10;9253:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9243:68;;;;;;9236:75;;9124:194;;;;:::o;5743:1603::-;5869:7;5878:12;6793:66;6788:1;6780:10;;:79;6776:161;;;6891:1;6895:30;6875:51;;;;;;6776:161;6955:2;6950:1;:7;;;;:18;;;;;6966:2;6961:1;:7;;;;6950:18;6946:100;;;7000:1;7004:30;6984:51;;;;;;6946:100;7140:14;7157:24;7167:4;7173:1;7176;7179;7157:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7140:41;;7213:1;7195:20;;:6;:20;;;7191:101;;;7247:1;7251:29;7231:50;;;;;;;7191:101;7310:6;7318:20;7302:37;;;;;5743:1603;;;;;;;;:::o;532:631::-;609:20;600:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;596:561;;;645:7;;596:561;705:29;696:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;692:465;;;750:34;;;;;;;;;;:::i;:::-;;;;;;;;692:465;814:35;805:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;801:356;;;865:41;;;;;;;;;;:::i;:::-;;;;;;;;801:356;936:30;927:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;923:234;;;982:44;;;;;;;;;;:::i;:::-;;;;;;;;923:234;1056:30;1047:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;1043:114;;;1102:44;;;;;;;;;;:::i;:::-;;;;;;;;1043:114;532:631;;:::o;945:123:1:-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:99:14:-;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:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1478:117::-;1587:1;1584;1577:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:118::-;3581:24;3599:5;3581:24;:::i;:::-;3576:3;3569:37;3494:118;;:::o;3618:222::-;3711:4;3749:2;3738:9;3734:18;3726:26;;3762:71;3830:1;3819:9;3815:17;3806:6;3762:71;:::i;:::-;3618:222;;;;:::o;3846:619::-;3923:6;3931;3939;3988:2;3976:9;3967:7;3963:23;3959:32;3956:119;;;3994:79;;:::i;:::-;3956:119;4114:1;4139:53;4184:7;4175:6;4164:9;4160:22;4139:53;:::i;:::-;4129:63;;4085:117;4241:2;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4212:118;4369:2;4395:53;4440:7;4431:6;4420:9;4416:22;4395:53;:::i;:::-;4385:63;;4340:118;3846:619;;;;;:::o;4471:86::-;4506:7;4546:4;4539:5;4535:16;4524:27;;4471:86;;;:::o;4563:112::-;4646:22;4662:5;4646:22;:::i;:::-;4641:3;4634:35;4563:112;;:::o;4681:214::-;4770:4;4808:2;4797:9;4793:18;4785:26;;4821:67;4885:1;4874:9;4870:17;4861:6;4821:67;:::i;:::-;4681:214;;;;:::o;4901:77::-;4938:7;4967:5;4956:16;;4901:77;;;:::o;4984:118::-;5071:24;5089:5;5071:24;:::i;:::-;5066:3;5059:37;4984:118;;:::o;5108:222::-;5201:4;5239:2;5228:9;5224:18;5216:26;;5252:71;5320:1;5309:9;5305:17;5296:6;5252:71;:::i;:::-;5108:222;;;;:::o;5336:329::-;5395:6;5444:2;5432:9;5423:7;5419:23;5415:32;5412:119;;;5450:79;;:::i;:::-;5412:119;5570:1;5595:53;5640:7;5631:6;5620:9;5616:22;5595:53;:::i;:::-;5585:63;;5541:117;5336:329;;;;:::o;5671:118::-;5758:24;5776:5;5758:24;:::i;:::-;5753:3;5746:37;5671:118;;:::o;5795:222::-;5888:4;5926:2;5915:9;5911:18;5903:26;;5939:71;6007:1;5996:9;5992:17;5983:6;5939:71;:::i;:::-;5795:222;;;;:::o;6023:93::-;6059:7;6099:10;6092:5;6088:22;6077:33;;6023:93;;;:::o;6122:115::-;6207:23;6224:5;6207:23;:::i;:::-;6202:3;6195:36;6122:115;;:::o;6243:218::-;6334:4;6372:2;6361:9;6357:18;6349:26;;6385:69;6451:1;6440:9;6436:17;6427:6;6385:69;:::i;:::-;6243:218;;;;:::o;6467:329::-;6526:6;6575:2;6563:9;6554:7;6550:23;6546:32;6543:119;;;6581:79;;:::i;:::-;6543:119;6701:1;6726:53;6771:7;6762:6;6751:9;6747:22;6726:53;:::i;:::-;6716:63;;6672:117;6467:329;;;;:::o;6802:118::-;6873:22;6889:5;6873:22;:::i;:::-;6866:5;6863:33;6853:61;;6910:1;6907;6900:12;6853:61;6802:118;:::o;6926:135::-;6970:5;7008:6;6995:20;6986:29;;7024:31;7049:5;7024:31;:::i;:::-;6926:135;;;;:::o;7067:122::-;7140:24;7158:5;7140:24;:::i;:::-;7133:5;7130:35;7120:63;;7179:1;7176;7169:12;7120:63;7067:122;:::o;7195:139::-;7241:5;7279:6;7266:20;7257:29;;7295:33;7322:5;7295:33;:::i;:::-;7195:139;;;;:::o;7340:1053::-;7442:6;7450;7458;7466;7474;7482;7531:3;7519:9;7510:7;7506:23;7502:33;7499:120;;;7538:79;;:::i;:::-;7499:120;7658:1;7683:53;7728:7;7719:6;7708:9;7704:22;7683:53;:::i;:::-;7673:63;;7629:117;7785:2;7811:53;7856:7;7847:6;7836:9;7832:22;7811:53;:::i;:::-;7801:63;;7756:118;7913:2;7939:53;7984:7;7975:6;7964:9;7960:22;7939:53;:::i;:::-;7929:63;;7884:118;8041:2;8067:51;8110:7;8101:6;8090:9;8086:22;8067:51;:::i;:::-;8057:61;;8012:116;8167:3;8194:53;8239:7;8230:6;8219:9;8215:22;8194:53;:::i;:::-;8184:63;;8138:119;8296:3;8323:53;8368:7;8359:6;8348:9;8344:22;8323:53;:::i;:::-;8313:63;;8267:119;7340:1053;;;;;;;;:::o;8399:1199::-;8510:6;8518;8526;8534;8542;8550;8558;8607:3;8595:9;8586:7;8582:23;8578:33;8575:120;;;8614:79;;:::i;:::-;8575:120;8734:1;8759:53;8804:7;8795:6;8784:9;8780:22;8759:53;:::i;:::-;8749:63;;8705:117;8861:2;8887:53;8932:7;8923:6;8912:9;8908:22;8887:53;:::i;:::-;8877:63;;8832:118;8989:2;9015:53;9060:7;9051:6;9040:9;9036:22;9015:53;:::i;:::-;9005:63;;8960:118;9117:2;9143:53;9188:7;9179:6;9168:9;9164:22;9143:53;:::i;:::-;9133:63;;9088:118;9245:3;9272:51;9315:7;9306:6;9295:9;9291:22;9272:51;:::i;:::-;9262:61;;9216:117;9372:3;9399:53;9444:7;9435:6;9424:9;9420:22;9399:53;:::i;:::-;9389:63;;9343:119;9501:3;9528:53;9573:7;9564:6;9553:9;9549:22;9528:53;:::i;:::-;9518:63;;9472:119;8399:1199;;;;;;;;;;:::o;9604:474::-;9672:6;9680;9729:2;9717:9;9708:7;9704:23;9700:32;9697:119;;;9735:79;;:::i;:::-;9697:119;9855:1;9880:53;9925:7;9916:6;9905:9;9901:22;9880:53;:::i;:::-;9870:63;;9826:117;9982:2;10008:53;10053:7;10044:6;10033:9;10029:22;10008:53;:::i;:::-;9998:63;;9953:118;9604:474;;;;;:::o;10084:120::-;10156:23;10173:5;10156:23;:::i;:::-;10149:5;10146:34;10136:62;;10194:1;10191;10184:12;10136:62;10084:120;:::o;10210:137::-;10255:5;10293:6;10280:20;10271:29;;10309:32;10335:5;10309:32;:::i;:::-;10210:137;;;;:::o;10353:472::-;10420:6;10428;10477:2;10465:9;10456:7;10452:23;10448:32;10445:119;;;10483:79;;:::i;:::-;10445:119;10603:1;10628:53;10673:7;10664:6;10653:9;10649:22;10628:53;:::i;:::-;10618:63;;10574:117;10730:2;10756:52;10800:7;10791:6;10780:9;10776:22;10756:52;:::i;:::-;10746:62;;10701:117;10353:472;;;;;:::o;10831:105::-;10906:23;10923:5;10906:23;:::i;:::-;10901:3;10894:36;10831:105;;:::o;10942:142::-;10979:7;11019:58;11012:5;11008:70;10997:81;;10942:142;;;:::o;11090:108::-;11167:24;11185:5;11167:24;:::i;:::-;11162:3;11155:37;11090:108;;:::o;11272:517::-;11425:4;11420:3;11416:14;11517:4;11510:5;11506:16;11500:23;11536:61;11591:4;11586:3;11582:14;11568:12;11536:61;:::i;:::-;11440:167;11690:4;11683:5;11679:16;11673:23;11709:63;11766:4;11761:3;11757:14;11743:12;11709:63;:::i;:::-;11617:165;11394:395;11272:517;;:::o;11795:334::-;11944:4;11982:2;11971:9;11967:18;11959:26;;11995:127;12119:1;12108:9;12104:17;12095:6;11995:127;:::i;:::-;11795:334;;;;:::o;12135:180::-;12183:77;12180:1;12173:88;12280:4;12277:1;12270:15;12304:4;12301:1;12294:15;12321:320;12365:6;12402:1;12396:4;12392:12;12382:22;;12449:1;12443:4;12439:12;12470:18;12460:81;;12526:4;12518:6;12514:17;12504:27;;12460:81;12588:2;12580:6;12577:14;12557:18;12554:38;12551:84;;;12607:18;;:::i;:::-;12551:84;12372:269;12321:320;;;:::o;12647:227::-;12787:34;12783:1;12775:6;12771:14;12764:58;12856:10;12851:2;12843:6;12839:15;12832:35;12647:227;:::o;12880:366::-;13022:3;13043:67;13107:2;13102:3;13043:67;:::i;:::-;13036:74;;13119:93;13208:3;13119:93;:::i;:::-;13237:2;13232:3;13228:12;13221:19;;12880:366;;;:::o;13252:419::-;13418:4;13456:2;13445:9;13441:18;13433:26;;13505:9;13499:4;13495:20;13491:1;13480:9;13476:17;13469:47;13533:131;13659:4;13533:131;:::i;:::-;13525:139;;13252:419;;;:::o;13677:180::-;13725:77;13722:1;13715:88;13822:4;13819:1;13812:15;13846:4;13843:1;13836:15;13863:305;13903:3;13922:20;13940:1;13922:20;:::i;:::-;13917:25;;13956:20;13974:1;13956:20;:::i;:::-;13951:25;;14110:1;14042:66;14038:74;14035:1;14032:81;14029:107;;;14116:18;;:::i;:::-;14029:107;14160:1;14157;14153:9;14146:16;;13863:305;;;;:::o;14174:181::-;14314:33;14310:1;14302:6;14298:14;14291:57;14174:181;:::o;14361:366::-;14503:3;14524:67;14588:2;14583:3;14524:67;:::i;:::-;14517:74;;14600:93;14689:3;14600:93;:::i;:::-;14718:2;14713:3;14709:12;14702:19;;14361:366;;;:::o;14733:419::-;14899:4;14937:2;14926:9;14922:18;14914:26;;14986:9;14980:4;14976:20;14972:1;14961:9;14957:17;14950:47;15014:131;15140:4;15014:131;:::i;:::-;15006:139;;14733:419;;;:::o;15158:191::-;15198:4;15218:20;15236:1;15218:20;:::i;:::-;15213:25;;15252:20;15270:1;15252:20;:::i;:::-;15247:25;;15291:1;15288;15285:8;15282:34;;;15296:18;;:::i;:::-;15282:34;15341:1;15338;15334:9;15326:17;;15158:191;;;;:::o;15355:180::-;15403:77;15400:1;15393:88;15500:4;15497:1;15490:15;15524:4;15521:1;15514:15;15541:224;15681:34;15677:1;15669:6;15665:14;15658:58;15750:7;15745:2;15737:6;15733:15;15726:32;15541:224;:::o;15771:366::-;15913:3;15934:67;15998:2;15993:3;15934:67;:::i;:::-;15927:74;;16010:93;16099:3;16010:93;:::i;:::-;16128:2;16123:3;16119:12;16112:19;;15771:366;;;:::o;16143:419::-;16309:4;16347:2;16336:9;16332:18;16324:26;;16396:9;16390:4;16386:20;16382:1;16371:9;16367:17;16360:47;16424:131;16550:4;16424:131;:::i;:::-;16416:139;;16143:419;;;:::o;16568:179::-;16708:31;16704:1;16696:6;16692:14;16685:55;16568:179;:::o;16753:366::-;16895:3;16916:67;16980:2;16975:3;16916:67;:::i;:::-;16909:74;;16992:93;17081:3;16992:93;:::i;:::-;17110:2;17105:3;17101:12;17094:19;;16753:366;;;:::o;17125:419::-;17291:4;17329:2;17318:9;17314:18;17306:26;;17378:9;17372:4;17368:20;17364:1;17353:9;17349:17;17342:47;17406:131;17532:4;17406:131;:::i;:::-;17398:139;;17125:419;;;:::o;17550:553::-;17727:4;17765:3;17754:9;17750:19;17742:27;;17779:71;17847:1;17836:9;17832:17;17823:6;17779:71;:::i;:::-;17860:72;17928:2;17917:9;17913:18;17904:6;17860:72;:::i;:::-;17942;18010:2;17999:9;17995:18;17986:6;17942:72;:::i;:::-;18024;18092:2;18081:9;18077:18;18068:6;18024:72;:::i;:::-;17550:553;;;;;;;:::o;18109:175::-;18249:27;18245:1;18237:6;18233:14;18226:51;18109:175;:::o;18290:366::-;18432:3;18453:67;18517:2;18512:3;18453:67;:::i;:::-;18446:74;;18529:93;18618:3;18529:93;:::i;:::-;18647:2;18642:3;18638:12;18631:19;;18290:366;;;:::o;18662:419::-;18828:4;18866:2;18855:9;18851:18;18843:26;;18915:9;18909:4;18905:20;18901:1;18890:9;18886:17;18879:47;18943:131;19069:4;18943:131;:::i;:::-;18935:139;;18662:419;;;:::o;19087:179::-;19227:31;19223:1;19215:6;19211:14;19204:55;19087:179;:::o;19272:366::-;19414:3;19435:67;19499:2;19494:3;19435:67;:::i;:::-;19428:74;;19511:93;19600:3;19511:93;:::i;:::-;19629:2;19624:3;19620:12;19613:19;;19272:366;;;:::o;19644:419::-;19810:4;19848:2;19837:9;19833:18;19825:26;;19897:9;19891:4;19887:20;19883:1;19872:9;19868:17;19861:47;19925:131;20051:4;19925:131;:::i;:::-;19917:139;;19644:419;;;:::o;20069:775::-;20302:4;20340:3;20329:9;20325:19;20317:27;;20354:71;20422:1;20411:9;20407:17;20398:6;20354:71;:::i;:::-;20435:72;20503:2;20492:9;20488:18;20479:6;20435:72;:::i;:::-;20517;20585:2;20574:9;20570:18;20561:6;20517:72;:::i;:::-;20599;20667:2;20656:9;20652:18;20643:6;20599:72;:::i;:::-;20681:73;20749:3;20738:9;20734:19;20725:6;20681:73;:::i;:::-;20764;20832:3;20821:9;20817:19;20808:6;20764:73;:::i;:::-;20069:775;;;;;;;;;:::o;20850:180::-;20990:32;20986:1;20978:6;20974:14;20967:56;20850:180;:::o;21036:366::-;21178:3;21199:67;21263:2;21258:3;21199:67;:::i;:::-;21192:74;;21275:93;21364:3;21275:93;:::i;:::-;21393:2;21388:3;21384:12;21377:19;;21036:366;;;:::o;21408:419::-;21574:4;21612:2;21601:9;21597:18;21589:26;;21661:9;21655:4;21651:20;21647:1;21636:9;21632:17;21625:47;21689:131;21815:4;21689:131;:::i;:::-;21681:139;;21408:419;;;:::o;21833:235::-;21973:34;21969:1;21961:6;21957:14;21950:58;22042:18;22037:2;22029:6;22025:15;22018:43;21833:235;:::o;22074:366::-;22216:3;22237:67;22301:2;22296:3;22237:67;:::i;:::-;22230:74;;22313:93;22402:3;22313:93;:::i;:::-;22431:2;22426:3;22422:12;22415:19;;22074:366;;;:::o;22446:419::-;22612:4;22650:2;22639:9;22635:18;22627:26;;22699:9;22693:4;22689:20;22685:1;22674:9;22670:17;22663:47;22727:131;22853:4;22727:131;:::i;:::-;22719:139;;22446:419;;;:::o;22871:181::-;23011:33;23007:1;22999:6;22995:14;22988:57;22871:181;:::o;23058:366::-;23200:3;23221:67;23285:2;23280:3;23221:67;:::i;:::-;23214:74;;23297:93;23386:3;23297:93;:::i;:::-;23415:2;23410:3;23406:12;23399:19;;23058:366;;;:::o;23430:419::-;23596:4;23634:2;23623:9;23619:18;23611:26;;23683:9;23677:4;23673:20;23669:1;23658:9;23654:17;23647:47;23711:131;23837:4;23711:131;:::i;:::-;23703:139;;23430:419;;;:::o;23855:226::-;23995:34;23991:1;23983:6;23979:14;23972:58;24064:9;24059:2;24051:6;24047:15;24040:34;23855:226;:::o;24087:366::-;24229:3;24250:67;24314:2;24309:3;24250:67;:::i;:::-;24243:74;;24326:93;24415:3;24326:93;:::i;:::-;24444:2;24439:3;24435:12;24428:19;;24087:366;;;:::o;24459:419::-;24625:4;24663:2;24652:9;24648:18;24640:26;;24712:9;24706:4;24702:20;24698:1;24687:9;24683:17;24676:47;24740:131;24866:4;24740:131;:::i;:::-;24732:139;;24459:419;;;:::o;24884:225::-;25024:34;25020:1;25012:6;25008:14;25001:58;25093:8;25088:2;25080:6;25076:15;25069:33;24884:225;:::o;25115:366::-;25257:3;25278:67;25342:2;25337:3;25278:67;:::i;:::-;25271:74;;25354:93;25443:3;25354:93;:::i;:::-;25472:2;25467:3;25463:12;25456:19;;25115:366;;;:::o;25487:419::-;25653:4;25691:2;25680:9;25676:18;25668:26;;25740:9;25734:4;25730:20;25726:1;25715:9;25711:17;25704:47;25768:131;25894:4;25768:131;:::i;:::-;25760:139;;25487:419;;;:::o;25912:223::-;26052:34;26048:1;26040:6;26036:14;26029:58;26121:6;26116:2;26108:6;26104:15;26097:31;25912:223;:::o;26141:366::-;26283:3;26304:67;26368:2;26363:3;26304:67;:::i;:::-;26297:74;;26380:93;26469:3;26380:93;:::i;:::-;26498:2;26493:3;26489:12;26482:19;;26141:366;;;:::o;26513:419::-;26679:4;26717:2;26706:9;26702:18;26694:26;;26766:9;26760:4;26756:20;26752:1;26741:9;26737:17;26730:47;26794:131;26920:4;26794:131;:::i;:::-;26786:139;;26513:419;;;:::o;26938:221::-;27078:34;27074:1;27066:6;27062:14;27055:58;27147:4;27142:2;27134:6;27130:15;27123:29;26938:221;:::o;27165:366::-;27307:3;27328:67;27392:2;27387:3;27328:67;:::i;:::-;27321:74;;27404:93;27493:3;27404:93;:::i;:::-;27522:2;27517:3;27513:12;27506:19;;27165:366;;;:::o;27537:419::-;27703:4;27741:2;27730:9;27726:18;27718:26;;27790:9;27784:4;27780:20;27776:1;27765:9;27761:17;27754:47;27818:131;27944:4;27818:131;:::i;:::-;27810:139;;27537:419;;;:::o;27962:224::-;28102:34;28098:1;28090:6;28086:14;28079:58;28171:7;28166:2;28158:6;28154:15;28147:32;27962:224;:::o;28192:366::-;28334:3;28355:67;28419:2;28414:3;28355:67;:::i;:::-;28348:74;;28431:93;28520:3;28431:93;:::i;:::-;28549:2;28544:3;28540:12;28533:19;;28192:366;;;:::o;28564:419::-;28730:4;28768:2;28757:9;28753:18;28745:26;;28817:9;28811:4;28807:20;28803:1;28792:9;28788:17;28781:47;28845:131;28971:4;28845:131;:::i;:::-;28837:139;;28564:419;;;:::o;28989:222::-;29129:34;29125:1;29117:6;29113:14;29106:58;29198:5;29193:2;29185:6;29181:15;29174:30;28989:222;:::o;29217:366::-;29359:3;29380:67;29444:2;29439:3;29380:67;:::i;:::-;29373:74;;29456:93;29545:3;29456:93;:::i;:::-;29574:2;29569:3;29565:12;29558:19;;29217:366;;;:::o;29589:419::-;29755:4;29793:2;29782:9;29778:18;29770:26;;29842:9;29836:4;29832:20;29828:1;29817:9;29813:17;29806:47;29870:131;29996:4;29870:131;:::i;:::-;29862:139;;29589:419;;;:::o;30014:225::-;30154:34;30150:1;30142:6;30138:14;30131:58;30223:8;30218:2;30210:6;30206:15;30199:33;30014:225;:::o;30245:366::-;30387:3;30408:67;30472:2;30467:3;30408:67;:::i;:::-;30401:74;;30484:93;30573:3;30484:93;:::i;:::-;30602:2;30597:3;30593:12;30586:19;;30245:366;;;:::o;30617:419::-;30783:4;30821:2;30810:9;30806:18;30798:26;;30870:9;30864:4;30860:20;30856:1;30845:9;30841:17;30834:47;30898:131;31024:4;30898:131;:::i;:::-;30890:139;;30617:419;;;:::o;31042:332::-;31163:4;31201:2;31190:9;31186:18;31178:26;;31214:71;31282:1;31271:9;31267:17;31258:6;31214:71;:::i;:::-;31295:72;31363:2;31352:9;31348:18;31339:6;31295:72;:::i;:::-;31042:332;;;;;:::o;31380:664::-;31585:4;31623:3;31612:9;31608:19;31600:27;;31637:71;31705:1;31694:9;31690:17;31681:6;31637:71;:::i;:::-;31718:72;31786:2;31775:9;31771:18;31762:6;31718:72;:::i;:::-;31800;31868:2;31857:9;31853:18;31844:6;31800:72;:::i;:::-;31882;31950:2;31939:9;31935:18;31926:6;31882:72;:::i;:::-;31964:73;32032:3;32021:9;32017:19;32008:6;31964:73;:::i;:::-;31380:664;;;;;;;;:::o;32050:180::-;32098:77;32095:1;32088:88;32195:4;32192:1;32185:15;32219:4;32216:1;32209:15;32236:185;32276:1;32293:20;32311:1;32293:20;:::i;:::-;32288:25;;32327:20;32345:1;32327:20;:::i;:::-;32322:25;;32366:1;32356:35;;32371:18;;:::i;:::-;32356:35;32413:1;32410;32406:9;32401:14;;32236:185;;;;:::o;32427:148::-;32529:11;32566:3;32551:18;;32427:148;;;;:::o;32581:214::-;32721:66;32717:1;32709:6;32705:14;32698:90;32581:214;:::o;32801:400::-;32961:3;32982:84;33064:1;33059:3;32982:84;:::i;:::-;32975:91;;33075:93;33164:3;33075:93;:::i;:::-;33193:1;33188:3;33184:11;33177:18;;32801:400;;;:::o;33207:79::-;33246:7;33275:5;33264:16;;33207:79;;;:::o;33292:157::-;33397:45;33417:24;33435:5;33417:24;:::i;:::-;33397:45;:::i;:::-;33392:3;33385:58;33292:157;;:::o;33455:663::-;33696:3;33718:148;33862:3;33718:148;:::i;:::-;33711:155;;33876:75;33947:3;33938:6;33876:75;:::i;:::-;33976:2;33971:3;33967:12;33960:19;;33989:75;34060:3;34051:6;33989:75;:::i;:::-;34089:2;34084:3;34080:12;34073:19;;34109:3;34102:10;;33455:663;;;;;:::o;34124:545::-;34297:4;34335:3;34324:9;34320:19;34312:27;;34349:71;34417:1;34406:9;34402:17;34393:6;34349:71;:::i;:::-;34430:68;34494:2;34483:9;34479:18;34470:6;34430:68;:::i;:::-;34508:72;34576:2;34565:9;34561:18;34552:6;34508:72;:::i;:::-;34590;34658:2;34647:9;34643:18;34634:6;34590:72;:::i;:::-;34124:545;;;;;;;:::o;34675:180::-;34723:77;34720:1;34713:88;34820:4;34817:1;34810:15;34844:4;34841:1;34834:15;34861:174;35001:26;34997:1;34989:6;34985:14;34978:50;34861:174;:::o;35041:366::-;35183:3;35204:67;35268:2;35263:3;35204:67;:::i;:::-;35197:74;;35280:93;35369:3;35280:93;:::i;:::-;35398:2;35393:3;35389:12;35382:19;;35041:366;;;:::o;35413:419::-;35579:4;35617:2;35606:9;35602:18;35594:26;;35666:9;35660:4;35656:20;35652:1;35641:9;35637:17;35630:47;35694:131;35820:4;35694:131;:::i;:::-;35686:139;;35413:419;;;:::o;35838:181::-;35978:33;35974:1;35966:6;35962:14;35955:57;35838:181;:::o;36025:366::-;36167:3;36188:67;36252:2;36247:3;36188:67;:::i;:::-;36181:74;;36264:93;36353:3;36264:93;:::i;:::-;36382:2;36377:3;36373:12;36366:19;;36025:366;;;:::o;36397:419::-;36563:4;36601:2;36590:9;36586:18;36578:26;;36650:9;36644:4;36640:20;36636:1;36625:9;36621:17;36614:47;36678:131;36804:4;36678:131;:::i;:::-;36670:139;;36397:419;;;:::o;36822:221::-;36962:34;36958:1;36950:6;36946:14;36939:58;37031:4;37026:2;37018:6;37014:15;37007:29;36822:221;:::o;37049:366::-;37191:3;37212:67;37276:2;37271:3;37212:67;:::i;:::-;37205:74;;37288:93;37377:3;37288:93;:::i;:::-;37406:2;37401:3;37397:12;37390:19;;37049:366;;;:::o;37421:419::-;37587:4;37625:2;37614:9;37610:18;37602:26;;37674:9;37668:4;37664:20;37660:1;37649:9;37645:17;37638:47;37702:131;37828:4;37702:131;:::i;:::-;37694:139;;37421:419;;;:::o;37846:221::-;37986:34;37982:1;37974:6;37970:14;37963:58;38055:4;38050:2;38042:6;38038:15;38031:29;37846:221;:::o;38073:366::-;38215:3;38236:67;38300:2;38295:3;38236:67;:::i;:::-;38229:74;;38312:93;38401:3;38312:93;:::i;:::-;38430:2;38425:3;38421:12;38414:19;;38073:366;;;:::o;38445:419::-;38611:4;38649:2;38638:9;38634:18;38626:26;;38698:9;38692:4;38688:20;38684:1;38673:9;38669:17;38662:47;38726:131;38852:4;38726:131;:::i;:::-;38718:139;;38445:419;;;:::o

Swarm Source

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