ETH Price: $2,394.12 (-0.42%)

Token

 

Overview

Max Total Supply

0

Holders

139

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
xmg1314.eth
0xb4488e381757B2576546C04Ce2b90635B6f6C313
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:
DogHair

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-19
*/

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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


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

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

    // Mapping from account to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC1155-isApprovedForAll}.
     */
    function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[account][operator];
    }

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

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

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

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

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: contracts/DogHair.sol


pragma solidity 0.8.4;







/**
 * @title DogHair contract
 * @dev Extends ERC721 Non-Fungible Token Standard basic implementation
 */

contract DogHair is ERC1155, Ownable,ReentrancyGuard {
    using Strings for uint256;
    address public defaultSigner;
    mapping(uint256=>uint256) public idSupply;

    mapping(uint256=>bool) public signatureRecord;
    string public baseUri;

    constructor(string memory _baseUri)
        ERC1155(_baseUri)
    {
        baseUri = _baseUri;
        defaultSigner = msg.sender;
    }

    function setSinger(address _signer) external onlyOwner {
        defaultSigner = _signer;
    }

    function setURI(string memory _newuri) external onlyOwner {
        baseUri = _newuri;
    }

    function uri(uint256 _tokenId) public view override returns (string memory) {
        return
            bytes(baseUri).length > 0
                ? string(abi.encodePacked(baseUri, _tokenId.toString()))
                : "";
    }

    function claim(
        bytes calldata _message,
        bytes calldata _signature
    ) external nonReentrant{
        (address adr, uint256 signId,uint256 deadline,uint256[] memory tokenIds,uint256[] memory amounts) = abi.decode(
            _message,
            (address, uint256,uint256,uint256[],uint256[])
        );

        checkSign(_message, _signature);
        require(block.timestamp < deadline, "deadline has passed");
        require(signatureRecord[signId] == false, "signature has been used");
        require(msg.sender == adr, "sender is error");
        _mintBatch(msg.sender, tokenIds, amounts,"");
        signatureRecord[signId] = true;
    }

    function burnBatch(uint256[] calldata _ids,uint256[] calldata _amounts) external {
        _burnBatch(msg.sender, _ids, _amounts);
    }

    function burn(address account,address operator, uint256 _id, uint256 _amount) external {
        require(_amount > 0,"_amount > 0");
        require(isApprovedForAll(account, operator) || msg.sender == account,"DogHair:transfer caller is not owner nor approved");
        _burn(account, _id, _amount);
    }

    function airdrop(
        address[] calldata _to,
        uint256[][] calldata _ids,
        uint256[][] calldata  _amounts
    ) external onlyOwner {
        require(_to.length == _ids.length && _to.length == _amounts.length, "invalid input"); 
        for (uint256 i = 0; i < _to.length; i++) {
            _mintBatch(_to[i], _ids[i], _amounts[i],"");
        }
    }
    
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal override{
        if (from == address(0)) {
           for (uint i = 0; i < ids.length; i++) {
                idSupply[ids[i]] += amounts[i];
            }
        }else if (to == address(0)) {
            for (uint i = 0; i < ids.length; i++) {
                idSupply[ids[i]] -= amounts[i];
            }
        }
    }

    function checkSign(bytes memory message, bytes memory signature)
        internal
        view
        returns (bool)
    {
        bytes32 hash = keccak256(abi.encodePacked(keccak256(message)));
        address signer = ECDSA.recover(hash, signature);
        require(signer == defaultSigner, "checkSign: invalid signature");
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"},{"internalType":"uint256[][]","name":"_ids","type":"uint256[][]"},{"internalType":"uint256[][]","name":"_amounts","type":"uint256[][]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_message","type":"bytes"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"defaultSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSinger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"signatureRecord","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162005abb38038062005abb8339818101604052810190620000379190620002df565b806200004981620000d360201b60201c565b506200006a6200005e620000ef60201b60201c565b620000f760201b60201c565b600160048190555080600890805190602001906200008a929190620001bd565b5033600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000494565b8060029080519060200190620000eb929190620001bd565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001cb90620003b9565b90600052602060002090601f016020900481019282620001ef57600085556200023b565b82601f106200020a57805160ff19168380011785556200023b565b828001600101855582156200023b579182015b828111156200023a5782518255916020019190600101906200021d565b5b5090506200024a91906200024e565b5090565b5b80821115620002695760008160009055506001016200024f565b5090565b6000620002846200027e846200034d565b62000324565b9050828152602081018484840111156200029d57600080fd5b620002aa84828562000383565b509392505050565b600082601f830112620002c457600080fd5b8151620002d68482602086016200026d565b91505092915050565b600060208284031215620002f257600080fd5b600082015167ffffffffffffffff8111156200030d57600080fd5b6200031b84828501620002b2565b91505092915050565b60006200033062000343565b90506200033e8282620003ef565b919050565b6000604051905090565b600067ffffffffffffffff8211156200036b576200036a62000454565b5b620003768262000483565b9050602081019050919050565b60005b83811015620003a357808201518184015260208101905062000386565b83811115620003b3576000848401525b50505050565b60006002820490506001821680620003d257607f821691505b60208210811415620003e957620003e862000425565b5b50919050565b620003fa8262000483565b810181811067ffffffffffffffff821117156200041c576200041b62000454565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b61561780620004a46000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80638da5cb5b116100b8578063d7020d0a1161007c578063d7020d0a14610337578063e985e9c514610353578063f242432a14610383578063f25259f61461039f578063f2fde38b146103bb578063f71ae7cc146103d757610136565b80638da5cb5b146102a757806396377e29146102c55780639abc8320146102e1578063a22cb465146102ff578063be27b22c1461031b57610136565b8063437a0de9116100ff578063437a0de9146102035780634e1273f414610221578063715018a6146102515780637750c5681461025b57806383ca4b6f1461028b57610136565b8062fdd58e1461013b57806301ffc9a71461016b57806302fe53051461019b5780630e89341c146101b75780632eb2c2d6146101e7575b600080fd5b61015560048036038101906101509190613a74565b610407565b6040516101629190614877565b60405180910390f35b61018560048036038101906101809190613c35565b6104d0565b6040516101929190614495565b60405180910390f35b6101b560048036038101906101b09190613cfc565b6105b2565b005b6101d160048036038101906101cc9190613d3d565b610648565b6040516101de91906144f5565b60405180910390f35b61020160048036038101906101fc9190613887565b6106a8565b005b61020b610749565b604051610218919061435f565b60405180910390f35b61023b60048036038101906102369190613b54565b61076f565b604051610248919061443c565b60405180910390f35b610259610920565b005b61027560048036038101906102709190613d3d565b6109a8565b6040516102829190614877565b60405180910390f35b6102a560048036038101906102a09190613bc0565b6109c0565b005b6102af610a53565b6040516102bc919061435f565b60405180910390f35b6102df60048036038101906102da9190613ab0565b610a7d565b005b6102e9610cf8565b6040516102f691906144f5565b60405180910390f35b61031960048036038101906103149190613a38565b610d86565b005b61033560048036038101906103309190613c87565b610d9c565b005b610351600480360381019061034c9190613946565b61100f565b005b61036d6004803603810190610368919061384b565b6110e2565b60405161037a9190614495565b60405180910390f35b61039d600480360381019061039891906139a9565b611176565b005b6103b960048036038101906103b4919061377b565b611217565b005b6103d560048036038101906103d0919061377b565b6112d7565b005b6103f160048036038101906103ec9190613d3d565b6113cf565b6040516103fe9190614495565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046f90614597565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061059b57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105ab57506105aa826113ef565b5b9050919050565b6105ba611459565b73ffffffffffffffffffffffffffffffffffffffff166105d8610a53565b73ffffffffffffffffffffffffffffffffffffffff161461062e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062590614777565b60405180910390fd5b8060089080519060200190610644929190613336565b5050565b606060006008805461065990614c1c565b90501161067557604051806020016040528060008152506106a1565b600861068083611461565b60405160200161069192919061433b565b6040516020818303038152906040525b9050919050565b6106b0611459565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806106f657506106f5856106f0611459565b6110e2565b5b610735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072c906146d7565b60405180910390fd5b610742858585858561160e565b5050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606081518351146107b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ac906147f7565b60405180910390fd5b6000835167ffffffffffffffff8111156107f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156108265781602001602082028036833780820191505090505b50905060005b8451811015610915576108bf858281518110610871577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518583815181106108b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610407565b8282815181106108f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508061090e90614c7f565b905061082c565b508091505092915050565b610928611459565b73ffffffffffffffffffffffffffffffffffffffff16610946610a53565b73ffffffffffffffffffffffffffffffffffffffff161461099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099390614777565b60405180910390fd5b6109a6600061197c565b565b60066020528060005260406000206000915090505481565b610a4d33858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050611a42565b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610a85611459565b73ffffffffffffffffffffffffffffffffffffffff16610aa3610a53565b73ffffffffffffffffffffffffffffffffffffffff1614610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af090614777565b60405180910390fd5b8383905086869050148015610b1357508181905086869050145b610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b49906147b7565b60405180910390fd5b60005b86869050811015610cef57610cdc878783818110610b9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610bb1919061377b565b868684818110610bea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002810190610bfc91906148bb565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050858585818110610c75577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002810190610c8791906148bb565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060405180602001604052806000815250611d5d565b8080610ce790614c7f565b915050610b55565b50505050505050565b60088054610d0590614c1c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3190614c1c565b8015610d7e5780601f10610d5357610100808354040283529160200191610d7e565b820191906000526020600020905b815481529060010190602001808311610d6157829003601f168201915b505050505081565b610d98610d91611459565b8383611fd6565b5050565b60026004541415610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990614857565b60405180910390fd5b600260048190555060008060008060008888810190610e0191906137a4565b94509450945094509450610e9d89898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612143565b50824210610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed7906146f7565b60405180910390fd5b600015156007600086815260200190815260200160002060009054906101000a900460ff16151514610f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3e90614797565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac906145b7565b60405180910390fd5b610fd033838360405180602001604052806000815250611d5d565b60016007600086815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050600160048190555050505050565b60008111611052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104990614677565b60405180910390fd5b61105c84846110e2565b8061109257508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6110d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c890614637565b60405180910390fd5b6110dc848383612220565b50505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61117e611459565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806111c457506111c3856111be611459565b6110e2565b5b611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90614617565b60405180910390fd5b6112108585858585612467565b5050505050565b61121f611459565b73ffffffffffffffffffffffffffffffffffffffff1661123d610a53565b73ffffffffffffffffffffffffffffffffffffffff1614611293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128a90614777565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6112df611459565b73ffffffffffffffffffffffffffffffffffffffff166112fd610a53565b73ffffffffffffffffffffffffffffffffffffffff1614611353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134a90614777565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba906145d7565b60405180910390fd5b6113cc8161197c565b50565b60076020528060005260406000206000915054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b606060008214156114a9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611609565b600082905060005b600082146114db5780806114c490614c7f565b915050600a826114d49190614ad8565b91506114b1565b60008167ffffffffffffffff81111561151d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561154f5781602001600182028036833780820191505090505b5090505b60008514611602576001826115689190614b09565b9150600a856115779190614cd2565b60306115839190614a82565b60f81b8183815181106115bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856115fb9190614ad8565b9450611553565b8093505050505b919050565b8151835114611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990614817565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b9906146b7565b60405180910390fd5b60006116cc611459565b90506116dc818787878787612703565b60005b84518110156118d9576000858281518110611723577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110611768577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180090614757565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118be9190614a82565b92505081905550505050806118d290614c7f565b90506116df565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161195092919061445e565b60405180910390a461196681878787878761270b565b611974818787878787612918565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa990614737565b60405180910390fd5b8051825114611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed90614817565b60405180910390fd5b6000611b00611459565b9050611b2081856000868660405180602001604052806000815250612703565b60005b8351811015611cb9576000848281518110611b67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000848381518110611bac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c44906145f7565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611cb190614c7f565b915050611b23565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611d3192919061445e565b60405180910390a4611d578185600086866040518060200160405280600081525061270b565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490614837565b60405180910390fd5b8151835114611e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0890614817565b60405180910390fd5b6000611e1b611459565b9050611e2c81600087878787612703565b60005b8451811015611f3157838181518110611e71577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600080878481518110611eb5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f179190614a82565b925050819055508080611f2990614c7f565b915050611e2f565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611fa992919061445e565b60405180910390a4611fc08160008787878761270b565b611fcf81600087878787612918565b5050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203c906147d7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121369190614495565b60405180910390a3505050565b600080838051906020012060405160200161215e9190614320565b60405160208183030381529060405280519060200120905060006121828285612aff565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220b90614657565b60405180910390fd5b60019250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228790614737565b60405180910390fd5b600061229a611459565b905060006122a784612b26565b905060006122b484612b26565b90506122d483876000858560405180602001604052806000815250612703565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508481101561236b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612362906145f7565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612438929190614892565b60405180910390a461245e8488600086866040518060200160405280600081525061270b565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156124d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ce906146b7565b60405180910390fd5b60006124e1611459565b905060006124ee85612b26565b905060006124fb85612b26565b905061250b838989858589612703565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156125a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259990614757565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126579190614a82565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516126d4929190614892565b60405180910390a46126ea848a8a86868a61270b565b6126f8848a8a8a8a8a612bec565b505050505050505050565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561280f5760005b835181101561280957828181518110612785577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600660008684815181106127ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060008282546127ef9190614a82565b92505081905550808061280190614c7f565b915050612743565b50612910565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561290f5760005b835181101561290d57828181518110612889577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600660008684815181106128ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060008282546128f39190614b09565b92505081905550808061290590614c7f565b915050612847565b505b5b505050505050565b6129378473ffffffffffffffffffffffffffffffffffffffff16612dd3565b15612af7578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161297d95949392919061437a565b602060405180830381600087803b15801561299757600080fd5b505af19250505080156129c857506040513d601f19601f820116820180604052508101906129c59190613c5e565b60015b612a6e576129d4614dbf565b806308c379a01415612a3157506129e96154d8565b806129f45750612a33565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2891906144f5565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6590614537565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aec90614557565b60405180910390fd5b505b505050505050565b6000806000612b0e8585612df6565b91509150612b1b81612e79565b819250505092915050565b60606000600167ffffffffffffffff811115612b6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612b995781602001602082028036833780820191505090505b5090508281600081518110612bd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b612c0b8473ffffffffffffffffffffffffffffffffffffffff16612dd3565b15612dcb578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612c519594939291906143e2565b602060405180830381600087803b158015612c6b57600080fd5b505af1925050508015612c9c57506040513d601f19601f82011682018060405250810190612c999190613c5e565b60015b612d4257612ca8614dbf565b806308c379a01415612d055750612cbd6154d8565b80612cc85750612d07565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfc91906144f5565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3990614537565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc090614557565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080604183511415612e385760008060006020860151925060408601519150606086015160001a9050612e2c878285856131ca565b94509450505050612e72565b604083511415612e69576000806020850151915060408501519050612e5e8683836132d7565b935093505050612e72565b60006002915091505b9250929050565b60006004811115612eb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612eec577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612ef7576131c7565b60016004811115612f31577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612f6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa290614517565b60405180910390fd5b60026004811115612fe5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561301e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561305f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305690614577565b60405180910390fd5b60036004811115613099577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156130d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310a90614697565b60405180910390fd5b60048081111561314c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613185577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156131c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bd90614717565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156132055760006003915091506132ce565b601b8560ff161415801561321d5750601c8560ff1614155b1561322f5760006004915091506132ce565b60006001878787876040516000815260200160405260405161325494939291906144b0565b6020604051602081039080840390855afa158015613276573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156132c5576000600192509250506132ce565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61331a9190614a82565b9050613328878288856131ca565b935093505050935093915050565b82805461334290614c1c565b90600052602060002090601f01602090048101928261336457600085556133ab565b82601f1061337d57805160ff19168380011785556133ab565b828001600101855582156133ab579182015b828111156133aa57825182559160200191906001019061338f565b5b5090506133b891906133bc565b5090565b5b808211156133d55760008160009055506001016133bd565b5090565b60006133ec6133e784614937565b614912565b9050808382526020820190508285602086028201111561340b57600080fd5b60005b8581101561343b5781613421888261352d565b84526020840193506020830192505060018101905061340e565b5050509392505050565b600061345861345384614963565b614912565b9050808382526020820190508285602086028201111561347757600080fd5b60005b858110156134a7578161348d8882613766565b84526020840193506020830192505060018101905061347a565b5050509392505050565b60006134c46134bf8461498f565b614912565b9050828152602081018484840111156134dc57600080fd5b6134e7848285614bda565b509392505050565b60006135026134fd846149c0565b614912565b90508281526020810184848401111561351a57600080fd5b613525848285614bda565b509392505050565b60008135905061353c8161556e565b92915050565b60008135905061355181615585565b92915050565b60008083601f84011261356957600080fd5b8235905067ffffffffffffffff81111561358257600080fd5b60208301915083602082028301111561359a57600080fd5b9250929050565b600082601f8301126135b257600080fd5b81356135c28482602086016133d9565b91505092915050565b60008083601f8401126135dd57600080fd5b8235905067ffffffffffffffff8111156135f657600080fd5b60208301915083602082028301111561360e57600080fd5b9250929050565b60008083601f84011261362757600080fd5b8235905067ffffffffffffffff81111561364057600080fd5b60208301915083602082028301111561365857600080fd5b9250929050565b600082601f83011261367057600080fd5b8135613680848260208601613445565b91505092915050565b6000813590506136988161559c565b92915050565b6000813590506136ad816155b3565b92915050565b6000815190506136c2816155b3565b92915050565b60008083601f8401126136da57600080fd5b8235905067ffffffffffffffff8111156136f357600080fd5b60208301915083600182028301111561370b57600080fd5b9250929050565b600082601f83011261372357600080fd5b81356137338482602086016134b1565b91505092915050565b600082601f83011261374d57600080fd5b813561375d8482602086016134ef565b91505092915050565b600081359050613775816155ca565b92915050565b60006020828403121561378d57600080fd5b600061379b8482850161352d565b91505092915050565b600080600080600060a086880312156137bc57600080fd5b60006137ca88828901613542565b95505060206137db88828901613766565b94505060406137ec88828901613766565b935050606086013567ffffffffffffffff81111561380957600080fd5b6138158882890161365f565b925050608086013567ffffffffffffffff81111561383257600080fd5b61383e8882890161365f565b9150509295509295909350565b6000806040838503121561385e57600080fd5b600061386c8582860161352d565b925050602061387d8582860161352d565b9150509250929050565b600080600080600060a0868803121561389f57600080fd5b60006138ad8882890161352d565b95505060206138be8882890161352d565b945050604086013567ffffffffffffffff8111156138db57600080fd5b6138e78882890161365f565b935050606086013567ffffffffffffffff81111561390457600080fd5b6139108882890161365f565b925050608086013567ffffffffffffffff81111561392d57600080fd5b61393988828901613712565b9150509295509295909350565b6000806000806080858703121561395c57600080fd5b600061396a8782880161352d565b945050602061397b8782880161352d565b935050604061398c87828801613766565b925050606061399d87828801613766565b91505092959194509250565b600080600080600060a086880312156139c157600080fd5b60006139cf8882890161352d565b95505060206139e08882890161352d565b94505060406139f188828901613766565b9350506060613a0288828901613766565b925050608086013567ffffffffffffffff811115613a1f57600080fd5b613a2b88828901613712565b9150509295509295909350565b60008060408385031215613a4b57600080fd5b6000613a598582860161352d565b9250506020613a6a85828601613689565b9150509250929050565b60008060408385031215613a8757600080fd5b6000613a958582860161352d565b9250506020613aa685828601613766565b9150509250929050565b60008060008060008060608789031215613ac957600080fd5b600087013567ffffffffffffffff811115613ae357600080fd5b613aef89828a01613557565b9650965050602087013567ffffffffffffffff811115613b0e57600080fd5b613b1a89828a016135cb565b9450945050604087013567ffffffffffffffff811115613b3957600080fd5b613b4589828a016135cb565b92509250509295509295509295565b60008060408385031215613b6757600080fd5b600083013567ffffffffffffffff811115613b8157600080fd5b613b8d858286016135a1565b925050602083013567ffffffffffffffff811115613baa57600080fd5b613bb68582860161365f565b9150509250929050565b60008060008060408587031215613bd657600080fd5b600085013567ffffffffffffffff811115613bf057600080fd5b613bfc87828801613615565b9450945050602085013567ffffffffffffffff811115613c1b57600080fd5b613c2787828801613615565b925092505092959194509250565b600060208284031215613c4757600080fd5b6000613c558482850161369e565b91505092915050565b600060208284031215613c7057600080fd5b6000613c7e848285016136b3565b91505092915050565b60008060008060408587031215613c9d57600080fd5b600085013567ffffffffffffffff811115613cb757600080fd5b613cc3878288016136c8565b9450945050602085013567ffffffffffffffff811115613ce257600080fd5b613cee878288016136c8565b925092505092959194509250565b600060208284031215613d0e57600080fd5b600082013567ffffffffffffffff811115613d2857600080fd5b613d348482850161373c565b91505092915050565b600060208284031215613d4f57600080fd5b6000613d5d84828501613766565b91505092915050565b6000613d7283836142f3565b60208301905092915050565b613d8781614b3d565b82525050565b6000613d9882614a16565b613da28185614a44565b9350613dad836149f1565b8060005b83811015613dde578151613dc58882613d66565b9750613dd083614a37565b925050600181019050613db1565b5085935050505092915050565b613df481614b61565b82525050565b613e0381614b6d565b82525050565b613e1a613e1582614b6d565b614cc8565b82525050565b6000613e2b82614a21565b613e358185614a55565b9350613e45818560208601614be9565b613e4e81614de1565b840191505092915050565b6000613e6482614a2c565b613e6e8185614a66565b9350613e7e818560208601614be9565b613e8781614de1565b840191505092915050565b6000613e9d82614a2c565b613ea78185614a77565b9350613eb7818560208601614be9565b80840191505092915050565b60008154613ed081614c1c565b613eda8186614a77565b94506001821660008114613ef55760018114613f0657613f39565b60ff19831686528186019350613f39565b613f0f85614a01565b60005b83811015613f3157815481890152600182019150602081019050613f12565b838801955050505b50505092915050565b6000613f4f601883614a66565b9150613f5a82614dff565b602082019050919050565b6000613f72603483614a66565b9150613f7d82614e28565b604082019050919050565b6000613f95602883614a66565b9150613fa082614e77565b604082019050919050565b6000613fb8601f83614a66565b9150613fc382614ec6565b602082019050919050565b6000613fdb602b83614a66565b9150613fe682614eef565b604082019050919050565b6000613ffe600f83614a66565b915061400982614f3e565b602082019050919050565b6000614021602683614a66565b915061402c82614f67565b604082019050919050565b6000614044602483614a66565b915061404f82614fb6565b604082019050919050565b6000614067602983614a66565b915061407282615005565b604082019050919050565b600061408a603183614a66565b915061409582615054565b604082019050919050565b60006140ad601c83614a66565b91506140b8826150a3565b602082019050919050565b60006140d0600b83614a66565b91506140db826150cc565b602082019050919050565b60006140f3602283614a66565b91506140fe826150f5565b604082019050919050565b6000614116602583614a66565b915061412182615144565b604082019050919050565b6000614139603283614a66565b915061414482615193565b604082019050919050565b600061415c601383614a66565b9150614167826151e2565b602082019050919050565b600061417f602283614a66565b915061418a8261520b565b604082019050919050565b60006141a2602383614a66565b91506141ad8261525a565b604082019050919050565b60006141c5602a83614a66565b91506141d0826152a9565b604082019050919050565b60006141e8602083614a66565b91506141f3826152f8565b602082019050919050565b600061420b601783614a66565b915061421682615321565b602082019050919050565b600061422e600d83614a66565b91506142398261534a565b602082019050919050565b6000614251602983614a66565b915061425c82615373565b604082019050919050565b6000614274602983614a66565b915061427f826153c2565b604082019050919050565b6000614297602883614a66565b91506142a282615411565b604082019050919050565b60006142ba602183614a66565b91506142c582615460565b604082019050919050565b60006142dd601f83614a66565b91506142e8826154af565b602082019050919050565b6142fc81614bc3565b82525050565b61430b81614bc3565b82525050565b61431a81614bcd565b82525050565b600061432c8284613e09565b60208201915081905092915050565b60006143478285613ec3565b91506143538284613e92565b91508190509392505050565b60006020820190506143746000830184613d7e565b92915050565b600060a08201905061438f6000830188613d7e565b61439c6020830187613d7e565b81810360408301526143ae8186613d8d565b905081810360608301526143c28185613d8d565b905081810360808301526143d68184613e20565b90509695505050505050565b600060a0820190506143f76000830188613d7e565b6144046020830187613d7e565b6144116040830186614302565b61441e6060830185614302565b81810360808301526144308184613e20565b90509695505050505050565b600060208201905081810360008301526144568184613d8d565b905092915050565b600060408201905081810360008301526144788185613d8d565b9050818103602083015261448c8184613d8d565b90509392505050565b60006020820190506144aa6000830184613deb565b92915050565b60006080820190506144c56000830187613dfa565b6144d26020830186614311565b6144df6040830185613dfa565b6144ec6060830184613dfa565b95945050505050565b6000602082019050818103600083015261450f8184613e59565b905092915050565b6000602082019050818103600083015261453081613f42565b9050919050565b6000602082019050818103600083015261455081613f65565b9050919050565b6000602082019050818103600083015261457081613f88565b9050919050565b6000602082019050818103600083015261459081613fab565b9050919050565b600060208201905081810360008301526145b081613fce565b9050919050565b600060208201905081810360008301526145d081613ff1565b9050919050565b600060208201905081810360008301526145f081614014565b9050919050565b6000602082019050818103600083015261461081614037565b9050919050565b600060208201905081810360008301526146308161405a565b9050919050565b600060208201905081810360008301526146508161407d565b9050919050565b60006020820190508181036000830152614670816140a0565b9050919050565b60006020820190508181036000830152614690816140c3565b9050919050565b600060208201905081810360008301526146b0816140e6565b9050919050565b600060208201905081810360008301526146d081614109565b9050919050565b600060208201905081810360008301526146f08161412c565b9050919050565b600060208201905081810360008301526147108161414f565b9050919050565b6000602082019050818103600083015261473081614172565b9050919050565b6000602082019050818103600083015261475081614195565b9050919050565b60006020820190508181036000830152614770816141b8565b9050919050565b60006020820190508181036000830152614790816141db565b9050919050565b600060208201905081810360008301526147b0816141fe565b9050919050565b600060208201905081810360008301526147d081614221565b9050919050565b600060208201905081810360008301526147f081614244565b9050919050565b6000602082019050818103600083015261481081614267565b9050919050565b600060208201905081810360008301526148308161428a565b9050919050565b60006020820190508181036000830152614850816142ad565b9050919050565b60006020820190508181036000830152614870816142d0565b9050919050565b600060208201905061488c6000830184614302565b92915050565b60006040820190506148a76000830185614302565b6148b46020830184614302565b9392505050565b600080833560016020038436030381126148d457600080fd5b80840192508235915067ffffffffffffffff8211156148f257600080fd5b60208301925060208202360383131561490a57600080fd5b509250929050565b600061491c61492d565b90506149288282614c4e565b919050565b6000604051905090565b600067ffffffffffffffff82111561495257614951614d90565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561497e5761497d614d90565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156149aa576149a9614d90565b5b6149b382614de1565b9050602081019050919050565b600067ffffffffffffffff8211156149db576149da614d90565b5b6149e482614de1565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a8d82614bc3565b9150614a9883614bc3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614acd57614acc614d03565b5b828201905092915050565b6000614ae382614bc3565b9150614aee83614bc3565b925082614afe57614afd614d32565b5b828204905092915050565b6000614b1482614bc3565b9150614b1f83614bc3565b925082821015614b3257614b31614d03565b5b828203905092915050565b6000614b4882614ba3565b9050919050565b6000614b5a82614ba3565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614c07578082015181840152602081019050614bec565b83811115614c16576000848401525b50505050565b60006002820490506001821680614c3457607f821691505b60208210811415614c4857614c47614d61565b5b50919050565b614c5782614de1565b810181811067ffffffffffffffff82111715614c7657614c75614d90565b5b80604052505050565b6000614c8a82614bc3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614cbd57614cbc614d03565b5b600182019050919050565b6000819050919050565b6000614cdd82614bc3565b9150614ce883614bc3565b925082614cf857614cf7614d32565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115614dde5760046000803e614ddb600051614df2565b90505b90565b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f73656e646572206973206572726f720000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f446f67486169723a7472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f636865636b5369676e3a20696e76616c6964207369676e617475726500000000600082015250565b7f5f616d6f756e74203e2030000000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f646561646c696e65206861732070617373656400000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7369676e617475726520686173206265656e2075736564000000000000000000600082015250565b7f696e76616c696420696e70757400000000000000000000000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600060443d10156154e85761556b565b6154f061492d565b60043d036004823e80513d602482011167ffffffffffffffff8211171561551857505061556b565b808201805167ffffffffffffffff811115615536575050505061556b565b80602083010160043d03850181111561555357505050505061556b565b61556282602001850186614c4e565b82955050505050505b90565b61557781614b3d565b811461558257600080fd5b50565b61558e81614b4f565b811461559957600080fd5b50565b6155a581614b61565b81146155b057600080fd5b50565b6155bc81614b77565b81146155c757600080fd5b50565b6155d381614bc3565b81146155de57600080fd5b5056fea26469706673582212209e71ac53c42543b81de37a327305424450b21a0be1d2cccf5ad9b7fd0ba879b164736f6c634300080400330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d4e6a4c6b456d413570443872455a6759777838597377706d553557435157703939795164695150713336626b2f000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101365760003560e01c80638da5cb5b116100b8578063d7020d0a1161007c578063d7020d0a14610337578063e985e9c514610353578063f242432a14610383578063f25259f61461039f578063f2fde38b146103bb578063f71ae7cc146103d757610136565b80638da5cb5b146102a757806396377e29146102c55780639abc8320146102e1578063a22cb465146102ff578063be27b22c1461031b57610136565b8063437a0de9116100ff578063437a0de9146102035780634e1273f414610221578063715018a6146102515780637750c5681461025b57806383ca4b6f1461028b57610136565b8062fdd58e1461013b57806301ffc9a71461016b57806302fe53051461019b5780630e89341c146101b75780632eb2c2d6146101e7575b600080fd5b61015560048036038101906101509190613a74565b610407565b6040516101629190614877565b60405180910390f35b61018560048036038101906101809190613c35565b6104d0565b6040516101929190614495565b60405180910390f35b6101b560048036038101906101b09190613cfc565b6105b2565b005b6101d160048036038101906101cc9190613d3d565b610648565b6040516101de91906144f5565b60405180910390f35b61020160048036038101906101fc9190613887565b6106a8565b005b61020b610749565b604051610218919061435f565b60405180910390f35b61023b60048036038101906102369190613b54565b61076f565b604051610248919061443c565b60405180910390f35b610259610920565b005b61027560048036038101906102709190613d3d565b6109a8565b6040516102829190614877565b60405180910390f35b6102a560048036038101906102a09190613bc0565b6109c0565b005b6102af610a53565b6040516102bc919061435f565b60405180910390f35b6102df60048036038101906102da9190613ab0565b610a7d565b005b6102e9610cf8565b6040516102f691906144f5565b60405180910390f35b61031960048036038101906103149190613a38565b610d86565b005b61033560048036038101906103309190613c87565b610d9c565b005b610351600480360381019061034c9190613946565b61100f565b005b61036d6004803603810190610368919061384b565b6110e2565b60405161037a9190614495565b60405180910390f35b61039d600480360381019061039891906139a9565b611176565b005b6103b960048036038101906103b4919061377b565b611217565b005b6103d560048036038101906103d0919061377b565b6112d7565b005b6103f160048036038101906103ec9190613d3d565b6113cf565b6040516103fe9190614495565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046f90614597565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061059b57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105ab57506105aa826113ef565b5b9050919050565b6105ba611459565b73ffffffffffffffffffffffffffffffffffffffff166105d8610a53565b73ffffffffffffffffffffffffffffffffffffffff161461062e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062590614777565b60405180910390fd5b8060089080519060200190610644929190613336565b5050565b606060006008805461065990614c1c565b90501161067557604051806020016040528060008152506106a1565b600861068083611461565b60405160200161069192919061433b565b6040516020818303038152906040525b9050919050565b6106b0611459565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806106f657506106f5856106f0611459565b6110e2565b5b610735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072c906146d7565b60405180910390fd5b610742858585858561160e565b5050505050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606081518351146107b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ac906147f7565b60405180910390fd5b6000835167ffffffffffffffff8111156107f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156108265781602001602082028036833780820191505090505b50905060005b8451811015610915576108bf858281518110610871577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518583815181106108b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151610407565b8282815181106108f8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508061090e90614c7f565b905061082c565b508091505092915050565b610928611459565b73ffffffffffffffffffffffffffffffffffffffff16610946610a53565b73ffffffffffffffffffffffffffffffffffffffff161461099c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099390614777565b60405180910390fd5b6109a6600061197c565b565b60066020528060005260406000206000915090505481565b610a4d33858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050611a42565b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610a85611459565b73ffffffffffffffffffffffffffffffffffffffff16610aa3610a53565b73ffffffffffffffffffffffffffffffffffffffff1614610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af090614777565b60405180910390fd5b8383905086869050148015610b1357508181905086869050145b610b52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b49906147b7565b60405180910390fd5b60005b86869050811015610cef57610cdc878783818110610b9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610bb1919061377b565b868684818110610bea577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002810190610bfc91906148bb565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050858585818110610c75577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002810190610c8791906148bb565b80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060405180602001604052806000815250611d5d565b8080610ce790614c7f565b915050610b55565b50505050505050565b60088054610d0590614c1c565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3190614c1c565b8015610d7e5780601f10610d5357610100808354040283529160200191610d7e565b820191906000526020600020905b815481529060010190602001808311610d6157829003601f168201915b505050505081565b610d98610d91611459565b8383611fd6565b5050565b60026004541415610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990614857565b60405180910390fd5b600260048190555060008060008060008888810190610e0191906137a4565b94509450945094509450610e9d89898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505088888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612143565b50824210610ee0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed7906146f7565b60405180910390fd5b600015156007600086815260200190815260200160002060009054906101000a900460ff16151514610f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3e90614797565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac906145b7565b60405180910390fd5b610fd033838360405180602001604052806000815250611d5d565b60016007600086815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505050600160048190555050505050565b60008111611052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104990614677565b60405180910390fd5b61105c84846110e2565b8061109257508373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6110d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c890614637565b60405180910390fd5b6110dc848383612220565b50505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61117e611459565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806111c457506111c3856111be611459565b6110e2565b5b611203576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111fa90614617565b60405180910390fd5b6112108585858585612467565b5050505050565b61121f611459565b73ffffffffffffffffffffffffffffffffffffffff1661123d610a53565b73ffffffffffffffffffffffffffffffffffffffff1614611293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128a90614777565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6112df611459565b73ffffffffffffffffffffffffffffffffffffffff166112fd610a53565b73ffffffffffffffffffffffffffffffffffffffff1614611353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134a90614777565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ba906145d7565b60405180910390fd5b6113cc8161197c565b50565b60076020528060005260406000206000915054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b606060008214156114a9576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611609565b600082905060005b600082146114db5780806114c490614c7f565b915050600a826114d49190614ad8565b91506114b1565b60008167ffffffffffffffff81111561151d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561154f5781602001600182028036833780820191505090505b5090505b60008514611602576001826115689190614b09565b9150600a856115779190614cd2565b60306115839190614a82565b60f81b8183815181106115bf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856115fb9190614ad8565b9450611553565b8093505050505b919050565b8151835114611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990614817565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b9906146b7565b60405180910390fd5b60006116cc611459565b90506116dc818787878787612703565b60005b84518110156118d9576000858281518110611723577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110611768577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180090614757565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118be9190614a82565b92505081905550505050806118d290614c7f565b90506116df565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161195092919061445e565b60405180910390a461196681878787878761270b565b611974818787878787612918565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa990614737565b60405180910390fd5b8051825114611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed90614817565b60405180910390fd5b6000611b00611459565b9050611b2081856000868660405180602001604052806000815250612703565b60005b8351811015611cb9576000848281518110611b67577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000848381518110611bac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c44906145f7565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611cb190614c7f565b915050611b23565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611d3192919061445e565b60405180910390a4611d578185600086866040518060200160405280600081525061270b565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611dcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc490614837565b60405180910390fd5b8151835114611e11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0890614817565b60405180910390fd5b6000611e1b611459565b9050611e2c81600087878787612703565b60005b8451811015611f3157838181518110611e71577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600080878481518110611eb5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f179190614a82565b925050819055508080611f2990614c7f565b915050611e2f565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611fa992919061445e565b60405180910390a4611fc08160008787878761270b565b611fcf81600087878787612918565b5050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203c906147d7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121369190614495565b60405180910390a3505050565b600080838051906020012060405160200161215e9190614320565b60405160208183030381529060405280519060200120905060006121828285612aff565b9050600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220b90614657565b60405180910390fd5b60019250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612290576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228790614737565b60405180910390fd5b600061229a611459565b905060006122a784612b26565b905060006122b484612b26565b90506122d483876000858560405180602001604052806000815250612703565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508481101561236b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612362906145f7565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051612438929190614892565b60405180910390a461245e8488600086866040518060200160405280600081525061270b565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156124d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ce906146b7565b60405180910390fd5b60006124e1611459565b905060006124ee85612b26565b905060006124fb85612b26565b905061250b838989858589612703565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156125a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259990614757565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126579190614a82565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516126d4929190614892565b60405180910390a46126ea848a8a86868a61270b565b6126f8848a8a8a8a8a612bec565b505050505050505050565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561280f5760005b835181101561280957828181518110612785577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600660008684815181106127ca577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060008282546127ef9190614a82565b92505081905550808061280190614c7f565b915050612743565b50612910565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561290f5760005b835181101561290d57828181518110612889577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151600660008684815181106128ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002060008282546128f39190614b09565b92505081905550808061290590614c7f565b915050612847565b505b5b505050505050565b6129378473ffffffffffffffffffffffffffffffffffffffff16612dd3565b15612af7578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161297d95949392919061437a565b602060405180830381600087803b15801561299757600080fd5b505af19250505080156129c857506040513d601f19601f820116820180604052508101906129c59190613c5e565b60015b612a6e576129d4614dbf565b806308c379a01415612a3157506129e96154d8565b806129f45750612a33565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2891906144f5565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a6590614537565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aec90614557565b60405180910390fd5b505b505050505050565b6000806000612b0e8585612df6565b91509150612b1b81612e79565b819250505092915050565b60606000600167ffffffffffffffff811115612b6b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612b995781602001602082028036833780820191505090505b5090508281600081518110612bd7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b612c0b8473ffffffffffffffffffffffffffffffffffffffff16612dd3565b15612dcb578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612c519594939291906143e2565b602060405180830381600087803b158015612c6b57600080fd5b505af1925050508015612c9c57506040513d601f19601f82011682018060405250810190612c999190613c5e565b60015b612d4257612ca8614dbf565b806308c379a01415612d055750612cbd6154d8565b80612cc85750612d07565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cfc91906144f5565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3990614537565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612dc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc090614557565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600080604183511415612e385760008060006020860151925060408601519150606086015160001a9050612e2c878285856131ca565b94509450505050612e72565b604083511415612e69576000806020850151915060408501519050612e5e8683836132d7565b935093505050612e72565b60006002915091505b9250929050565b60006004811115612eb3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612eec577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612ef7576131c7565b60016004811115612f31577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612f6a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa290614517565b60405180910390fd5b60026004811115612fe5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b81600481111561301e577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561305f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305690614577565b60405180910390fd5b60036004811115613099577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156130d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310a90614697565b60405180910390fd5b60048081111561314c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613185577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156131c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131bd90614717565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156132055760006003915091506132ce565b601b8560ff161415801561321d5750601c8560ff1614155b1561322f5760006004915091506132ce565b60006001878787876040516000815260200160405260405161325494939291906144b0565b6020604051602081039080840390855afa158015613276573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156132c5576000600192509250506132ce565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61331a9190614a82565b9050613328878288856131ca565b935093505050935093915050565b82805461334290614c1c565b90600052602060002090601f01602090048101928261336457600085556133ab565b82601f1061337d57805160ff19168380011785556133ab565b828001600101855582156133ab579182015b828111156133aa57825182559160200191906001019061338f565b5b5090506133b891906133bc565b5090565b5b808211156133d55760008160009055506001016133bd565b5090565b60006133ec6133e784614937565b614912565b9050808382526020820190508285602086028201111561340b57600080fd5b60005b8581101561343b5781613421888261352d565b84526020840193506020830192505060018101905061340e565b5050509392505050565b600061345861345384614963565b614912565b9050808382526020820190508285602086028201111561347757600080fd5b60005b858110156134a7578161348d8882613766565b84526020840193506020830192505060018101905061347a565b5050509392505050565b60006134c46134bf8461498f565b614912565b9050828152602081018484840111156134dc57600080fd5b6134e7848285614bda565b509392505050565b60006135026134fd846149c0565b614912565b90508281526020810184848401111561351a57600080fd5b613525848285614bda565b509392505050565b60008135905061353c8161556e565b92915050565b60008135905061355181615585565b92915050565b60008083601f84011261356957600080fd5b8235905067ffffffffffffffff81111561358257600080fd5b60208301915083602082028301111561359a57600080fd5b9250929050565b600082601f8301126135b257600080fd5b81356135c28482602086016133d9565b91505092915050565b60008083601f8401126135dd57600080fd5b8235905067ffffffffffffffff8111156135f657600080fd5b60208301915083602082028301111561360e57600080fd5b9250929050565b60008083601f84011261362757600080fd5b8235905067ffffffffffffffff81111561364057600080fd5b60208301915083602082028301111561365857600080fd5b9250929050565b600082601f83011261367057600080fd5b8135613680848260208601613445565b91505092915050565b6000813590506136988161559c565b92915050565b6000813590506136ad816155b3565b92915050565b6000815190506136c2816155b3565b92915050565b60008083601f8401126136da57600080fd5b8235905067ffffffffffffffff8111156136f357600080fd5b60208301915083600182028301111561370b57600080fd5b9250929050565b600082601f83011261372357600080fd5b81356137338482602086016134b1565b91505092915050565b600082601f83011261374d57600080fd5b813561375d8482602086016134ef565b91505092915050565b600081359050613775816155ca565b92915050565b60006020828403121561378d57600080fd5b600061379b8482850161352d565b91505092915050565b600080600080600060a086880312156137bc57600080fd5b60006137ca88828901613542565b95505060206137db88828901613766565b94505060406137ec88828901613766565b935050606086013567ffffffffffffffff81111561380957600080fd5b6138158882890161365f565b925050608086013567ffffffffffffffff81111561383257600080fd5b61383e8882890161365f565b9150509295509295909350565b6000806040838503121561385e57600080fd5b600061386c8582860161352d565b925050602061387d8582860161352d565b9150509250929050565b600080600080600060a0868803121561389f57600080fd5b60006138ad8882890161352d565b95505060206138be8882890161352d565b945050604086013567ffffffffffffffff8111156138db57600080fd5b6138e78882890161365f565b935050606086013567ffffffffffffffff81111561390457600080fd5b6139108882890161365f565b925050608086013567ffffffffffffffff81111561392d57600080fd5b61393988828901613712565b9150509295509295909350565b6000806000806080858703121561395c57600080fd5b600061396a8782880161352d565b945050602061397b8782880161352d565b935050604061398c87828801613766565b925050606061399d87828801613766565b91505092959194509250565b600080600080600060a086880312156139c157600080fd5b60006139cf8882890161352d565b95505060206139e08882890161352d565b94505060406139f188828901613766565b9350506060613a0288828901613766565b925050608086013567ffffffffffffffff811115613a1f57600080fd5b613a2b88828901613712565b9150509295509295909350565b60008060408385031215613a4b57600080fd5b6000613a598582860161352d565b9250506020613a6a85828601613689565b9150509250929050565b60008060408385031215613a8757600080fd5b6000613a958582860161352d565b9250506020613aa685828601613766565b9150509250929050565b60008060008060008060608789031215613ac957600080fd5b600087013567ffffffffffffffff811115613ae357600080fd5b613aef89828a01613557565b9650965050602087013567ffffffffffffffff811115613b0e57600080fd5b613b1a89828a016135cb565b9450945050604087013567ffffffffffffffff811115613b3957600080fd5b613b4589828a016135cb565b92509250509295509295509295565b60008060408385031215613b6757600080fd5b600083013567ffffffffffffffff811115613b8157600080fd5b613b8d858286016135a1565b925050602083013567ffffffffffffffff811115613baa57600080fd5b613bb68582860161365f565b9150509250929050565b60008060008060408587031215613bd657600080fd5b600085013567ffffffffffffffff811115613bf057600080fd5b613bfc87828801613615565b9450945050602085013567ffffffffffffffff811115613c1b57600080fd5b613c2787828801613615565b925092505092959194509250565b600060208284031215613c4757600080fd5b6000613c558482850161369e565b91505092915050565b600060208284031215613c7057600080fd5b6000613c7e848285016136b3565b91505092915050565b60008060008060408587031215613c9d57600080fd5b600085013567ffffffffffffffff811115613cb757600080fd5b613cc3878288016136c8565b9450945050602085013567ffffffffffffffff811115613ce257600080fd5b613cee878288016136c8565b925092505092959194509250565b600060208284031215613d0e57600080fd5b600082013567ffffffffffffffff811115613d2857600080fd5b613d348482850161373c565b91505092915050565b600060208284031215613d4f57600080fd5b6000613d5d84828501613766565b91505092915050565b6000613d7283836142f3565b60208301905092915050565b613d8781614b3d565b82525050565b6000613d9882614a16565b613da28185614a44565b9350613dad836149f1565b8060005b83811015613dde578151613dc58882613d66565b9750613dd083614a37565b925050600181019050613db1565b5085935050505092915050565b613df481614b61565b82525050565b613e0381614b6d565b82525050565b613e1a613e1582614b6d565b614cc8565b82525050565b6000613e2b82614a21565b613e358185614a55565b9350613e45818560208601614be9565b613e4e81614de1565b840191505092915050565b6000613e6482614a2c565b613e6e8185614a66565b9350613e7e818560208601614be9565b613e8781614de1565b840191505092915050565b6000613e9d82614a2c565b613ea78185614a77565b9350613eb7818560208601614be9565b80840191505092915050565b60008154613ed081614c1c565b613eda8186614a77565b94506001821660008114613ef55760018114613f0657613f39565b60ff19831686528186019350613f39565b613f0f85614a01565b60005b83811015613f3157815481890152600182019150602081019050613f12565b838801955050505b50505092915050565b6000613f4f601883614a66565b9150613f5a82614dff565b602082019050919050565b6000613f72603483614a66565b9150613f7d82614e28565b604082019050919050565b6000613f95602883614a66565b9150613fa082614e77565b604082019050919050565b6000613fb8601f83614a66565b9150613fc382614ec6565b602082019050919050565b6000613fdb602b83614a66565b9150613fe682614eef565b604082019050919050565b6000613ffe600f83614a66565b915061400982614f3e565b602082019050919050565b6000614021602683614a66565b915061402c82614f67565b604082019050919050565b6000614044602483614a66565b915061404f82614fb6565b604082019050919050565b6000614067602983614a66565b915061407282615005565b604082019050919050565b600061408a603183614a66565b915061409582615054565b604082019050919050565b60006140ad601c83614a66565b91506140b8826150a3565b602082019050919050565b60006140d0600b83614a66565b91506140db826150cc565b602082019050919050565b60006140f3602283614a66565b91506140fe826150f5565b604082019050919050565b6000614116602583614a66565b915061412182615144565b604082019050919050565b6000614139603283614a66565b915061414482615193565b604082019050919050565b600061415c601383614a66565b9150614167826151e2565b602082019050919050565b600061417f602283614a66565b915061418a8261520b565b604082019050919050565b60006141a2602383614a66565b91506141ad8261525a565b604082019050919050565b60006141c5602a83614a66565b91506141d0826152a9565b604082019050919050565b60006141e8602083614a66565b91506141f3826152f8565b602082019050919050565b600061420b601783614a66565b915061421682615321565b602082019050919050565b600061422e600d83614a66565b91506142398261534a565b602082019050919050565b6000614251602983614a66565b915061425c82615373565b604082019050919050565b6000614274602983614a66565b915061427f826153c2565b604082019050919050565b6000614297602883614a66565b91506142a282615411565b604082019050919050565b60006142ba602183614a66565b91506142c582615460565b604082019050919050565b60006142dd601f83614a66565b91506142e8826154af565b602082019050919050565b6142fc81614bc3565b82525050565b61430b81614bc3565b82525050565b61431a81614bcd565b82525050565b600061432c8284613e09565b60208201915081905092915050565b60006143478285613ec3565b91506143538284613e92565b91508190509392505050565b60006020820190506143746000830184613d7e565b92915050565b600060a08201905061438f6000830188613d7e565b61439c6020830187613d7e565b81810360408301526143ae8186613d8d565b905081810360608301526143c28185613d8d565b905081810360808301526143d68184613e20565b90509695505050505050565b600060a0820190506143f76000830188613d7e565b6144046020830187613d7e565b6144116040830186614302565b61441e6060830185614302565b81810360808301526144308184613e20565b90509695505050505050565b600060208201905081810360008301526144568184613d8d565b905092915050565b600060408201905081810360008301526144788185613d8d565b9050818103602083015261448c8184613d8d565b90509392505050565b60006020820190506144aa6000830184613deb565b92915050565b60006080820190506144c56000830187613dfa565b6144d26020830186614311565b6144df6040830185613dfa565b6144ec6060830184613dfa565b95945050505050565b6000602082019050818103600083015261450f8184613e59565b905092915050565b6000602082019050818103600083015261453081613f42565b9050919050565b6000602082019050818103600083015261455081613f65565b9050919050565b6000602082019050818103600083015261457081613f88565b9050919050565b6000602082019050818103600083015261459081613fab565b9050919050565b600060208201905081810360008301526145b081613fce565b9050919050565b600060208201905081810360008301526145d081613ff1565b9050919050565b600060208201905081810360008301526145f081614014565b9050919050565b6000602082019050818103600083015261461081614037565b9050919050565b600060208201905081810360008301526146308161405a565b9050919050565b600060208201905081810360008301526146508161407d565b9050919050565b60006020820190508181036000830152614670816140a0565b9050919050565b60006020820190508181036000830152614690816140c3565b9050919050565b600060208201905081810360008301526146b0816140e6565b9050919050565b600060208201905081810360008301526146d081614109565b9050919050565b600060208201905081810360008301526146f08161412c565b9050919050565b600060208201905081810360008301526147108161414f565b9050919050565b6000602082019050818103600083015261473081614172565b9050919050565b6000602082019050818103600083015261475081614195565b9050919050565b60006020820190508181036000830152614770816141b8565b9050919050565b60006020820190508181036000830152614790816141db565b9050919050565b600060208201905081810360008301526147b0816141fe565b9050919050565b600060208201905081810360008301526147d081614221565b9050919050565b600060208201905081810360008301526147f081614244565b9050919050565b6000602082019050818103600083015261481081614267565b9050919050565b600060208201905081810360008301526148308161428a565b9050919050565b60006020820190508181036000830152614850816142ad565b9050919050565b60006020820190508181036000830152614870816142d0565b9050919050565b600060208201905061488c6000830184614302565b92915050565b60006040820190506148a76000830185614302565b6148b46020830184614302565b9392505050565b600080833560016020038436030381126148d457600080fd5b80840192508235915067ffffffffffffffff8211156148f257600080fd5b60208301925060208202360383131561490a57600080fd5b509250929050565b600061491c61492d565b90506149288282614c4e565b919050565b6000604051905090565b600067ffffffffffffffff82111561495257614951614d90565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561497e5761497d614d90565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156149aa576149a9614d90565b5b6149b382614de1565b9050602081019050919050565b600067ffffffffffffffff8211156149db576149da614d90565b5b6149e482614de1565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614a8d82614bc3565b9150614a9883614bc3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614acd57614acc614d03565b5b828201905092915050565b6000614ae382614bc3565b9150614aee83614bc3565b925082614afe57614afd614d32565b5b828204905092915050565b6000614b1482614bc3565b9150614b1f83614bc3565b925082821015614b3257614b31614d03565b5b828203905092915050565b6000614b4882614ba3565b9050919050565b6000614b5a82614ba3565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614c07578082015181840152602081019050614bec565b83811115614c16576000848401525b50505050565b60006002820490506001821680614c3457607f821691505b60208210811415614c4857614c47614d61565b5b50919050565b614c5782614de1565b810181811067ffffffffffffffff82111715614c7657614c75614d90565b5b80604052505050565b6000614c8a82614bc3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614cbd57614cbc614d03565b5b600182019050919050565b6000819050919050565b6000614cdd82614bc3565b9150614ce883614bc3565b925082614cf857614cf7614d32565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115614dde5760046000803e614ddb600051614df2565b90505b90565b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f73656e646572206973206572726f720000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f446f67486169723a7472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f636865636b5369676e3a20696e76616c6964207369676e617475726500000000600082015250565b7f5f616d6f756e74203e2030000000000000000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f646561646c696e65206861732070617373656400000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f7369676e617475726520686173206265656e2075736564000000000000000000600082015250565b7f696e76616c696420696e70757400000000000000000000000000000000000000600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600060443d10156154e85761556b565b6154f061492d565b60043d036004823e80513d602482011167ffffffffffffffff8211171561551857505061556b565b808201805167ffffffffffffffff811115615536575050505061556b565b80602083010160043d03850181111561555357505050505061556b565b61556282602001850186614c4e565b82955050505050505b90565b61557781614b3d565b811461558257600080fd5b50565b61558e81614b4f565b811461559957600080fd5b50565b6155a581614b61565b81146155b057600080fd5b50565b6155bc81614b77565b81146155c757600080fd5b50565b6155d381614bc3565b81146155de57600080fd5b5056fea26469706673582212209e71ac53c42543b81de37a327305424450b21a0be1d2cccf5ad9b7fd0ba879b164736f6c63430008040033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d4e6a4c6b456d413570443872455a6759777838597377706d553557435157703939795164695150713336626b2f000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseUri (string): https://gateway.pinata.cloud/ipfs/QmNjLkEmA5pD8rEZgYwx8YswpmU5WCQWp99yQdiQPq36bk/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [2] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [3] : 732f516d4e6a4c6b456d413570443872455a6759777838597377706d55355743
Arg [4] : 5157703939795164695150713336626b2f000000000000000000000000000000


Deployed Bytecode Sourcemap

53376:3321:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37809:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36832:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53890:94;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53992:236;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39748:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53468:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38206:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17023:103;;;:::i;:::-;;53503:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54925:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16372:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55390:378;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53605:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38803:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54236:681;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55071:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39030:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39270:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53785:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17281:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53553:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37809:231;37895:7;37942:1;37923:21;;:7;:21;;;;37915:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;38010:9;:13;38020:2;38010:13;;;;;;;;;;;:22;38024:7;38010:22;;;;;;;;;;;;;;;;38003:29;;37809:231;;;;:::o;36832:310::-;36934:4;36986:26;36971:41;;;:11;:41;;;;:110;;;;37044:37;37029:52;;;:11;:52;;;;36971:110;:163;;;;37098:36;37122:11;37098:23;:36::i;:::-;36971:163;36951:183;;36832:310;;;:::o;53890:94::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53969:7:::1;53959;:17;;;;;;;;;;;;:::i;:::-;;53890:94:::0;:::o;53992:236::-;54053:13;54123:1;54105:7;54099:21;;;;;:::i;:::-;;;:25;:121;;;;;;;;;;;;;;;;;54168:7;54177:19;:8;:17;:19::i;:::-;54151:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54099:121;54079:141;;53992:236;;;:::o;39748:442::-;39989:12;:10;:12::i;:::-;39981:20;;:4;:20;;;:60;;;;40005:36;40022:4;40028:12;:10;:12::i;:::-;40005:16;:36::i;:::-;39981:60;39959:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;40130:52;40153:4;40159:2;40163:3;40168:7;40177:4;40130:22;:52::i;:::-;39748:442;;;;;:::o;53468:28::-;;;;;;;;;;;;;:::o;38206:524::-;38362:16;38423:3;:10;38404:8;:15;:29;38396:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;38492:30;38539:8;:15;38525:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38492:63;;38573:9;38568:122;38592:8;:15;38588:1;:19;38568:122;;;38648:30;38658:8;38667:1;38658:11;;;;;;;;;;;;;;;;;;;;;;38671:3;38675:1;38671:6;;;;;;;;;;;;;;;;;;;;;;38648:9;:30::i;:::-;38629:13;38643:1;38629:16;;;;;;;;;;;;;;;;;;;;;:49;;;;;38609:3;;;;:::i;:::-;;;38568:122;;;;38709:13;38702:20;;;38206:524;;;;:::o;17023:103::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17088:30:::1;17115:1;17088:18;:30::i;:::-;17023:103::o:0;53503:41::-;;;;;;;;;;;;;;;;;:::o;54925:138::-;55017:38;55028:10;55040:4;;55017:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55046:8;;55017:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:10;:38::i;:::-;54925:138;;;;:::o;16372:87::-;16418:7;16445:6;;;;;;;;;;;16438:13;;16372:87;:::o;55390:378::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55576:4:::1;;:11;;55562:3;;:10;;:25;:58;;;;;55605:8;;:15;;55591:3;;:10;;:29;55562:58;55554:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;55655:9;55650:111;55674:3;;:10;;55670:1;:14;55650:111;;;55706:43;55717:3;;55721:1;55717:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55725:4;;55730:1;55725:7;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55706:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55734:8;;55743:1;55734:11;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55706:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;:10:::1;:43::i;:::-;55686:3;;;;;:::i;:::-;;;;55650:111;;;;55390:378:::0;;;;;;:::o;53605:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38803:155::-;38898:52;38917:12;:10;:12::i;:::-;38931:8;38941;38898:18;:52::i;:::-;38803:155;;:::o;54236:681::-;13470:1;14068:7;;:19;;14060:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;13470:1;14201:7;:18;;;;54361:11:::1;54374:14:::0;54389:16:::1;54406:25:::0;54432:24:::1;54485:8;;54460:105;;;;;;;:::i;:::-;54360:205;;;;;;;;;;54578:31;54588:8;;54578:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54598:10;;54578:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:31::i;:::-;;54646:8;54628:15;:26;54620:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;54724:5;54697:32;;:15;:23;54713:6;54697:23;;;;;;;;;;;;;;;;;;;;;:32;;;54689:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54790:3;54776:17;;:10;:17;;;54768:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;54824:44;54835:10;54847:8;54857:7;54824:44;;;;;;;;;;;::::0;:10:::1;:44::i;:::-;54905:4;54879:15;:23;54895:6;54879:23;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;14232:1;;;;;13426::::0;14380:7;:22;;;;54236:681;;;;:::o;55071:311::-;55187:1;55177:7;:11;55169:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;55222:35;55239:7;55248:8;55222:16;:35::i;:::-;:60;;;;55275:7;55261:21;;:10;:21;;;55222:60;55214:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;55346:28;55352:7;55361:3;55366:7;55346:5;:28::i;:::-;55071:311;;;;:::o;39030:168::-;39129:4;39153:18;:27;39172:7;39153:27;;;;;;;;;;;;;;;:37;39181:8;39153:37;;;;;;;;;;;;;;;;;;;;;;;;;39146:44;;39030:168;;;;:::o;39270:401::-;39486:12;:10;:12::i;:::-;39478:20;;:4;:20;;;:60;;;;39502:36;39519:4;39525:12;:10;:12::i;:::-;39502:16;:36::i;:::-;39478:60;39456:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;39618:45;39636:4;39642:2;39646;39650:6;39658:4;39618:17;:45::i;:::-;39270:401;;;;;:::o;53785:97::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53867:7:::1;53851:13;;:23;;;;;;;;;;;;;;;;;;53785:97:::0;:::o;17281:201::-;16603:12;:10;:12::i;:::-;16592:23;;:7;:5;:7::i;:::-;:23;;;16584:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17390:1:::1;17370:22;;:8;:22;;;;17362:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17446:28;17465:8;17446:18;:28::i;:::-;17281:201:::0;:::o;53553:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;28125:157::-;28210:4;28249:25;28234:40;;;:11;:40;;;;28227:47;;28125:157;;;:::o;15096:98::-;15149:7;15176:10;15169:17;;15096:98;:::o;365:723::-;421:13;651:1;642:5;:10;638:53;;;669:10;;;;;;;;;;;;;;;;;;;;;638:53;701:12;716:5;701:20;;732:14;757:78;772:1;764:4;:9;757:78;;790:8;;;;;:::i;:::-;;;;821:2;813:10;;;;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;845:39;;895:154;911:1;902:5;:10;895:154;;939:1;929:11;;;;;:::i;:::-;;;1006:2;998:5;:10;;;;:::i;:::-;985:2;:24;;;;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1035:2;1026:11;;;;;:::i;:::-;;;895:154;;;1073:6;1059:21;;;;;365:723;;;;:::o;41986:1146::-;42213:7;:14;42199:3;:10;:28;42191:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;42305:1;42291:16;;:2;:16;;;;42283:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;42362:16;42381:12;:10;:12::i;:::-;42362:31;;42406:60;42427:8;42437:4;42443:2;42447:3;42452:7;42461:4;42406:20;:60::i;:::-;42484:9;42479:421;42503:3;:10;42499:1;:14;42479:421;;;42535:10;42548:3;42552:1;42548:6;;;;;;;;;;;;;;;;;;;;;;42535:19;;42569:14;42586:7;42594:1;42586:10;;;;;;;;;;;;;;;;;;;;;;42569:27;;42613:19;42635:9;:13;42645:2;42635:13;;;;;;;;;;;:19;42649:4;42635:19;;;;;;;;;;;;;;;;42613:41;;42692:6;42677:11;:21;;42669:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;42825:6;42811:11;:20;42789:9;:13;42799:2;42789:13;;;;;;;;;;;:19;42803:4;42789:19;;;;;;;;;;;;;;;:42;;;;42882:6;42861:9;:13;42871:2;42861:13;;;;;;;;;;;:17;42875:2;42861:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;42479:421;;;42515:3;;;;:::i;:::-;;;42479:421;;;;42947:2;42917:47;;42941:4;42917:47;;42931:8;42917:47;;;42951:3;42956:7;42917:47;;;;;;;:::i;:::-;;;;;;;;42977:59;42997:8;43007:4;43013:2;43017:3;43022:7;43031:4;42977:19;:59::i;:::-;43049:75;43085:8;43095:4;43101:2;43105:3;43110:7;43119:4;43049:35;:75::i;:::-;41986:1146;;;;;;:::o;17642:191::-;17716:16;17735:6;;;;;;;;;;;17716:25;;17761:8;17752:6;;:17;;;;;;;;;;;;;;;;;;17816:8;17785:40;;17806:8;17785:40;;;;;;;;;;;;17642:191;;:::o;47609:969::-;47777:1;47761:18;;:4;:18;;;;47753:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;47852:7;:14;47838:3;:10;:28;47830:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;47924:16;47943:12;:10;:12::i;:::-;47924:31;;47968:66;47989:8;47999:4;48013:1;48017:3;48022:7;47968:66;;;;;;;;;;;;:20;:66::i;:::-;48052:9;48047:373;48071:3;:10;48067:1;:14;48047:373;;;48103:10;48116:3;48120:1;48116:6;;;;;;;;;;;;;;;;;;;;;;48103:19;;48137:14;48154:7;48162:1;48154:10;;;;;;;;;;;;;;;;;;;;;;48137:27;;48181:19;48203:9;:13;48213:2;48203:13;;;;;;;;;;;:19;48217:4;48203:19;;;;;;;;;;;;;;;;48181:41;;48260:6;48245:11;:21;;48237:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;48387:6;48373:11;:20;48351:9;:13;48361:2;48351:13;;;;;;;;;;;:19;48365:4;48351:19;;;;;;;;;;;;;;;:42;;;;48047:373;;;48083:3;;;;;:::i;:::-;;;;48047:373;;;;48475:1;48437:55;;48461:4;48437:55;;48451:8;48437:55;;;48479:3;48484:7;48437:55;;;;;;;:::i;:::-;;;;;;;;48505:65;48525:8;48535:4;48549:1;48553:3;48558:7;48505:65;;;;;;;;;;;;:19;:65::i;:::-;47609:969;;;;:::o;45535:813::-;45727:1;45713:16;;:2;:16;;;;45705:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;45800:7;:14;45786:3;:10;:28;45778:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;45872:16;45891:12;:10;:12::i;:::-;45872:31;;45916:66;45937:8;45955:1;45959:2;45963:3;45968:7;45977:4;45916:20;:66::i;:::-;46000:9;45995:103;46019:3;:10;46015:1;:14;45995:103;;;46076:7;46084:1;46076:10;;;;;;;;;;;;;;;;;;;;;;46051:9;:17;46061:3;46065:1;46061:6;;;;;;;;;;;;;;;;;;;;;;46051:17;;;;;;;;;;;:21;46069:2;46051:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;46031:3;;;;;:::i;:::-;;;;45995:103;;;;46151:2;46115:53;;46147:1;46115:53;;46129:8;46115:53;;;46155:3;46160:7;46115:53;;;;;;;:::i;:::-;;;;;;;;46181:65;46201:8;46219:1;46223:2;46227:3;46232:7;46241:4;46181:19;:65::i;:::-;46259:81;46295:8;46313:1;46317:2;46321:3;46326:7;46335:4;46259:35;:81::i;:::-;45535:813;;;;;:::o;48720:331::-;48875:8;48866:17;;:5;:17;;;;48858:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48978:8;48940:18;:25;48959:5;48940:25;;;;;;;;;;;;;;;:35;48966:8;48940:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;49024:8;49002:41;;49017:5;49002:41;;;49034:8;49002:41;;;;;;:::i;:::-;;;;;;;;48720:331;;;:::o;56332:362::-;56447:4;56469:12;56521:7;56511:18;;;;;;56494:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;56484:47;;;;;;56469:62;;56542:14;56559:30;56573:4;56579:9;56559:13;:30::i;:::-;56542:47;;56618:13;;;;;;;;;;;56608:23;;:6;:23;;;56600:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;56682:4;56675:11;;;;56332:362;;;;:::o;46598:808::-;46741:1;46725:18;;:4;:18;;;;46717:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;46796:16;46815:12;:10;:12::i;:::-;46796:31;;46838:20;46861:21;46879:2;46861:17;:21::i;:::-;46838:44;;46893:24;46920:25;46938:6;46920:17;:25::i;:::-;46893:52;;46958:66;46979:8;46989:4;47003:1;47007:3;47012:7;46958:66;;;;;;;;;;;;:20;:66::i;:::-;47037:19;47059:9;:13;47069:2;47059:13;;;;;;;;;;;:19;47073:4;47059:19;;;;;;;;;;;;;;;;47037:41;;47112:6;47097:11;:21;;47089:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;47231:6;47217:11;:20;47195:9;:13;47205:2;47195:13;;;;;;;;;;;:19;47209:4;47195:19;;;;;;;;;;;;;;;:42;;;;47305:1;47266:54;;47291:4;47266:54;;47281:8;47266:54;;;47309:2;47313:6;47266:54;;;;;;;:::i;:::-;;;;;;;;47333:65;47353:8;47363:4;47377:1;47381:3;47386:7;47333:65;;;;;;;;;;;;:19;:65::i;:::-;46598:808;;;;;;;:::o;40654:974::-;40856:1;40842:16;;:2;:16;;;;40834:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;40913:16;40932:12;:10;:12::i;:::-;40913:31;;40955:20;40978:21;40996:2;40978:17;:21::i;:::-;40955:44;;41010:24;41037:25;41055:6;41037:17;:25::i;:::-;41010:52;;41075:60;41096:8;41106:4;41112:2;41116:3;41121:7;41130:4;41075:20;:60::i;:::-;41148:19;41170:9;:13;41180:2;41170:13;;;;;;;;;;;:19;41184:4;41170:19;;;;;;;;;;;;;;;;41148:41;;41223:6;41208:11;:21;;41200:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;41348:6;41334:11;:20;41312:9;:13;41322:2;41312:13;;;;;;;;;;;:19;41326:4;41312:19;;;;;;;;;;;;;;;:42;;;;41397:6;41376:9;:13;41386:2;41376:13;;;;;;;;;;;:17;41390:2;41376:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;41452:2;41421:46;;41446:4;41421:46;;41436:8;41421:46;;;41456:2;41460:6;41421:46;;;;;;;:::i;:::-;;;;;;;;41480:59;41500:8;41510:4;41516:2;41520:3;41525:7;41534:4;41480:19;:59::i;:::-;41552:68;41583:8;41593:4;41599:2;41603;41607:6;41615:4;41552:30;:68::i;:::-;40654:974;;;;;;;;;:::o;50007:221::-;;;;;;;:::o;55780:544::-;56029:1;56013:18;;:4;:18;;;56009:308;;;56052:6;56047:103;56068:3;:10;56064:1;:14;56047:103;;;56124:7;56132:1;56124:10;;;;;;;;;;;;;;;;;;;;;;56104:8;:16;56113:3;56117:1;56113:6;;;;;;;;;;;;;;;;;;;;;;56104:16;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;56080:3;;;;;:::i;:::-;;;;56047:103;;;;56009:308;;;56184:1;56170:16;;:2;:16;;;56166:151;;;56208:6;56203:103;56224:3;:10;56220:1;:14;56203:103;;;56280:7;56288:1;56280:10;;;;;;;;;;;;;;;;;;;;;;56260:8;:16;56269:3;56273:1;56269:6;;;;;;;;;;;;;;;;;;;;;;56260:16;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;56236:3;;;;;:::i;:::-;;;;56203:103;;;;56166:151;56009:308;55780:544;;;;;;:::o;52163:813::-;52403:15;:2;:13;;;:15::i;:::-;52399:570;;;52456:2;52439:43;;;52483:8;52493:4;52499:3;52504:7;52513:4;52439:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;52435:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;52831:6;52824:14;;;;;;;;;;;:::i;:::-;;;;;;;;52435:523;;;52880:62;;;;;;;;;;:::i;:::-;;;;;;;;52435:523;52612:48;;;52600:60;;;:8;:60;;;;52596:159;;52685:50;;;;;;;;;;:::i;:::-;;;;;;;;52596:159;52519:251;52399:570;52163:813;;;;;;:::o;6541:231::-;6619:7;6640:17;6659:18;6681:27;6692:4;6698:9;6681:10;:27::i;:::-;6639:69;;;;6719:18;6731:5;6719:11;:18::i;:::-;6755:9;6748:16;;;;6541:231;;;;:::o;52984:198::-;53050:16;53079:22;53118:1;53104:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53079:41;;53142:7;53131:5;53137:1;53131:8;;;;;;;;;;;;;;;;;;;;;:18;;;;;53169:5;53162:12;;;52984:198;;;:::o;51411:744::-;51626:15;:2;:13;;;:15::i;:::-;51622:526;;;51679:2;51662:38;;;51701:8;51711:4;51717:2;51721:6;51729:4;51662:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51658:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;52010:6;52003:14;;;;;;;;;;;:::i;:::-;;;;;;;;51658:479;;;52059:62;;;;;;;;;;:::i;:::-;;;;;;;;51658:479;51796:43;;;51784:55;;;:8;:55;;;;51780:154;;51864:50;;;;;;;;;;:::i;:::-;;;;;;;;51780:154;51735:214;51622:526;51411:744;;;;;;:::o;19073:326::-;19133:4;19390:1;19368:7;:19;;;:23;19361:30;;19073:326;;;:::o;4431:1308::-;4512:7;4521:12;4766:2;4746:9;:16;:22;4742:990;;;4785:9;4809;4833:7;5042:4;5031:9;5027:20;5021:27;5016:32;;5092:4;5081:9;5077:20;5071:27;5066:32;;5150:4;5139:9;5135:20;5129:27;5126:1;5121:36;5116:41;;5193:25;5204:4;5210:1;5213;5216;5193:10;:25::i;:::-;5186:32;;;;;;;;;4742:990;5260:2;5240:9;:16;:22;5236:496;;;5279:9;5303:10;5515:4;5504:9;5500:20;5494:27;5489:32;;5566:4;5555:9;5551:20;5545:27;5539:33;;5608:23;5619:4;5625:1;5628:2;5608:10;:23::i;:::-;5601:30;;;;;;;;5236:496;5680:1;5684:35;5664:56;;;;4431:1308;;;;;;:::o;2702:643::-;2780:20;2771:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;2767:571;;;2817:7;;2767:571;2878:29;2869:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;2865:473;;;2924:34;;;;;;;;;;:::i;:::-;;;;;;;;2865:473;2989:35;2980:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;2976:362;;;3041:41;;;;;;;;;;:::i;:::-;;;;;;;;2976:362;3113:30;3104:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;3100:238;;;3160:44;;;;;;;;;;:::i;:::-;;;;;;;;3100:238;3235:30;3226:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;3222:116;;;3282:44;;;;;;;;;;:::i;:::-;;;;;;;;3222:116;2702:643;;:::o;7993:1632::-;8124:7;8133:12;9058:66;9053:1;9045:10;;:79;9041:163;;;9157:1;9161:30;9141:51;;;;;;9041:163;9223:2;9218:1;:7;;;;:18;;;;;9234:2;9229:1;:7;;;;9218:18;9214:102;;;9269:1;9273:30;9253:51;;;;;;9214:102;9413:14;9430:24;9440:4;9446:1;9449;9452;9430:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9413:41;;9487:1;9469:20;;:6;:20;;;9465:103;;;9522:1;9526:29;9506:50;;;;;;;9465:103;9588:6;9596:20;9580:37;;;;;7993:1632;;;;;;;;:::o;7035:344::-;7149:7;7158:12;7183:9;7208:66;7200:75;;7195:2;:80;7183:92;;7286:7;7325:2;7318:3;7311:2;7303:11;;:18;;7302:25;;;;:::i;:::-;7286:42;;7346:25;7357:4;7363:1;7366;7369;7346:10;:25::i;:::-;7339:32;;;;;;7035:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;702:655::-;798:5;823:81;839:64;896:6;839:64;:::i;:::-;823:81;:::i;:::-;814:90;;924:5;953:6;946:5;939:21;987:4;980:5;976:16;969:23;;1013:6;1063:3;1055:4;1047:6;1043:17;1038:3;1034:27;1031:36;1028:2;;;1092:1;1089;1082:12;1028:2;1128:1;1113:238;1138:6;1135:1;1132:13;1113:238;;;1206:3;1235:37;1268:3;1256:10;1235:37;:::i;:::-;1230:3;1223:50;1302:4;1297:3;1293:14;1286:21;;1336:4;1331:3;1327:14;1320:21;;1173:178;1160:1;1157;1153:9;1148:14;;1113:238;;;1117:14;804:553;;;;;;;:::o;1363:343::-;1440:5;1465:65;1481:48;1522:6;1481:48;:::i;:::-;1465:65;:::i;:::-;1456:74;;1553:6;1546:5;1539:21;1591:4;1584:5;1580:16;1629:3;1620:6;1615:3;1611:16;1608:25;1605:2;;;1646:1;1643;1636:12;1605:2;1659:41;1693:6;1688:3;1683;1659:41;:::i;:::-;1446:260;;;;;;:::o;1712:345::-;1790:5;1815:66;1831:49;1873:6;1831:49;:::i;:::-;1815:66;:::i;:::-;1806:75;;1904:6;1897:5;1890:21;1942:4;1935:5;1931:16;1980:3;1971:6;1966:3;1962:16;1959:25;1956:2;;;1997:1;1994;1987:12;1956:2;2010:41;2044:6;2039:3;2034;2010:41;:::i;:::-;1796:261;;;;;;:::o;2063:139::-;2109:5;2147:6;2134:20;2125:29;;2163:33;2190:5;2163:33;:::i;:::-;2115:87;;;;:::o;2208:155::-;2262:5;2300:6;2287:20;2278:29;;2316:41;2351:5;2316:41;:::i;:::-;2268:95;;;;:::o;2386:367::-;2459:8;2469:6;2519:3;2512:4;2504:6;2500:17;2496:27;2486:2;;2537:1;2534;2527:12;2486:2;2573:6;2560:20;2550:30;;2603:18;2595:6;2592:30;2589:2;;;2635:1;2632;2625:12;2589:2;2672:4;2664:6;2660:17;2648:29;;2726:3;2718:4;2710:6;2706:17;2696:8;2692:32;2689:41;2686:2;;;2743:1;2740;2733:12;2686:2;2476:277;;;;;:::o;2776:303::-;2847:5;2896:3;2889:4;2881:6;2877:17;2873:27;2863:2;;2914:1;2911;2904:12;2863:2;2954:6;2941:20;2979:94;3069:3;3061:6;3054:4;3046:6;3042:17;2979:94;:::i;:::-;2970:103;;2853:226;;;;;:::o;3104:394::-;3204:8;3214:6;3264:3;3257:4;3249:6;3245:17;3241:27;3231:2;;3282:1;3279;3272:12;3231:2;3318:6;3305:20;3295:30;;3348:18;3340:6;3337:30;3334:2;;;3380:1;3377;3370:12;3334:2;3417:4;3409:6;3405:17;3393:29;;3471:3;3463:4;3455:6;3451:17;3441:8;3437:32;3434:41;3431:2;;;3488:1;3485;3478:12;3431:2;3221:277;;;;;:::o;3521:367::-;3594:8;3604:6;3654:3;3647:4;3639:6;3635:17;3631:27;3621:2;;3672:1;3669;3662:12;3621:2;3708:6;3695:20;3685:30;;3738:18;3730:6;3727:30;3724:2;;;3770:1;3767;3760:12;3724:2;3807:4;3799:6;3795:17;3783:29;;3861:3;3853:4;3845:6;3841:17;3831:8;3827:32;3824:41;3821:2;;;3878:1;3875;3868:12;3821:2;3611:277;;;;;:::o;3911:303::-;3982:5;4031:3;4024:4;4016:6;4012:17;4008:27;3998:2;;4049:1;4046;4039:12;3998:2;4089:6;4076:20;4114:94;4204:3;4196:6;4189:4;4181:6;4177:17;4114:94;:::i;:::-;4105:103;;3988:226;;;;;:::o;4220:133::-;4263:5;4301:6;4288:20;4279:29;;4317:30;4341:5;4317:30;:::i;:::-;4269:84;;;;:::o;4359:137::-;4404:5;4442:6;4429:20;4420:29;;4458:32;4484:5;4458:32;:::i;:::-;4410:86;;;;:::o;4502:141::-;4558:5;4589:6;4583:13;4574:22;;4605:32;4631:5;4605:32;:::i;:::-;4564:79;;;;:::o;4662:351::-;4719:8;4729:6;4779:3;4772:4;4764:6;4760:17;4756:27;4746:2;;4797:1;4794;4787:12;4746:2;4833:6;4820:20;4810:30;;4863:18;4855:6;4852:30;4849:2;;;4895:1;4892;4885:12;4849:2;4932:4;4924:6;4920:17;4908:29;;4986:3;4978:4;4970:6;4966:17;4956:8;4952:32;4949:41;4946:2;;;5003:1;5000;4993:12;4946:2;4736:277;;;;;:::o;5032:271::-;5087:5;5136:3;5129:4;5121:6;5117:17;5113:27;5103:2;;5154:1;5151;5144:12;5103:2;5194:6;5181:20;5219:78;5293:3;5285:6;5278:4;5270:6;5266:17;5219:78;:::i;:::-;5210:87;;5093:210;;;;;:::o;5323:273::-;5379:5;5428:3;5421:4;5413:6;5409:17;5405:27;5395:2;;5446:1;5443;5436:12;5395:2;5486:6;5473:20;5511:79;5586:3;5578:6;5571:4;5563:6;5559:17;5511:79;:::i;:::-;5502:88;;5385:211;;;;;:::o;5602:139::-;5648:5;5686:6;5673:20;5664:29;;5702:33;5729:5;5702:33;:::i;:::-;5654:87;;;;:::o;5747:262::-;5806:6;5855:2;5843:9;5834:7;5830:23;5826:32;5823:2;;;5871:1;5868;5861:12;5823:2;5914:1;5939:53;5984:7;5975:6;5964:9;5960:22;5939:53;:::i;:::-;5929:63;;5885:117;5813:196;;;;:::o;6015:1146::-;6168:6;6176;6184;6192;6200;6249:3;6237:9;6228:7;6224:23;6220:33;6217:2;;;6266:1;6263;6256:12;6217:2;6309:1;6334:61;6387:7;6378:6;6367:9;6363:22;6334:61;:::i;:::-;6324:71;;6280:125;6444:2;6470:53;6515:7;6506:6;6495:9;6491:22;6470:53;:::i;:::-;6460:63;;6415:118;6572:2;6598:53;6643:7;6634:6;6623:9;6619:22;6598:53;:::i;:::-;6588:63;;6543:118;6728:2;6717:9;6713:18;6700:32;6759:18;6751:6;6748:30;6745:2;;;6791:1;6788;6781:12;6745:2;6819:78;6889:7;6880:6;6869:9;6865:22;6819:78;:::i;:::-;6809:88;;6671:236;6974:3;6963:9;6959:19;6946:33;7006:18;6998:6;6995:30;6992:2;;;7038:1;7035;7028:12;6992:2;7066:78;7136:7;7127:6;7116:9;7112:22;7066:78;:::i;:::-;7056:88;;6917:237;6207:954;;;;;;;;:::o;7167:407::-;7235:6;7243;7292:2;7280:9;7271:7;7267:23;7263:32;7260:2;;;7308:1;7305;7298:12;7260:2;7351:1;7376:53;7421:7;7412:6;7401:9;7397:22;7376:53;:::i;:::-;7366:63;;7322:117;7478:2;7504:53;7549:7;7540:6;7529:9;7525:22;7504:53;:::i;:::-;7494:63;;7449:118;7250:324;;;;;:::o;7580:1241::-;7734:6;7742;7750;7758;7766;7815:3;7803:9;7794:7;7790:23;7786:33;7783:2;;;7832:1;7829;7822:12;7783:2;7875:1;7900:53;7945:7;7936:6;7925:9;7921:22;7900:53;:::i;:::-;7890:63;;7846:117;8002:2;8028:53;8073:7;8064:6;8053:9;8049:22;8028:53;:::i;:::-;8018:63;;7973:118;8158:2;8147:9;8143:18;8130:32;8189:18;8181:6;8178:30;8175:2;;;8221:1;8218;8211:12;8175:2;8249:78;8319:7;8310:6;8299:9;8295:22;8249:78;:::i;:::-;8239:88;;8101:236;8404:2;8393:9;8389:18;8376:32;8435:18;8427:6;8424:30;8421:2;;;8467:1;8464;8457:12;8421:2;8495:78;8565:7;8556:6;8545:9;8541:22;8495:78;:::i;:::-;8485:88;;8347:236;8650:3;8639:9;8635:19;8622:33;8682:18;8674:6;8671:30;8668:2;;;8714:1;8711;8704:12;8668:2;8742:62;8796:7;8787:6;8776:9;8772:22;8742:62;:::i;:::-;8732:72;;8593:221;7773:1048;;;;;;;;:::o;8827:698::-;8913:6;8921;8929;8937;8986:3;8974:9;8965:7;8961:23;8957:33;8954:2;;;9003:1;9000;8993:12;8954:2;9046:1;9071:53;9116:7;9107:6;9096:9;9092:22;9071:53;:::i;:::-;9061:63;;9017:117;9173:2;9199:53;9244:7;9235:6;9224:9;9220:22;9199:53;:::i;:::-;9189:63;;9144:118;9301:2;9327:53;9372:7;9363:6;9352:9;9348:22;9327:53;:::i;:::-;9317:63;;9272:118;9429:2;9455:53;9500:7;9491:6;9480:9;9476:22;9455:53;:::i;:::-;9445:63;;9400:118;8944:581;;;;;;;:::o;9531:955::-;9635:6;9643;9651;9659;9667;9716:3;9704:9;9695:7;9691:23;9687:33;9684:2;;;9733:1;9730;9723:12;9684:2;9776:1;9801:53;9846:7;9837:6;9826:9;9822:22;9801:53;:::i;:::-;9791:63;;9747:117;9903:2;9929:53;9974:7;9965:6;9954:9;9950:22;9929:53;:::i;:::-;9919:63;;9874:118;10031:2;10057:53;10102:7;10093:6;10082:9;10078:22;10057:53;:::i;:::-;10047:63;;10002:118;10159:2;10185:53;10230:7;10221:6;10210:9;10206:22;10185:53;:::i;:::-;10175:63;;10130:118;10315:3;10304:9;10300:19;10287:33;10347:18;10339:6;10336:30;10333:2;;;10379:1;10376;10369:12;10333:2;10407:62;10461:7;10452:6;10441:9;10437:22;10407:62;:::i;:::-;10397:72;;10258:221;9674:812;;;;;;;;:::o;10492:401::-;10557:6;10565;10614:2;10602:9;10593:7;10589:23;10585:32;10582:2;;;10630:1;10627;10620:12;10582:2;10673:1;10698:53;10743:7;10734:6;10723:9;10719:22;10698:53;:::i;:::-;10688:63;;10644:117;10800:2;10826:50;10868:7;10859:6;10848:9;10844:22;10826:50;:::i;:::-;10816:60;;10771:115;10572:321;;;;;:::o;10899:407::-;10967:6;10975;11024:2;11012:9;11003:7;10999:23;10995:32;10992:2;;;11040:1;11037;11030:12;10992:2;11083:1;11108:53;11153:7;11144:6;11133:9;11129:22;11108:53;:::i;:::-;11098:63;;11054:117;11210:2;11236:53;11281:7;11272:6;11261:9;11257:22;11236:53;:::i;:::-;11226:63;;11181:118;10982:324;;;;;:::o;11312:1149::-;11524:6;11532;11540;11548;11556;11564;11613:2;11601:9;11592:7;11588:23;11584:32;11581:2;;;11629:1;11626;11619:12;11581:2;11700:1;11689:9;11685:17;11672:31;11730:18;11722:6;11719:30;11716:2;;;11762:1;11759;11752:12;11716:2;11798:80;11870:7;11861:6;11850:9;11846:22;11798:80;:::i;:::-;11780:98;;;;11643:245;11955:2;11944:9;11940:18;11927:32;11986:18;11978:6;11975:30;11972:2;;;12018:1;12015;12008:12;11972:2;12054:107;12153:7;12144:6;12133:9;12129:22;12054:107;:::i;:::-;12036:125;;;;11898:273;12238:2;12227:9;12223:18;12210:32;12269:18;12261:6;12258:30;12255:2;;;12301:1;12298;12291:12;12255:2;12337:107;12436:7;12427:6;12416:9;12412:22;12337:107;:::i;:::-;12319:125;;;;12181:273;11571:890;;;;;;;;:::o;12467:693::-;12585:6;12593;12642:2;12630:9;12621:7;12617:23;12613:32;12610:2;;;12658:1;12655;12648:12;12610:2;12729:1;12718:9;12714:17;12701:31;12759:18;12751:6;12748:30;12745:2;;;12791:1;12788;12781:12;12745:2;12819:78;12889:7;12880:6;12869:9;12865:22;12819:78;:::i;:::-;12809:88;;12672:235;12974:2;12963:9;12959:18;12946:32;13005:18;12997:6;12994:30;12991:2;;;13037:1;13034;13027:12;12991:2;13065:78;13135:7;13126:6;13115:9;13111:22;13065:78;:::i;:::-;13055:88;;12917:236;12600:560;;;;;:::o;13166:733::-;13288:6;13296;13304;13312;13361:2;13349:9;13340:7;13336:23;13332:32;13329:2;;;13377:1;13374;13367:12;13329:2;13448:1;13437:9;13433:17;13420:31;13478:18;13470:6;13467:30;13464:2;;;13510:1;13507;13500:12;13464:2;13546:80;13618:7;13609:6;13598:9;13594:22;13546:80;:::i;:::-;13528:98;;;;13391:245;13703:2;13692:9;13688:18;13675:32;13734:18;13726:6;13723:30;13720:2;;;13766:1;13763;13756:12;13720:2;13802:80;13874:7;13865:6;13854:9;13850:22;13802:80;:::i;:::-;13784:98;;;;13646:246;13319:580;;;;;;;:::o;13905:260::-;13963:6;14012:2;14000:9;13991:7;13987:23;13983:32;13980:2;;;14028:1;14025;14018:12;13980:2;14071:1;14096:52;14140:7;14131:6;14120:9;14116:22;14096:52;:::i;:::-;14086:62;;14042:116;13970:195;;;;:::o;14171:282::-;14240:6;14289:2;14277:9;14268:7;14264:23;14260:32;14257:2;;;14305:1;14302;14295:12;14257:2;14348:1;14373:63;14428:7;14419:6;14408:9;14404:22;14373:63;:::i;:::-;14363:73;;14319:127;14247:206;;;;:::o;14459:669::-;14549:6;14557;14565;14573;14622:2;14610:9;14601:7;14597:23;14593:32;14590:2;;;14638:1;14635;14628:12;14590:2;14709:1;14698:9;14694:17;14681:31;14739:18;14731:6;14728:30;14725:2;;;14771:1;14768;14761:12;14725:2;14807:64;14863:7;14854:6;14843:9;14839:22;14807:64;:::i;:::-;14789:82;;;;14652:229;14948:2;14937:9;14933:18;14920:32;14979:18;14971:6;14968:30;14965:2;;;15011:1;15008;15001:12;14965:2;15047:64;15103:7;15094:6;15083:9;15079:22;15047:64;:::i;:::-;15029:82;;;;14891:230;14580:548;;;;;;;:::o;15134:375::-;15203:6;15252:2;15240:9;15231:7;15227:23;15223:32;15220:2;;;15268:1;15265;15258:12;15220:2;15339:1;15328:9;15324:17;15311:31;15369:18;15361:6;15358:30;15355:2;;;15401:1;15398;15391:12;15355:2;15429:63;15484:7;15475:6;15464:9;15460:22;15429:63;:::i;:::-;15419:73;;15282:220;15210:299;;;;:::o;15515:262::-;15574:6;15623:2;15611:9;15602:7;15598:23;15594:32;15591:2;;;15639:1;15636;15629:12;15591:2;15682:1;15707:53;15752:7;15743:6;15732:9;15728:22;15707:53;:::i;:::-;15697:63;;15653:117;15581:196;;;;:::o;15783:179::-;15852:10;15873:46;15915:3;15907:6;15873:46;:::i;:::-;15951:4;15946:3;15942:14;15928:28;;15863:99;;;;:::o;15968:118::-;16055:24;16073:5;16055:24;:::i;:::-;16050:3;16043:37;16033:53;;:::o;16122:732::-;16241:3;16270:54;16318:5;16270:54;:::i;:::-;16340:86;16419:6;16414:3;16340:86;:::i;:::-;16333:93;;16450:56;16500:5;16450:56;:::i;:::-;16529:7;16560:1;16545:284;16570:6;16567:1;16564:13;16545:284;;;16646:6;16640:13;16673:63;16732:3;16717:13;16673:63;:::i;:::-;16666:70;;16759:60;16812:6;16759:60;:::i;:::-;16749:70;;16605:224;16592:1;16589;16585:9;16580:14;;16545:284;;;16549:14;16845:3;16838:10;;16246:608;;;;;;;:::o;16860:109::-;16941:21;16956:5;16941:21;:::i;:::-;16936:3;16929:34;16919:50;;:::o;16975:118::-;17062:24;17080:5;17062:24;:::i;:::-;17057:3;17050:37;17040:53;;:::o;17099:157::-;17204:45;17224:24;17242:5;17224:24;:::i;:::-;17204:45;:::i;:::-;17199:3;17192:58;17182:74;;:::o;17262:360::-;17348:3;17376:38;17408:5;17376:38;:::i;:::-;17430:70;17493:6;17488:3;17430:70;:::i;:::-;17423:77;;17509:52;17554:6;17549:3;17542:4;17535:5;17531:16;17509:52;:::i;:::-;17586:29;17608:6;17586:29;:::i;:::-;17581:3;17577:39;17570:46;;17352:270;;;;;:::o;17628:364::-;17716:3;17744:39;17777:5;17744:39;:::i;:::-;17799:71;17863:6;17858:3;17799:71;:::i;:::-;17792:78;;17879:52;17924:6;17919:3;17912:4;17905:5;17901:16;17879:52;:::i;:::-;17956:29;17978:6;17956:29;:::i;:::-;17951:3;17947:39;17940:46;;17720:272;;;;;:::o;17998:377::-;18104:3;18132:39;18165:5;18132:39;:::i;:::-;18187:89;18269:6;18264:3;18187:89;:::i;:::-;18180:96;;18285:52;18330:6;18325:3;18318:4;18311:5;18307:16;18285:52;:::i;:::-;18362:6;18357:3;18353:16;18346:23;;18108:267;;;;;:::o;18405:845::-;18508:3;18545:5;18539:12;18574:36;18600:9;18574:36;:::i;:::-;18626:89;18708:6;18703:3;18626:89;:::i;:::-;18619:96;;18746:1;18735:9;18731:17;18762:1;18757:137;;;;18908:1;18903:341;;;;18724:520;;18757:137;18841:4;18837:9;18826;18822:25;18817:3;18810:38;18877:6;18872:3;18868:16;18861:23;;18757:137;;18903:341;18970:38;19002:5;18970:38;:::i;:::-;19030:1;19044:154;19058:6;19055:1;19052:13;19044:154;;;19132:7;19126:14;19122:1;19117:3;19113:11;19106:35;19182:1;19173:7;19169:15;19158:26;;19080:4;19077:1;19073:12;19068:17;;19044:154;;;19227:6;19222:3;19218:16;19211:23;;18910:334;;18724:520;;18512:738;;;;;;:::o;19256:366::-;19398:3;19419:67;19483:2;19478:3;19419:67;:::i;:::-;19412:74;;19495:93;19584:3;19495:93;:::i;:::-;19613:2;19608:3;19604:12;19597:19;;19402:220;;;:::o;19628:366::-;19770:3;19791:67;19855:2;19850:3;19791:67;:::i;:::-;19784:74;;19867:93;19956:3;19867:93;:::i;:::-;19985:2;19980:3;19976:12;19969:19;;19774:220;;;:::o;20000:366::-;20142:3;20163:67;20227:2;20222:3;20163:67;:::i;:::-;20156:74;;20239:93;20328:3;20239:93;:::i;:::-;20357:2;20352:3;20348:12;20341:19;;20146:220;;;:::o;20372:366::-;20514:3;20535:67;20599:2;20594:3;20535:67;:::i;:::-;20528:74;;20611:93;20700:3;20611:93;:::i;:::-;20729:2;20724:3;20720:12;20713:19;;20518:220;;;:::o;20744:366::-;20886:3;20907:67;20971:2;20966:3;20907:67;:::i;:::-;20900:74;;20983:93;21072:3;20983:93;:::i;:::-;21101:2;21096:3;21092:12;21085:19;;20890:220;;;:::o;21116:366::-;21258:3;21279:67;21343:2;21338:3;21279:67;:::i;:::-;21272:74;;21355:93;21444:3;21355:93;:::i;:::-;21473:2;21468:3;21464:12;21457:19;;21262:220;;;:::o;21488:366::-;21630:3;21651:67;21715:2;21710:3;21651:67;:::i;:::-;21644:74;;21727:93;21816:3;21727:93;:::i;:::-;21845:2;21840:3;21836:12;21829:19;;21634:220;;;:::o;21860:366::-;22002:3;22023:67;22087:2;22082:3;22023:67;:::i;:::-;22016:74;;22099:93;22188:3;22099:93;:::i;:::-;22217:2;22212:3;22208:12;22201:19;;22006:220;;;:::o;22232:366::-;22374:3;22395:67;22459:2;22454:3;22395:67;:::i;:::-;22388:74;;22471:93;22560:3;22471:93;:::i;:::-;22589:2;22584:3;22580:12;22573:19;;22378:220;;;:::o;22604:366::-;22746:3;22767:67;22831:2;22826:3;22767:67;:::i;:::-;22760:74;;22843:93;22932:3;22843:93;:::i;:::-;22961:2;22956:3;22952:12;22945:19;;22750:220;;;:::o;22976:366::-;23118:3;23139:67;23203:2;23198:3;23139:67;:::i;:::-;23132:74;;23215:93;23304:3;23215:93;:::i;:::-;23333:2;23328:3;23324:12;23317:19;;23122:220;;;:::o;23348:366::-;23490:3;23511:67;23575:2;23570:3;23511:67;:::i;:::-;23504:74;;23587:93;23676:3;23587:93;:::i;:::-;23705:2;23700:3;23696:12;23689:19;;23494:220;;;:::o;23720:366::-;23862:3;23883:67;23947:2;23942:3;23883:67;:::i;:::-;23876:74;;23959:93;24048:3;23959:93;:::i;:::-;24077:2;24072:3;24068:12;24061:19;;23866:220;;;:::o;24092:366::-;24234:3;24255:67;24319:2;24314:3;24255:67;:::i;:::-;24248:74;;24331:93;24420:3;24331:93;:::i;:::-;24449:2;24444:3;24440:12;24433:19;;24238:220;;;:::o;24464:366::-;24606:3;24627:67;24691:2;24686:3;24627:67;:::i;:::-;24620:74;;24703:93;24792:3;24703:93;:::i;:::-;24821:2;24816:3;24812:12;24805:19;;24610:220;;;:::o;24836:366::-;24978:3;24999:67;25063:2;25058:3;24999:67;:::i;:::-;24992:74;;25075:93;25164:3;25075:93;:::i;:::-;25193:2;25188:3;25184:12;25177:19;;24982:220;;;:::o;25208:366::-;25350:3;25371:67;25435:2;25430:3;25371:67;:::i;:::-;25364:74;;25447:93;25536:3;25447:93;:::i;:::-;25565:2;25560:3;25556:12;25549:19;;25354:220;;;:::o;25580:366::-;25722:3;25743:67;25807:2;25802:3;25743:67;:::i;:::-;25736:74;;25819:93;25908:3;25819:93;:::i;:::-;25937:2;25932:3;25928:12;25921:19;;25726:220;;;:::o;25952:366::-;26094:3;26115:67;26179:2;26174:3;26115:67;:::i;:::-;26108:74;;26191:93;26280:3;26191:93;:::i;:::-;26309:2;26304:3;26300:12;26293:19;;26098:220;;;:::o;26324:366::-;26466:3;26487:67;26551:2;26546:3;26487:67;:::i;:::-;26480:74;;26563:93;26652:3;26563:93;:::i;:::-;26681:2;26676:3;26672:12;26665:19;;26470:220;;;:::o;26696:366::-;26838:3;26859:67;26923:2;26918:3;26859:67;:::i;:::-;26852:74;;26935:93;27024:3;26935:93;:::i;:::-;27053:2;27048:3;27044:12;27037:19;;26842:220;;;:::o;27068:366::-;27210:3;27231:67;27295:2;27290:3;27231:67;:::i;:::-;27224:74;;27307:93;27396:3;27307:93;:::i;:::-;27425:2;27420:3;27416:12;27409:19;;27214:220;;;:::o;27440:366::-;27582:3;27603:67;27667:2;27662:3;27603:67;:::i;:::-;27596:74;;27679:93;27768:3;27679:93;:::i;:::-;27797:2;27792:3;27788:12;27781:19;;27586:220;;;:::o;27812:366::-;27954:3;27975:67;28039:2;28034:3;27975:67;:::i;:::-;27968:74;;28051:93;28140:3;28051:93;:::i;:::-;28169:2;28164:3;28160:12;28153:19;;27958:220;;;:::o;28184:366::-;28326:3;28347:67;28411:2;28406:3;28347:67;:::i;:::-;28340:74;;28423:93;28512:3;28423:93;:::i;:::-;28541:2;28536:3;28532:12;28525:19;;28330:220;;;:::o;28556:366::-;28698:3;28719:67;28783:2;28778:3;28719:67;:::i;:::-;28712:74;;28795:93;28884:3;28795:93;:::i;:::-;28913:2;28908:3;28904:12;28897:19;;28702:220;;;:::o;28928:366::-;29070:3;29091:67;29155:2;29150:3;29091:67;:::i;:::-;29084:74;;29167:93;29256:3;29167:93;:::i;:::-;29285:2;29280:3;29276:12;29269:19;;29074:220;;;:::o;29300:108::-;29377:24;29395:5;29377:24;:::i;:::-;29372:3;29365:37;29355:53;;:::o;29414:118::-;29501:24;29519:5;29501:24;:::i;:::-;29496:3;29489:37;29479:53;;:::o;29538:112::-;29621:22;29637:5;29621:22;:::i;:::-;29616:3;29609:35;29599:51;;:::o;29656:256::-;29768:3;29783:75;29854:3;29845:6;29783:75;:::i;:::-;29883:2;29878:3;29874:12;29867:19;;29903:3;29896:10;;29772:140;;;;:::o;29918:429::-;30095:3;30117:92;30205:3;30196:6;30117:92;:::i;:::-;30110:99;;30226:95;30317:3;30308:6;30226:95;:::i;:::-;30219:102;;30338:3;30331:10;;30099:248;;;;;:::o;30353:222::-;30446:4;30484:2;30473:9;30469:18;30461:26;;30497:71;30565:1;30554:9;30550:17;30541:6;30497:71;:::i;:::-;30451:124;;;;:::o;30581:1053::-;30904:4;30942:3;30931:9;30927:19;30919:27;;30956:71;31024:1;31013:9;31009:17;31000:6;30956:71;:::i;:::-;31037:72;31105:2;31094:9;31090:18;31081:6;31037:72;:::i;:::-;31156:9;31150:4;31146:20;31141:2;31130:9;31126:18;31119:48;31184:108;31287:4;31278:6;31184:108;:::i;:::-;31176:116;;31339:9;31333:4;31329:20;31324:2;31313:9;31309:18;31302:48;31367:108;31470:4;31461:6;31367:108;:::i;:::-;31359:116;;31523:9;31517:4;31513:20;31507:3;31496:9;31492:19;31485:49;31551:76;31622:4;31613:6;31551:76;:::i;:::-;31543:84;;30909:725;;;;;;;;:::o;31640:751::-;31863:4;31901:3;31890:9;31886:19;31878:27;;31915:71;31983:1;31972:9;31968:17;31959:6;31915:71;:::i;:::-;31996:72;32064:2;32053:9;32049:18;32040:6;31996:72;:::i;:::-;32078;32146:2;32135:9;32131:18;32122:6;32078:72;:::i;:::-;32160;32228:2;32217:9;32213:18;32204:6;32160:72;:::i;:::-;32280:9;32274:4;32270:20;32264:3;32253:9;32249:19;32242:49;32308:76;32379:4;32370:6;32308:76;:::i;:::-;32300:84;;31868:523;;;;;;;;:::o;32397:373::-;32540:4;32578:2;32567:9;32563:18;32555:26;;32627:9;32621:4;32617:20;32613:1;32602:9;32598:17;32591:47;32655:108;32758:4;32749:6;32655:108;:::i;:::-;32647:116;;32545:225;;;;:::o;32776:634::-;32997:4;33035:2;33024:9;33020:18;33012:26;;33084:9;33078:4;33074:20;33070:1;33059:9;33055:17;33048:47;33112:108;33215:4;33206:6;33112:108;:::i;:::-;33104:116;;33267:9;33261:4;33257:20;33252:2;33241:9;33237:18;33230:48;33295:108;33398:4;33389:6;33295:108;:::i;:::-;33287:116;;33002:408;;;;;:::o;33416:210::-;33503:4;33541:2;33530:9;33526:18;33518:26;;33554:65;33616:1;33605:9;33601:17;33592:6;33554:65;:::i;:::-;33508:118;;;;:::o;33632:545::-;33805:4;33843:3;33832:9;33828:19;33820:27;;33857:71;33925:1;33914:9;33910:17;33901:6;33857:71;:::i;:::-;33938:68;34002:2;33991:9;33987:18;33978:6;33938:68;:::i;:::-;34016:72;34084:2;34073:9;34069:18;34060:6;34016:72;:::i;:::-;34098;34166:2;34155:9;34151:18;34142:6;34098:72;:::i;:::-;33810:367;;;;;;;:::o;34183:313::-;34296:4;34334:2;34323:9;34319:18;34311:26;;34383:9;34377:4;34373:20;34369:1;34358:9;34354:17;34347:47;34411:78;34484:4;34475:6;34411:78;:::i;:::-;34403:86;;34301:195;;;;:::o;34502:419::-;34668:4;34706:2;34695:9;34691:18;34683:26;;34755:9;34749:4;34745:20;34741:1;34730:9;34726:17;34719:47;34783:131;34909:4;34783:131;:::i;:::-;34775:139;;34673:248;;;:::o;34927:419::-;35093:4;35131:2;35120:9;35116:18;35108:26;;35180:9;35174:4;35170:20;35166:1;35155:9;35151:17;35144:47;35208:131;35334:4;35208:131;:::i;:::-;35200:139;;35098:248;;;:::o;35352:419::-;35518:4;35556:2;35545:9;35541:18;35533:26;;35605:9;35599:4;35595:20;35591:1;35580:9;35576:17;35569:47;35633:131;35759:4;35633:131;:::i;:::-;35625:139;;35523:248;;;:::o;35777:419::-;35943:4;35981:2;35970:9;35966:18;35958:26;;36030:9;36024:4;36020:20;36016:1;36005:9;36001:17;35994:47;36058:131;36184:4;36058:131;:::i;:::-;36050:139;;35948:248;;;:::o;36202:419::-;36368:4;36406:2;36395:9;36391:18;36383:26;;36455:9;36449:4;36445:20;36441:1;36430:9;36426:17;36419:47;36483:131;36609:4;36483:131;:::i;:::-;36475:139;;36373:248;;;:::o;36627:419::-;36793:4;36831:2;36820:9;36816:18;36808:26;;36880:9;36874:4;36870:20;36866:1;36855:9;36851:17;36844:47;36908:131;37034:4;36908:131;:::i;:::-;36900:139;;36798:248;;;:::o;37052:419::-;37218:4;37256:2;37245:9;37241:18;37233:26;;37305:9;37299:4;37295:20;37291:1;37280:9;37276:17;37269:47;37333:131;37459:4;37333:131;:::i;:::-;37325:139;;37223:248;;;:::o;37477:419::-;37643:4;37681:2;37670:9;37666:18;37658:26;;37730:9;37724:4;37720:20;37716:1;37705:9;37701:17;37694:47;37758:131;37884:4;37758:131;:::i;:::-;37750:139;;37648:248;;;:::o;37902:419::-;38068:4;38106:2;38095:9;38091:18;38083:26;;38155:9;38149:4;38145:20;38141:1;38130:9;38126:17;38119:47;38183:131;38309:4;38183:131;:::i;:::-;38175:139;;38073:248;;;:::o;38327:419::-;38493:4;38531:2;38520:9;38516:18;38508:26;;38580:9;38574:4;38570:20;38566:1;38555:9;38551:17;38544:47;38608:131;38734:4;38608:131;:::i;:::-;38600:139;;38498:248;;;:::o;38752:419::-;38918:4;38956:2;38945:9;38941:18;38933:26;;39005:9;38999:4;38995:20;38991:1;38980:9;38976:17;38969:47;39033:131;39159:4;39033:131;:::i;:::-;39025:139;;38923:248;;;:::o;39177:419::-;39343:4;39381:2;39370:9;39366:18;39358:26;;39430:9;39424:4;39420:20;39416:1;39405:9;39401:17;39394:47;39458:131;39584:4;39458:131;:::i;:::-;39450:139;;39348:248;;;:::o;39602:419::-;39768:4;39806:2;39795:9;39791:18;39783:26;;39855:9;39849:4;39845:20;39841:1;39830:9;39826:17;39819:47;39883:131;40009:4;39883:131;:::i;:::-;39875:139;;39773:248;;;:::o;40027:419::-;40193:4;40231:2;40220:9;40216:18;40208:26;;40280:9;40274:4;40270:20;40266:1;40255:9;40251:17;40244:47;40308:131;40434:4;40308:131;:::i;:::-;40300:139;;40198:248;;;:::o;40452:419::-;40618:4;40656:2;40645:9;40641:18;40633:26;;40705:9;40699:4;40695:20;40691:1;40680:9;40676:17;40669:47;40733:131;40859:4;40733:131;:::i;:::-;40725:139;;40623:248;;;:::o;40877:419::-;41043:4;41081:2;41070:9;41066:18;41058:26;;41130:9;41124:4;41120:20;41116:1;41105:9;41101:17;41094:47;41158:131;41284:4;41158:131;:::i;:::-;41150:139;;41048:248;;;:::o;41302:419::-;41468:4;41506:2;41495:9;41491:18;41483:26;;41555:9;41549:4;41545:20;41541:1;41530:9;41526:17;41519:47;41583:131;41709:4;41583:131;:::i;:::-;41575:139;;41473:248;;;:::o;41727:419::-;41893:4;41931:2;41920:9;41916:18;41908:26;;41980:9;41974:4;41970:20;41966:1;41955:9;41951:17;41944:47;42008:131;42134:4;42008:131;:::i;:::-;42000:139;;41898:248;;;:::o;42152:419::-;42318:4;42356:2;42345:9;42341:18;42333:26;;42405:9;42399:4;42395:20;42391:1;42380:9;42376:17;42369:47;42433:131;42559:4;42433:131;:::i;:::-;42425:139;;42323:248;;;:::o;42577:419::-;42743:4;42781:2;42770:9;42766:18;42758:26;;42830:9;42824:4;42820:20;42816:1;42805:9;42801:17;42794:47;42858:131;42984:4;42858:131;:::i;:::-;42850:139;;42748:248;;;:::o;43002:419::-;43168:4;43206:2;43195:9;43191:18;43183:26;;43255:9;43249:4;43245:20;43241:1;43230:9;43226:17;43219:47;43283:131;43409:4;43283:131;:::i;:::-;43275:139;;43173:248;;;:::o;43427:419::-;43593:4;43631:2;43620:9;43616:18;43608:26;;43680:9;43674:4;43670:20;43666:1;43655:9;43651:17;43644:47;43708:131;43834:4;43708:131;:::i;:::-;43700:139;;43598:248;;;:::o;43852:419::-;44018:4;44056:2;44045:9;44041:18;44033:26;;44105:9;44099:4;44095:20;44091:1;44080:9;44076:17;44069:47;44133:131;44259:4;44133:131;:::i;:::-;44125:139;;44023:248;;;:::o;44277:419::-;44443:4;44481:2;44470:9;44466:18;44458:26;;44530:9;44524:4;44520:20;44516:1;44505:9;44501:17;44494:47;44558:131;44684:4;44558:131;:::i;:::-;44550:139;;44448:248;;;:::o;44702:419::-;44868:4;44906:2;44895:9;44891:18;44883:26;;44955:9;44949:4;44945:20;44941:1;44930:9;44926:17;44919:47;44983:131;45109:4;44983:131;:::i;:::-;44975:139;;44873:248;;;:::o;45127:419::-;45293:4;45331:2;45320:9;45316:18;45308:26;;45380:9;45374:4;45370:20;45366:1;45355:9;45351:17;45344:47;45408:131;45534:4;45408:131;:::i;:::-;45400:139;;45298:248;;;:::o;45552:419::-;45718:4;45756:2;45745:9;45741:18;45733:26;;45805:9;45799:4;45795:20;45791:1;45780:9;45776:17;45769:47;45833:131;45959:4;45833:131;:::i;:::-;45825:139;;45723:248;;;:::o;45977:222::-;46070:4;46108:2;46097:9;46093:18;46085:26;;46121:71;46189:1;46178:9;46174:17;46165:6;46121:71;:::i;:::-;46075:124;;;;:::o;46205:332::-;46326:4;46364:2;46353:9;46349:18;46341:26;;46377:71;46445:1;46434:9;46430:17;46421:6;46377:71;:::i;:::-;46458:72;46526:2;46515:9;46511:18;46502:6;46458:72;:::i;:::-;46331:206;;;;;:::o;46543:539::-;46636:4;46642:6;46698:11;46685:25;46798:1;46792:4;46788:12;46777:8;46761:14;46757:29;46753:48;46733:18;46729:73;46719:2;;46816:1;46813;46806:12;46719:2;46851:18;46841:8;46837:33;46829:41;;46903:4;46890:18;46880:28;;46931:18;46923:6;46920:30;46917:2;;;46963:1;46960;46953:12;46917:2;46994;46988:4;46984:13;46976:21;;47051:4;47043:6;47039:17;47023:14;47019:38;47013:4;47009:49;47006:2;;;47071:1;47068;47061:12;47006:2;46649:433;;;;;;:::o;47088:129::-;47122:6;47149:20;;:::i;:::-;47139:30;;47178:33;47206:4;47198:6;47178:33;:::i;:::-;47129:88;;;:::o;47223:75::-;47256:6;47289:2;47283:9;47273:19;;47263:35;:::o;47304:311::-;47381:4;47471:18;47463:6;47460:30;47457:2;;;47493:18;;:::i;:::-;47457:2;47543:4;47535:6;47531:17;47523:25;;47603:4;47597;47593:15;47585:23;;47386:229;;;:::o;47621:311::-;47698:4;47788:18;47780:6;47777:30;47774:2;;;47810:18;;:::i;:::-;47774:2;47860:4;47852:6;47848:17;47840:25;;47920:4;47914;47910:15;47902:23;;47703:229;;;:::o;47938:307::-;47999:4;48089:18;48081:6;48078:30;48075:2;;;48111:18;;:::i;:::-;48075:2;48149:29;48171:6;48149:29;:::i;:::-;48141:37;;48233:4;48227;48223:15;48215:23;;48004:241;;;:::o;48251:308::-;48313:4;48403:18;48395:6;48392:30;48389:2;;;48425:18;;:::i;:::-;48389:2;48463:29;48485:6;48463:29;:::i;:::-;48455:37;;48547:4;48541;48537:15;48529:23;;48318:241;;;:::o;48565:132::-;48632:4;48655:3;48647:11;;48685:4;48680:3;48676:14;48668:22;;48637:60;;;:::o;48703:141::-;48752:4;48775:3;48767:11;;48798:3;48795:1;48788:14;48832:4;48829:1;48819:18;48811:26;;48757:87;;;:::o;48850:114::-;48917:6;48951:5;48945:12;48935:22;;48924:40;;;:::o;48970:98::-;49021:6;49055:5;49049:12;49039:22;;49028:40;;;:::o;49074:99::-;49126:6;49160:5;49154:12;49144:22;;49133:40;;;:::o;49179:113::-;49249:4;49281;49276:3;49272:14;49264:22;;49254:38;;;:::o;49298:184::-;49397:11;49431:6;49426:3;49419:19;49471:4;49466:3;49462:14;49447:29;;49409:73;;;;:::o;49488:168::-;49571:11;49605:6;49600:3;49593:19;49645:4;49640:3;49636:14;49621:29;;49583:73;;;;:::o;49662:169::-;49746:11;49780:6;49775:3;49768:19;49820:4;49815:3;49811:14;49796:29;;49758:73;;;;:::o;49837:148::-;49939:11;49976:3;49961:18;;49951:34;;;;:::o;49991:305::-;50031:3;50050:20;50068:1;50050:20;:::i;:::-;50045:25;;50084:20;50102:1;50084:20;:::i;:::-;50079:25;;50238:1;50170:66;50166:74;50163:1;50160:81;50157:2;;;50244:18;;:::i;:::-;50157:2;50288:1;50285;50281:9;50274:16;;50035:261;;;;:::o;50302:185::-;50342:1;50359:20;50377:1;50359:20;:::i;:::-;50354:25;;50393:20;50411:1;50393:20;:::i;:::-;50388:25;;50432:1;50422:2;;50437:18;;:::i;:::-;50422:2;50479:1;50476;50472:9;50467:14;;50344:143;;;;:::o;50493:191::-;50533:4;50553:20;50571:1;50553:20;:::i;:::-;50548:25;;50587:20;50605:1;50587:20;:::i;:::-;50582:25;;50626:1;50623;50620:8;50617:2;;;50631:18;;:::i;:::-;50617:2;50676:1;50673;50669:9;50661:17;;50538:146;;;;:::o;50690:96::-;50727:7;50756:24;50774:5;50756:24;:::i;:::-;50745:35;;50735:51;;;:::o;50792:104::-;50837:7;50866:24;50884:5;50866:24;:::i;:::-;50855:35;;50845:51;;;:::o;50902:90::-;50936:7;50979:5;50972:13;50965:21;50954:32;;50944:48;;;:::o;50998:77::-;51035:7;51064:5;51053:16;;51043:32;;;:::o;51081:149::-;51117:7;51157:66;51150:5;51146:78;51135:89;;51125:105;;;:::o;51236:126::-;51273:7;51313:42;51306:5;51302:54;51291:65;;51281:81;;;:::o;51368:77::-;51405:7;51434:5;51423:16;;51413:32;;;:::o;51451:86::-;51486:7;51526:4;51519:5;51515:16;51504:27;;51494:43;;;:::o;51543:154::-;51627:6;51622:3;51617;51604:30;51689:1;51680:6;51675:3;51671:16;51664:27;51594:103;;;:::o;51703:307::-;51771:1;51781:113;51795:6;51792:1;51789:13;51781:113;;;51880:1;51875:3;51871:11;51865:18;51861:1;51856:3;51852:11;51845:39;51817:2;51814:1;51810:10;51805:15;;51781:113;;;51912:6;51909:1;51906:13;51903:2;;;51992:1;51983:6;51978:3;51974:16;51967:27;51903:2;51752:258;;;;:::o;52016:320::-;52060:6;52097:1;52091:4;52087:12;52077:22;;52144:1;52138:4;52134:12;52165:18;52155:2;;52221:4;52213:6;52209:17;52199:27;;52155:2;52283;52275:6;52272:14;52252:18;52249:38;52246:2;;;52302:18;;:::i;:::-;52246:2;52067:269;;;;:::o;52342:281::-;52425:27;52447:4;52425:27;:::i;:::-;52417:6;52413:40;52555:6;52543:10;52540:22;52519:18;52507:10;52504:34;52501:62;52498:2;;;52566:18;;:::i;:::-;52498:2;52606:10;52602:2;52595:22;52385:238;;;:::o;52629:233::-;52668:3;52691:24;52709:5;52691:24;:::i;:::-;52682:33;;52737:66;52730:5;52727:77;52724:2;;;52807:18;;:::i;:::-;52724:2;52854:1;52847:5;52843:13;52836:20;;52672:190;;;:::o;52868:79::-;52907:7;52936:5;52925:16;;52915:32;;;:::o;52953:176::-;52985:1;53002:20;53020:1;53002:20;:::i;:::-;52997:25;;53036:20;53054:1;53036:20;:::i;:::-;53031:25;;53075:1;53065:2;;53080:18;;:::i;:::-;53065:2;53121:1;53118;53114:9;53109:14;;52987:142;;;;:::o;53135:180::-;53183:77;53180:1;53173:88;53280:4;53277:1;53270:15;53304:4;53301:1;53294:15;53321:180;53369:77;53366:1;53359:88;53466:4;53463:1;53456:15;53490:4;53487:1;53480:15;53507:180;53555:77;53552:1;53545:88;53652:4;53649:1;53642:15;53676:4;53673:1;53666:15;53693:180;53741:77;53738:1;53731:88;53838:4;53835:1;53828:15;53862:4;53859:1;53852:15;53879:183;53914:3;53952:1;53934:16;53931:23;53928:2;;;53990:1;53987;53984;53969:23;54012:34;54043:1;54037:8;54012:34;:::i;:::-;54005:41;;53928:2;53918:144;:::o;54068:102::-;54109:6;54160:2;54156:7;54151:2;54144:5;54140:14;54136:28;54126:38;;54116:54;;;:::o;54176:106::-;54220:8;54269:5;54264:3;54260:15;54239:36;;54229:53;;;:::o;54288:174::-;54428:26;54424:1;54416:6;54412:14;54405:50;54394:68;:::o;54468:239::-;54608:34;54604:1;54596:6;54592:14;54585:58;54677:22;54672:2;54664:6;54660:15;54653:47;54574:133;:::o;54713:227::-;54853:34;54849:1;54841:6;54837:14;54830:58;54922:10;54917:2;54909:6;54905:15;54898:35;54819:121;:::o;54946:181::-;55086:33;55082:1;55074:6;55070:14;55063:57;55052:75;:::o;55133:230::-;55273:34;55269:1;55261:6;55257:14;55250:58;55342:13;55337:2;55329:6;55325:15;55318:38;55239:124;:::o;55369:165::-;55509:17;55505:1;55497:6;55493:14;55486:41;55475:59;:::o;55540:225::-;55680:34;55676:1;55668:6;55664:14;55657:58;55749:8;55744:2;55736:6;55732:15;55725:33;55646:119;:::o;55771:223::-;55911:34;55907:1;55899:6;55895:14;55888:58;55980:6;55975:2;55967:6;55963:15;55956:31;55877:117;:::o;56000:228::-;56140:34;56136:1;56128:6;56124:14;56117:58;56209:11;56204:2;56196:6;56192:15;56185:36;56106:122;:::o;56234:236::-;56374:34;56370:1;56362:6;56358:14;56351:58;56443:19;56438:2;56430:6;56426:15;56419:44;56340:130;:::o;56476:178::-;56616:30;56612:1;56604:6;56600:14;56593:54;56582:72;:::o;56660:161::-;56800:13;56796:1;56788:6;56784:14;56777:37;56766:55;:::o;56827:221::-;56967:34;56963:1;56955:6;56951:14;56944:58;57036:4;57031:2;57023:6;57019:15;57012:29;56933:115;:::o;57054:224::-;57194:34;57190:1;57182:6;57178:14;57171:58;57263:7;57258:2;57250:6;57246:15;57239:32;57160:118;:::o;57284:237::-;57424:34;57420:1;57412:6;57408:14;57401:58;57493:20;57488:2;57480:6;57476:15;57469:45;57390:131;:::o;57527:169::-;57667:21;57663:1;57655:6;57651:14;57644:45;57633:63;:::o;57702:221::-;57842:34;57838:1;57830:6;57826:14;57819:58;57911:4;57906:2;57898:6;57894:15;57887:29;57808:115;:::o;57929:222::-;58069:34;58065:1;58057:6;58053:14;58046:58;58138:5;58133:2;58125:6;58121:15;58114:30;58035:116;:::o;58157:229::-;58297:34;58293:1;58285:6;58281:14;58274:58;58366:12;58361:2;58353:6;58349:15;58342:37;58263:123;:::o;58392:182::-;58532:34;58528:1;58520:6;58516:14;58509:58;58498:76;:::o;58580:173::-;58720:25;58716:1;58708:6;58704:14;58697:49;58686:67;:::o;58759:163::-;58899:15;58895:1;58887:6;58883:14;58876:39;58865:57;:::o;58928:228::-;59068:34;59064:1;59056:6;59052:14;59045:58;59137:11;59132:2;59124:6;59120:15;59113:36;59034:122;:::o;59162:228::-;59302:34;59298:1;59290:6;59286:14;59279:58;59371:11;59366:2;59358:6;59354:15;59347:36;59268:122;:::o;59396:227::-;59536:34;59532:1;59524:6;59520:14;59513:58;59605:10;59600:2;59592:6;59588:15;59581:35;59502:121;:::o;59629:220::-;59769:34;59765:1;59757:6;59753:14;59746:58;59838:3;59833:2;59825:6;59821:15;59814:28;59735:114;:::o;59855:181::-;59995:33;59991:1;59983:6;59979:14;59972:57;59961:75;:::o;60042:711::-;60081:3;60119:4;60101:16;60098:26;60095:2;;;60127:5;;60095:2;60156:20;;:::i;:::-;60231:1;60213:16;60209:24;60206:1;60200:4;60185:49;60264:4;60258:11;60363:16;60356:4;60348:6;60344:17;60341:39;60308:18;60300:6;60297:30;60281:113;60278:2;;;60409:5;;;;60278:2;60455:6;60449:4;60445:17;60491:3;60485:10;60518:18;60510:6;60507:30;60504:2;;;60540:5;;;;;;60504:2;60588:6;60581:4;60576:3;60572:14;60568:27;60647:1;60629:16;60625:24;60619:4;60615:35;60610:3;60607:44;60604:2;;;60654:5;;;;;;;60604:2;60671:57;60719:6;60713:4;60709:17;60701:6;60697:30;60691:4;60671:57;:::i;:::-;60744:3;60737:10;;60085:668;;;;;;;:::o;60759:122::-;60832:24;60850:5;60832:24;:::i;:::-;60825:5;60822:35;60812:2;;60871:1;60868;60861:12;60812:2;60802:79;:::o;60887:138::-;60968:32;60994:5;60968:32;:::i;:::-;60961:5;60958:43;60948:2;;61015:1;61012;61005:12;60948:2;60938:87;:::o;61031:116::-;61101:21;61116:5;61101:21;:::i;:::-;61094:5;61091:32;61081:2;;61137:1;61134;61127:12;61081:2;61071:76;:::o;61153:120::-;61225:23;61242:5;61225:23;:::i;:::-;61218:5;61215:34;61205:2;;61263:1;61260;61253:12;61205:2;61195:78;:::o;61279:122::-;61352:24;61370:5;61352:24;:::i;:::-;61345:5;61342:35;61332:2;;61391:1;61388;61381:12;61332:2;61322:79;:::o

Swarm Source

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