ETH Price: $3,383.99 (-1.56%)
Gas: 2 Gwei

Token

 

Overview

Max Total Supply

178

Holders

149

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
bucketfiller.eth
0x9425e212647518853a92ae7d2c1ab09d343e70b6
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:
TheVoiceOfTheSyndicate

Compiler Version
v0.8.7+commit.e28d00a7

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-15
*/

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


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// 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/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/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/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts v4.4.1 (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();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), 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);

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

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

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

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

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

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

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

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

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

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

    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: @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: contracts/VoiceOfTheSyndicate.sol

//SPDX-License-Identifier: Unlicense

pragma solidity ^0.8.7;






contract TheVoiceOfTheSyndicate is ERC1155, Ownable, ReentrancyGuard {
  using Address for address;
  using SafeMath for uint256;
  using ECDSA for bytes32;

  uint256 public constant MAX_SUPPLY = 178;
  uint256 public constant RESERVED = 88;
  uint256 public constant TOKEN_ID = 0;

  mapping(bytes => bool) public signatureUsed;
  uint256 public totalSupply;
  bool public saleActive;
  address public signer = 0xb6e1c43C748DF0F8F983bF9da9FffFd66018750F;

  constructor(string memory _uri) ERC1155(_uri) {
    _mint(msg.sender, TOKEN_ID, RESERVED, "");
    totalSupply = totalSupply.add(RESERVED);
  }

  function setSigner(address _signer) public onlyOwner {
    signer = _signer;
  }

  function flipSaleActive() public onlyOwner {
    saleActive = !saleActive;
  }

  function setMetadata(string memory _uri) public onlyOwner {
    _setURI(_uri);
  }

  function mint(bytes memory signature) public nonReentrant validMinter(signature) {
    require(saleActive, "Sale is not active");
    require(totalSupply.add(1) <= MAX_SUPPLY, "Exceeds maximum number of tokens");

    signatureUsed[signature] = true;
    _mint(_msgSender(), TOKEN_ID, 1, "");
    totalSupply = totalSupply.add(1);
  }

  modifier validMinter(bytes memory signature) {
    require(!signatureUsed[signature], "Signature already used");
    address _signer = ECDSA.recover(
      ECDSA.toEthSignedMessageHash(keccak256(abi.encodePacked(_msgSender()))),
      signature
    );
    require(signer == _signer, "Invalid signature");
    _;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","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":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"flipSaleActive","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"signatureUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

608060405273b6e1c43c748df0f8f983bf9da9ffffd66018750f600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b5060405162004e9b38038062004e9b83398181016040528101906200008c91906200080a565b806200009e816200011660201b60201c565b50620000bf620000b36200013260201b60201c565b6200013a60201b60201c565b6001600481905550620000ec3360006058604051806020016040528060008152506200020060201b60201c565b620001096058600654620003c560201b6200102c1790919060201c565b6006819055505062000f4b565b80600290805190602001906200012e92919062000693565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141562000273576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026a9062000a40565b60405180910390fd5b6000620002856200013260201b60201c565b9050620002be81600087620002a088620003dd60201b60201c565b620002b188620003dd60201b60201c565b876200045e60201b60201c565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200031f919062000b26565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6287876040516200039f92919062000a62565b60405180910390a4620003be816000878787876200046660201b60201c565b5050505050565b60008183620003d5919062000b26565b905092915050565b60606000600167ffffffffffffffff811115620003ff57620003fe62000d1c565b5b6040519080825280602002602001820160405280156200042e5781602001602082028036833780820191505090505b509050828160008151811062000449576200044862000ced565b5b60200260200101818152505080915050919050565b505050505050565b620004928473ffffffffffffffffffffffffffffffffffffffff166200067060201b620010421760201c565b1562000668578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401620004db95949392919062000974565b602060405180830381600087803b158015620004f657600080fd5b505af19250505080156200052a57506040513d601f19601f82011682018060405250810190620005279190620007d8565b60015b620005dc576200053962000d4b565b806308c379a014156200059d57506200055162000e8f565b806200055e57506200059f565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005949190620009d8565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005d390620009fc565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161462000666576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200065d9062000a1e565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054620006a19062000c23565b90600052602060002090601f016020900481019282620006c5576000855562000711565b82601f10620006e057805160ff191683800117855562000711565b8280016001018555821562000711579182015b8281111562000710578251825591602001919060010190620006f3565b5b50905062000720919062000724565b5090565b5b808211156200073f57600081600090555060010162000725565b5090565b60006200075a620007548462000ab8565b62000a8f565b90508281526020810184848401111562000779576200077862000d75565b5b6200078684828562000bed565b509392505050565b6000815190506200079f8162000f31565b92915050565b600082601f830112620007bd57620007bc62000d70565b5b8151620007cf84826020860162000743565b91505092915050565b600060208284031215620007f157620007f062000d7f565b5b600062000801848285016200078e565b91505092915050565b60006020828403121562000823576200082262000d7f565b5b600082015167ffffffffffffffff81111562000844576200084362000d7a565b5b6200085284828501620007a5565b91505092915050565b620008668162000b83565b82525050565b6000620008798262000aee565b62000885818562000b04565b93506200089781856020860162000bed565b620008a28162000d84565b840191505092915050565b6000620008ba8262000af9565b620008c6818562000b15565b9350620008d881856020860162000bed565b620008e38162000d84565b840191505092915050565b6000620008fd60348362000b15565b91506200090a8262000da2565b604082019050919050565b60006200092460288362000b15565b9150620009318262000df1565b604082019050919050565b60006200094b60218362000b15565b9150620009588262000e40565b604082019050919050565b6200096e8162000be3565b82525050565b600060a0820190506200098b60008301886200085b565b6200099a60208301876200085b565b620009a9604083018662000963565b620009b8606083018562000963565b8181036080830152620009cc81846200086c565b90509695505050505050565b60006020820190508181036000830152620009f48184620008ad565b905092915050565b6000602082019050818103600083015262000a1781620008ee565b9050919050565b6000602082019050818103600083015262000a398162000915565b9050919050565b6000602082019050818103600083015262000a5b816200093c565b9050919050565b600060408201905062000a79600083018562000963565b62000a88602083018462000963565b9392505050565b600062000a9b62000aae565b905062000aa9828262000c59565b919050565b6000604051905090565b600067ffffffffffffffff82111562000ad65762000ad562000d1c565b5b62000ae18262000d84565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000b338262000be3565b915062000b408362000be3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000b785762000b7762000c8f565b5b828201905092915050565b600062000b908262000bc3565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000c0d57808201518184015260208101905062000bf0565b8381111562000c1d576000848401525b50505050565b6000600282049050600182168062000c3c57607f821691505b6020821081141562000c535762000c5262000cbe565b5b50919050565b62000c648262000d84565b810181811067ffffffffffffffff8211171562000c865762000c8562000d1c565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111562000d6d5760046000803e62000d6a60005162000d95565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d101562000ea15762000f2e565b62000eab62000aae565b60043d036004823e80513d602482011167ffffffffffffffff8211171562000ed557505062000f2e565b808201805167ffffffffffffffff81111562000ef5575050505062000f2e565b80602083010160043d03850181111562000f1457505050505062000f2e565b62000f258260200185018662000c59565b82955050505050505b90565b62000f3c8162000b97565b811462000f4857600080fd5b50565b613f408062000f5b6000396000f3fe608060405234801561001057600080fd5b50600436106101415760003560e01c80637ba0e2e7116100b8578063aa592f251161007c578063aa592f2514610350578063bb10c8291461036e578063de8b51e11461039e578063e985e9c5146103a8578063f242432a146103d8578063f2fde38b146103f457610141565b80637ba0e2e7146102c057806389a89002146102dc5780638da5cb5b146102fa578063a22cb46514610318578063a49a1e7d1461033457610141565b80632eb2c2d61161010a5780632eb2c2d61461021257806332cb6b0c1461022e5780634e1273f41461024c57806368428a1b1461027c5780636c19e7831461029a578063715018a6146102b657610141565b8062fdd58e1461014657806301ffc9a7146101765780630e89341c146101a657806318160ddd146101d6578063238ac933146101f4575b600080fd5b610160600480360381019061015b91906127f6565b610410565b60405161016d919061335d565b60405180910390f35b610190600480360381019061018b91906128ae565b6104d9565b60405161019d919061301b565b60405180910390f35b6101c060048036038101906101bb919061299a565b6105bb565b6040516101cd919061307b565b60405180910390f35b6101de61064f565b6040516101eb919061335d565b60405180910390f35b6101fc610655565b6040516102099190612ee5565b60405180910390f35b61022c60048036038101906102279190612650565b61067b565b005b61023661071c565b604051610243919061335d565b60405180910390f35b61026660048036038101906102619190612836565b610721565b6040516102739190612fc2565b60405180910390f35b61028461083a565b604051610291919061301b565b60405180910390f35b6102b460048036038101906102af91906125e3565b61084d565b005b6102be61090d565b005b6102da60048036038101906102d59190612908565b610995565b005b6102e4610c4f565b6040516102f1919061335d565b60405180910390f35b610302610c54565b60405161030f9190612ee5565b60405180910390f35b610332600480360381019061032d91906127b6565b610c7e565b005b61034e60048036038101906103499190612951565b610c94565b005b610358610d1c565b604051610365919061335d565b60405180910390f35b61038860048036038101906103839190612908565b610d21565b604051610395919061301b565b60405180910390f35b6103a6610d57565b005b6103c260048036038101906103bd9190612610565b610dff565b6040516103cf919061301b565b60405180910390f35b6103f260048036038101906103ed919061271f565b610e93565b005b61040e600480360381019061040991906125e3565b610f34565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610481576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104789061311d565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105a457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105b457506105b382611065565b5b9050919050565b6060600280546105ca9061362a565b80601f01602080910402602001604051908101604052809291908181526020018280546105f69061362a565b80156106435780601f1061061857610100808354040283529160200191610643565b820191906000526020600020905b81548152906001019060200180831161062657829003601f168201915b50505050509050919050565b60065481565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6106836110cf565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806106c957506106c8856106c36110cf565b610dff565b5b610708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ff9061323d565b60405180910390fd5b61071585858585856110d7565b5050505050565b60b281565b60608151835114610767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075e906132dd565b60405180910390fd5b6000835167ffffffffffffffff811115610784576107836137c0565b5b6040519080825280602002602001820160405280156107b25781602001602082028036833780820191505090505b50905060005b845181101561082f576107ff8582815181106107d7576107d6613791565b5b60200260200101518583815181106107f2576107f1613791565b5b6020026020010151610410565b82828151811061081257610811613791565b5b602002602001018181525050806108289061368d565b90506107b8565b508091505092915050565b600760009054906101000a900460ff1681565b6108556110cf565b73ffffffffffffffffffffffffffffffffffffffff16610873610c54565b73ffffffffffffffffffffffffffffffffffffffff16146108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c09061329d565b60405180910390fd5b80600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109156110cf565b73ffffffffffffffffffffffffffffffffffffffff16610933610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610989576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109809061329d565b60405180910390fd5b61099360006113eb565b565b600260045414156109db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d29061333d565b60405180910390fd5b6002600481905550806005816040516109f49190612ea8565b908152602001604051809103902060009054906101000a900460ff1615610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a479061317d565b60405180910390fd5b6000610a91610a8b610a606110cf565b604051602001610a709190612e8d565b604051602081830303815290604052805190602001206114b1565b836114e1565b90508073ffffffffffffffffffffffffffffffffffffffff16600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a906131dd565b60405180910390fd5b600760009054906101000a900460ff16610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b69906131bd565b60405180910390fd5b60b2610b8a600160065461102c90919063ffffffff16565b1115610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc29061315d565b60405180910390fd5b6001600584604051610bdd9190612ea8565b908152602001604051809103902060006101000a81548160ff021916908315150217905550610c26610c0d6110cf565b6000600160405180602001604052806000815250611508565b610c3c600160065461102c90919063ffffffff16565b6006819055505050600160048190555050565b600081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c90610c896110cf565b838361169e565b5050565b610c9c6110cf565b73ffffffffffffffffffffffffffffffffffffffff16610cba610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d079061329d565b60405180910390fd5b610d198161180b565b50565b605881565b6005818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b610d5f6110cf565b73ffffffffffffffffffffffffffffffffffffffff16610d7d610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca9061329d565b60405180910390fd5b600760009054906101000a900460ff1615600760006101000a81548160ff021916908315150217905550565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e9b6110cf565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610ee15750610ee085610edb6110cf565b610dff565b5b610f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f179061319d565b60405180910390fd5b610f2d8585858585611825565b5050505050565b610f3c6110cf565b73ffffffffffffffffffffffffffffffffffffffff16610f5a610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa79061329d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611020576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110179061313d565b60405180910390fd5b611029816113eb565b50565b6000818361103a9190613507565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b815183511461111b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611112906132fd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561118b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111829061321d565b60405180910390fd5b60006111956110cf565b90506111a5818787878787611aa7565b60005b84518110156113565760008582815181106111c6576111c5613791565b5b6020026020010151905060008583815181106111e5576111e4613791565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d9061327d565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461133b9190613507565b925050819055505050508061134f9061368d565b90506111a8565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516113cd929190612fe4565b60405180910390a46113e3818787878787611aaf565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000816040516020016114c49190612ebf565b604051602081830303815290604052805190602001209050919050565b60008060006114f08585611c96565b915091506114fd81611d19565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156f9061331d565b60405180910390fd5b60006115826110cf565b90506115a38160008761159488611eee565b61159d88611eee565b87611aa7565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116029190613507565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611680929190613378565b60405180910390a461169781600087878787611f68565b5050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561170d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611704906132bd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117fe919061301b565b60405180910390a3505050565b80600290805190602001906118219291906122bb565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188c9061321d565b60405180910390fd5b600061189f6110cf565b90506118bf8187876118b088611eee565b6118b988611eee565b87611aa7565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d9061327d565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a0b9190613507565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051611a88929190613378565b60405180910390a4611a9e828888888888611f68565b50505050505050565b505050505050565b611ace8473ffffffffffffffffffffffffffffffffffffffff16611042565b15611c8e578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401611b14959493929190612f00565b602060405180830381600087803b158015611b2e57600080fd5b505af1925050508015611b5f57506040513d601f19601f82011682018060405250810190611b5c91906128db565b60015b611c0557611b6b6137ef565b806308c379a01415611bc85750611b80613e18565b80611b8b5750611bca565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf919061307b565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfc906130bd565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c83906130dd565b60405180910390fd5b505b505050505050565b600080604183511415611cd85760008060006020860151925060408601519150606086015160001a9050611ccc8782858561214f565b94509450505050611d12565b604083511415611d09576000806020850151915060408501519050611cfe86838361225c565b935093505050611d12565b60006002915091505b9250929050565b60006004811115611d2d57611d2c613733565b5b816004811115611d4057611d3f613733565b5b1415611d4b57611eeb565b60016004811115611d5f57611d5e613733565b5b816004811115611d7257611d71613733565b5b1415611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa9061309d565b60405180910390fd5b60026004811115611dc757611dc6613733565b5b816004811115611dda57611dd9613733565b5b1415611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e12906130fd565b60405180910390fd5b60036004811115611e2f57611e2e613733565b5b816004811115611e4257611e41613733565b5b1415611e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7a906131fd565b60405180910390fd5b600480811115611e9657611e95613733565b5b816004811115611ea957611ea8613733565b5b1415611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee19061325d565b60405180910390fd5b5b50565b60606000600167ffffffffffffffff811115611f0d57611f0c6137c0565b5b604051908082528060200260200182016040528015611f3b5781602001602082028036833780820191505090505b5090508281600081518110611f5357611f52613791565b5b60200260200101818152505080915050919050565b611f878473ffffffffffffffffffffffffffffffffffffffff16611042565b15612147578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611fcd959493929190612f68565b602060405180830381600087803b158015611fe757600080fd5b505af192505050801561201857506040513d601f19601f8201168201806040525081019061201591906128db565b60015b6120be576120246137ef565b806308c379a014156120815750612039613e18565b806120445750612083565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612078919061307b565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b5906130bd565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c906130dd565b60405180910390fd5b505b505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561218a576000600391509150612253565b601b8560ff16141580156121a25750601c8560ff1614155b156121b4576000600491509150612253565b6000600187878787604051600081526020016040526040516121d99493929190613036565b6020604051602081039080840390855afa1580156121fb573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561224a57600060019250925050612253565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61229f9190613507565b90506122ad8782888561214f565b935093505050935093915050565b8280546122c79061362a565b90600052602060002090601f0160209004810192826122e95760008555612330565b82601f1061230257805160ff1916838001178555612330565b82800160010185558215612330579182015b8281111561232f578251825591602001919060010190612314565b5b50905061233d9190612341565b5090565b5b8082111561235a576000816000905550600101612342565b5090565b600061237161236c846133c6565b6133a1565b9050808382526020820190508285602086028201111561239457612393613816565b5b60005b858110156123c457816123aa88826124c2565b845260208401935060208301925050600181019050612397565b5050509392505050565b60006123e16123dc846133f2565b6133a1565b9050808382526020820190508285602086028201111561240457612403613816565b5b60005b85811015612434578161241a88826125ce565b845260208401935060208301925050600181019050612407565b5050509392505050565b600061245161244c8461341e565b6133a1565b90508281526020810184848401111561246d5761246c61381b565b5b6124788482856135e8565b509392505050565b600061249361248e8461344f565b6133a1565b9050828152602081018484840111156124af576124ae61381b565b5b6124ba8482856135e8565b509392505050565b6000813590506124d181613eae565b92915050565b600082601f8301126124ec576124eb613811565b5b81356124fc84826020860161235e565b91505092915050565b600082601f83011261251a57612519613811565b5b813561252a8482602086016123ce565b91505092915050565b60008135905061254281613ec5565b92915050565b60008135905061255781613edc565b92915050565b60008151905061256c81613edc565b92915050565b600082601f83011261258757612586613811565b5b813561259784826020860161243e565b91505092915050565b600082601f8301126125b5576125b4613811565b5b81356125c5848260208601612480565b91505092915050565b6000813590506125dd81613ef3565b92915050565b6000602082840312156125f9576125f8613825565b5b6000612607848285016124c2565b91505092915050565b6000806040838503121561262757612626613825565b5b6000612635858286016124c2565b9250506020612646858286016124c2565b9150509250929050565b600080600080600060a0868803121561266c5761266b613825565b5b600061267a888289016124c2565b955050602061268b888289016124c2565b945050604086013567ffffffffffffffff8111156126ac576126ab613820565b5b6126b888828901612505565b935050606086013567ffffffffffffffff8111156126d9576126d8613820565b5b6126e588828901612505565b925050608086013567ffffffffffffffff81111561270657612705613820565b5b61271288828901612572565b9150509295509295909350565b600080600080600060a0868803121561273b5761273a613825565b5b6000612749888289016124c2565b955050602061275a888289016124c2565b945050604061276b888289016125ce565b935050606061277c888289016125ce565b925050608086013567ffffffffffffffff81111561279d5761279c613820565b5b6127a988828901612572565b9150509295509295909350565b600080604083850312156127cd576127cc613825565b5b60006127db858286016124c2565b92505060206127ec85828601612533565b9150509250929050565b6000806040838503121561280d5761280c613825565b5b600061281b858286016124c2565b925050602061282c858286016125ce565b9150509250929050565b6000806040838503121561284d5761284c613825565b5b600083013567ffffffffffffffff81111561286b5761286a613820565b5b612877858286016124d7565b925050602083013567ffffffffffffffff81111561289857612897613820565b5b6128a485828601612505565b9150509250929050565b6000602082840312156128c4576128c3613825565b5b60006128d284828501612548565b91505092915050565b6000602082840312156128f1576128f0613825565b5b60006128ff8482850161255d565b91505092915050565b60006020828403121561291e5761291d613825565b5b600082013567ffffffffffffffff81111561293c5761293b613820565b5b61294884828501612572565b91505092915050565b60006020828403121561296757612966613825565b5b600082013567ffffffffffffffff81111561298557612984613820565b5b612991848285016125a0565b91505092915050565b6000602082840312156129b0576129af613825565b5b60006129be848285016125ce565b91505092915050565b60006129d38383612e60565b60208301905092915050565b6129e88161355d565b82525050565b6129ff6129fa8261355d565b6136d6565b82525050565b6000612a1082613490565b612a1a81856134be565b9350612a2583613480565b8060005b83811015612a56578151612a3d88826129c7565b9750612a48836134b1565b925050600181019050612a29565b5085935050505092915050565b612a6c8161356f565b82525050565b612a7b8161357b565b82525050565b612a92612a8d8261357b565b6136e8565b82525050565b6000612aa38261349b565b612aad81856134cf565b9350612abd8185602086016135f7565b612ac68161382a565b840191505092915050565b6000612adc8261349b565b612ae681856134e0565b9350612af68185602086016135f7565b80840191505092915050565b6000612b0d826134a6565b612b1781856134eb565b9350612b278185602086016135f7565b612b308161382a565b840191505092915050565b6000612b486018836134eb565b9150612b5382613855565b602082019050919050565b6000612b6b6034836134eb565b9150612b768261387e565b604082019050919050565b6000612b8e6028836134eb565b9150612b99826138cd565b604082019050919050565b6000612bb1601f836134eb565b9150612bbc8261391c565b602082019050919050565b6000612bd4601c836134fc565b9150612bdf82613945565b601c82019050919050565b6000612bf7602b836134eb565b9150612c028261396e565b604082019050919050565b6000612c1a6026836134eb565b9150612c25826139bd565b604082019050919050565b6000612c3d6020836134eb565b9150612c4882613a0c565b602082019050919050565b6000612c606016836134eb565b9150612c6b82613a35565b602082019050919050565b6000612c836029836134eb565b9150612c8e82613a5e565b604082019050919050565b6000612ca66012836134eb565b9150612cb182613aad565b602082019050919050565b6000612cc96011836134eb565b9150612cd482613ad6565b602082019050919050565b6000612cec6022836134eb565b9150612cf782613aff565b604082019050919050565b6000612d0f6025836134eb565b9150612d1a82613b4e565b604082019050919050565b6000612d326032836134eb565b9150612d3d82613b9d565b604082019050919050565b6000612d556022836134eb565b9150612d6082613bec565b604082019050919050565b6000612d78602a836134eb565b9150612d8382613c3b565b604082019050919050565b6000612d9b6020836134eb565b9150612da682613c8a565b602082019050919050565b6000612dbe6029836134eb565b9150612dc982613cb3565b604082019050919050565b6000612de16029836134eb565b9150612dec82613d02565b604082019050919050565b6000612e046028836134eb565b9150612e0f82613d51565b604082019050919050565b6000612e276021836134eb565b9150612e3282613da0565b604082019050919050565b6000612e4a601f836134eb565b9150612e5582613def565b602082019050919050565b612e69816135d1565b82525050565b612e78816135d1565b82525050565b612e87816135db565b82525050565b6000612e9982846129ee565b60148201915081905092915050565b6000612eb48284612ad1565b915081905092915050565b6000612eca82612bc7565b9150612ed68284612a81565b60208201915081905092915050565b6000602082019050612efa60008301846129df565b92915050565b600060a082019050612f1560008301886129df565b612f2260208301876129df565b8181036040830152612f348186612a05565b90508181036060830152612f488185612a05565b90508181036080830152612f5c8184612a98565b90509695505050505050565b600060a082019050612f7d60008301886129df565b612f8a60208301876129df565b612f976040830186612e6f565b612fa46060830185612e6f565b8181036080830152612fb68184612a98565b90509695505050505050565b60006020820190508181036000830152612fdc8184612a05565b905092915050565b60006040820190508181036000830152612ffe8185612a05565b905081810360208301526130128184612a05565b90509392505050565b60006020820190506130306000830184612a63565b92915050565b600060808201905061304b6000830187612a72565b6130586020830186612e7e565b6130656040830185612a72565b6130726060830184612a72565b95945050505050565b600060208201905081810360008301526130958184612b02565b905092915050565b600060208201905081810360008301526130b681612b3b565b9050919050565b600060208201905081810360008301526130d681612b5e565b9050919050565b600060208201905081810360008301526130f681612b81565b9050919050565b6000602082019050818103600083015261311681612ba4565b9050919050565b6000602082019050818103600083015261313681612bea565b9050919050565b6000602082019050818103600083015261315681612c0d565b9050919050565b6000602082019050818103600083015261317681612c30565b9050919050565b6000602082019050818103600083015261319681612c53565b9050919050565b600060208201905081810360008301526131b681612c76565b9050919050565b600060208201905081810360008301526131d681612c99565b9050919050565b600060208201905081810360008301526131f681612cbc565b9050919050565b6000602082019050818103600083015261321681612cdf565b9050919050565b6000602082019050818103600083015261323681612d02565b9050919050565b6000602082019050818103600083015261325681612d25565b9050919050565b6000602082019050818103600083015261327681612d48565b9050919050565b6000602082019050818103600083015261329681612d6b565b9050919050565b600060208201905081810360008301526132b681612d8e565b9050919050565b600060208201905081810360008301526132d681612db1565b9050919050565b600060208201905081810360008301526132f681612dd4565b9050919050565b6000602082019050818103600083015261331681612df7565b9050919050565b6000602082019050818103600083015261333681612e1a565b9050919050565b6000602082019050818103600083015261335681612e3d565b9050919050565b60006020820190506133726000830184612e6f565b92915050565b600060408201905061338d6000830185612e6f565b61339a6020830184612e6f565b9392505050565b60006133ab6133bc565b90506133b7828261365c565b919050565b6000604051905090565b600067ffffffffffffffff8211156133e1576133e06137c0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561340d5761340c6137c0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613439576134386137c0565b5b6134428261382a565b9050602081019050919050565b600067ffffffffffffffff82111561346a576134696137c0565b5b6134738261382a565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613512826135d1565b915061351d836135d1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561355257613551613704565b5b828201905092915050565b6000613568826135b1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156136155780820151818401526020810190506135fa565b83811115613624576000848401525b50505050565b6000600282049050600182168061364257607f821691505b6020821081141561365657613655613762565b5b50919050565b6136658261382a565b810181811067ffffffffffffffff82111715613684576136836137c0565b5b80604052505050565b6000613698826135d1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136cb576136ca613704565b5b600182019050919050565b60006136e1826136f2565b9050919050565b6000819050919050565b60006136fd8261383b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561380e5760046000803e61380b600051613848565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d206e756d626572206f6620746f6b656e73600082015250565b7f5369676e617475726520616c7265616479207573656400000000000000000000600082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600060443d1015613e2857613eab565b613e306133bc565b60043d036004823e80513d602482011167ffffffffffffffff82111715613e58575050613eab565b808201805167ffffffffffffffff811115613e765750505050613eab565b80602083010160043d038501811115613e93575050505050613eab565b613ea28260200185018661365c565b82955050505050505b90565b613eb78161355d565b8114613ec257600080fd5b50565b613ece8161356f565b8114613ed957600080fd5b50565b613ee581613585565b8114613ef057600080fd5b50565b613efc816135d1565b8114613f0757600080fd5b5056fea264697066735822122026b2940a678c7afce0de1edabc5a2d74643b6978d5fa093a54e3c6ca168ddd6864736f6c63430008070033000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000115468657920737065616b206f6620796f75000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101415760003560e01c80637ba0e2e7116100b8578063aa592f251161007c578063aa592f2514610350578063bb10c8291461036e578063de8b51e11461039e578063e985e9c5146103a8578063f242432a146103d8578063f2fde38b146103f457610141565b80637ba0e2e7146102c057806389a89002146102dc5780638da5cb5b146102fa578063a22cb46514610318578063a49a1e7d1461033457610141565b80632eb2c2d61161010a5780632eb2c2d61461021257806332cb6b0c1461022e5780634e1273f41461024c57806368428a1b1461027c5780636c19e7831461029a578063715018a6146102b657610141565b8062fdd58e1461014657806301ffc9a7146101765780630e89341c146101a657806318160ddd146101d6578063238ac933146101f4575b600080fd5b610160600480360381019061015b91906127f6565b610410565b60405161016d919061335d565b60405180910390f35b610190600480360381019061018b91906128ae565b6104d9565b60405161019d919061301b565b60405180910390f35b6101c060048036038101906101bb919061299a565b6105bb565b6040516101cd919061307b565b60405180910390f35b6101de61064f565b6040516101eb919061335d565b60405180910390f35b6101fc610655565b6040516102099190612ee5565b60405180910390f35b61022c60048036038101906102279190612650565b61067b565b005b61023661071c565b604051610243919061335d565b60405180910390f35b61026660048036038101906102619190612836565b610721565b6040516102739190612fc2565b60405180910390f35b61028461083a565b604051610291919061301b565b60405180910390f35b6102b460048036038101906102af91906125e3565b61084d565b005b6102be61090d565b005b6102da60048036038101906102d59190612908565b610995565b005b6102e4610c4f565b6040516102f1919061335d565b60405180910390f35b610302610c54565b60405161030f9190612ee5565b60405180910390f35b610332600480360381019061032d91906127b6565b610c7e565b005b61034e60048036038101906103499190612951565b610c94565b005b610358610d1c565b604051610365919061335d565b60405180910390f35b61038860048036038101906103839190612908565b610d21565b604051610395919061301b565b60405180910390f35b6103a6610d57565b005b6103c260048036038101906103bd9190612610565b610dff565b6040516103cf919061301b565b60405180910390f35b6103f260048036038101906103ed919061271f565b610e93565b005b61040e600480360381019061040991906125e3565b610f34565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610481576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104789061311d565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105a457507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105b457506105b382611065565b5b9050919050565b6060600280546105ca9061362a565b80601f01602080910402602001604051908101604052809291908181526020018280546105f69061362a565b80156106435780601f1061061857610100808354040283529160200191610643565b820191906000526020600020905b81548152906001019060200180831161062657829003601f168201915b50505050509050919050565b60065481565b600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6106836110cf565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806106c957506106c8856106c36110cf565b610dff565b5b610708576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ff9061323d565b60405180910390fd5b61071585858585856110d7565b5050505050565b60b281565b60608151835114610767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075e906132dd565b60405180910390fd5b6000835167ffffffffffffffff811115610784576107836137c0565b5b6040519080825280602002602001820160405280156107b25781602001602082028036833780820191505090505b50905060005b845181101561082f576107ff8582815181106107d7576107d6613791565b5b60200260200101518583815181106107f2576107f1613791565b5b6020026020010151610410565b82828151811061081257610811613791565b5b602002602001018181525050806108289061368d565b90506107b8565b508091505092915050565b600760009054906101000a900460ff1681565b6108556110cf565b73ffffffffffffffffffffffffffffffffffffffff16610873610c54565b73ffffffffffffffffffffffffffffffffffffffff16146108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c09061329d565b60405180910390fd5b80600760016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109156110cf565b73ffffffffffffffffffffffffffffffffffffffff16610933610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610989576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109809061329d565b60405180910390fd5b61099360006113eb565b565b600260045414156109db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d29061333d565b60405180910390fd5b6002600481905550806005816040516109f49190612ea8565b908152602001604051809103902060009054906101000a900460ff1615610a50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a479061317d565b60405180910390fd5b6000610a91610a8b610a606110cf565b604051602001610a709190612e8d565b604051602081830303815290604052805190602001206114b1565b836114e1565b90508073ffffffffffffffffffffffffffffffffffffffff16600760019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1a906131dd565b60405180910390fd5b600760009054906101000a900460ff16610b72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b69906131bd565b60405180910390fd5b60b2610b8a600160065461102c90919063ffffffff16565b1115610bcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc29061315d565b60405180910390fd5b6001600584604051610bdd9190612ea8565b908152602001604051809103902060006101000a81548160ff021916908315150217905550610c26610c0d6110cf565b6000600160405180602001604052806000815250611508565b610c3c600160065461102c90919063ffffffff16565b6006819055505050600160048190555050565b600081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610c90610c896110cf565b838361169e565b5050565b610c9c6110cf565b73ffffffffffffffffffffffffffffffffffffffff16610cba610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d079061329d565b60405180910390fd5b610d198161180b565b50565b605881565b6005818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b610d5f6110cf565b73ffffffffffffffffffffffffffffffffffffffff16610d7d610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dca9061329d565b60405180910390fd5b600760009054906101000a900460ff1615600760006101000a81548160ff021916908315150217905550565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610e9b6110cf565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610ee15750610ee085610edb6110cf565b610dff565b5b610f20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f179061319d565b60405180910390fd5b610f2d8585858585611825565b5050505050565b610f3c6110cf565b73ffffffffffffffffffffffffffffffffffffffff16610f5a610c54565b73ffffffffffffffffffffffffffffffffffffffff1614610fb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa79061329d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611020576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110179061313d565b60405180910390fd5b611029816113eb565b50565b6000818361103a9190613507565b905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b815183511461111b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611112906132fd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561118b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111829061321d565b60405180910390fd5b60006111956110cf565b90506111a5818787878787611aa7565b60005b84518110156113565760008582815181106111c6576111c5613791565b5b6020026020010151905060008583815181106111e5576111e4613791565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d9061327d565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461133b9190613507565b925050819055505050508061134f9061368d565b90506111a8565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516113cd929190612fe4565b60405180910390a46113e3818787878787611aaf565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000816040516020016114c49190612ebf565b604051602081830303815290604052805190602001209050919050565b60008060006114f08585611c96565b915091506114fd81611d19565b819250505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611578576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156f9061331d565b60405180910390fd5b60006115826110cf565b90506115a38160008761159488611eee565b61159d88611eee565b87611aa7565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116029190613507565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611680929190613378565b60405180910390a461169781600087878787611f68565b5050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561170d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611704906132bd565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117fe919061301b565b60405180910390a3505050565b80600290805190602001906118219291906122bb565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611895576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188c9061321d565b60405180910390fd5b600061189f6110cf565b90506118bf8187876118b088611eee565b6118b988611eee565b87611aa7565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d9061327d565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a0b9190613507565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051611a88929190613378565b60405180910390a4611a9e828888888888611f68565b50505050505050565b505050505050565b611ace8473ffffffffffffffffffffffffffffffffffffffff16611042565b15611c8e578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401611b14959493929190612f00565b602060405180830381600087803b158015611b2e57600080fd5b505af1925050508015611b5f57506040513d601f19601f82011682018060405250810190611b5c91906128db565b60015b611c0557611b6b6137ef565b806308c379a01415611bc85750611b80613e18565b80611b8b5750611bca565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbf919061307b565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfc906130bd565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c83906130dd565b60405180910390fd5b505b505050505050565b600080604183511415611cd85760008060006020860151925060408601519150606086015160001a9050611ccc8782858561214f565b94509450505050611d12565b604083511415611d09576000806020850151915060408501519050611cfe86838361225c565b935093505050611d12565b60006002915091505b9250929050565b60006004811115611d2d57611d2c613733565b5b816004811115611d4057611d3f613733565b5b1415611d4b57611eeb565b60016004811115611d5f57611d5e613733565b5b816004811115611d7257611d71613733565b5b1415611db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611daa9061309d565b60405180910390fd5b60026004811115611dc757611dc6613733565b5b816004811115611dda57611dd9613733565b5b1415611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e12906130fd565b60405180910390fd5b60036004811115611e2f57611e2e613733565b5b816004811115611e4257611e41613733565b5b1415611e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7a906131fd565b60405180910390fd5b600480811115611e9657611e95613733565b5b816004811115611ea957611ea8613733565b5b1415611eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee19061325d565b60405180910390fd5b5b50565b60606000600167ffffffffffffffff811115611f0d57611f0c6137c0565b5b604051908082528060200260200182016040528015611f3b5781602001602082028036833780820191505090505b5090508281600081518110611f5357611f52613791565b5b60200260200101818152505080915050919050565b611f878473ffffffffffffffffffffffffffffffffffffffff16611042565b15612147578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611fcd959493929190612f68565b602060405180830381600087803b158015611fe757600080fd5b505af192505050801561201857506040513d601f19601f8201168201806040525081019061201591906128db565b60015b6120be576120246137ef565b806308c379a014156120815750612039613e18565b806120445750612083565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612078919061307b565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b5906130bd565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161213c906130dd565b60405180910390fd5b505b505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561218a576000600391509150612253565b601b8560ff16141580156121a25750601c8560ff1614155b156121b4576000600491509150612253565b6000600187878787604051600081526020016040526040516121d99493929190613036565b6020604051602081039080840390855afa1580156121fb573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561224a57600060019250925050612253565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c61229f9190613507565b90506122ad8782888561214f565b935093505050935093915050565b8280546122c79061362a565b90600052602060002090601f0160209004810192826122e95760008555612330565b82601f1061230257805160ff1916838001178555612330565b82800160010185558215612330579182015b8281111561232f578251825591602001919060010190612314565b5b50905061233d9190612341565b5090565b5b8082111561235a576000816000905550600101612342565b5090565b600061237161236c846133c6565b6133a1565b9050808382526020820190508285602086028201111561239457612393613816565b5b60005b858110156123c457816123aa88826124c2565b845260208401935060208301925050600181019050612397565b5050509392505050565b60006123e16123dc846133f2565b6133a1565b9050808382526020820190508285602086028201111561240457612403613816565b5b60005b85811015612434578161241a88826125ce565b845260208401935060208301925050600181019050612407565b5050509392505050565b600061245161244c8461341e565b6133a1565b90508281526020810184848401111561246d5761246c61381b565b5b6124788482856135e8565b509392505050565b600061249361248e8461344f565b6133a1565b9050828152602081018484840111156124af576124ae61381b565b5b6124ba8482856135e8565b509392505050565b6000813590506124d181613eae565b92915050565b600082601f8301126124ec576124eb613811565b5b81356124fc84826020860161235e565b91505092915050565b600082601f83011261251a57612519613811565b5b813561252a8482602086016123ce565b91505092915050565b60008135905061254281613ec5565b92915050565b60008135905061255781613edc565b92915050565b60008151905061256c81613edc565b92915050565b600082601f83011261258757612586613811565b5b813561259784826020860161243e565b91505092915050565b600082601f8301126125b5576125b4613811565b5b81356125c5848260208601612480565b91505092915050565b6000813590506125dd81613ef3565b92915050565b6000602082840312156125f9576125f8613825565b5b6000612607848285016124c2565b91505092915050565b6000806040838503121561262757612626613825565b5b6000612635858286016124c2565b9250506020612646858286016124c2565b9150509250929050565b600080600080600060a0868803121561266c5761266b613825565b5b600061267a888289016124c2565b955050602061268b888289016124c2565b945050604086013567ffffffffffffffff8111156126ac576126ab613820565b5b6126b888828901612505565b935050606086013567ffffffffffffffff8111156126d9576126d8613820565b5b6126e588828901612505565b925050608086013567ffffffffffffffff81111561270657612705613820565b5b61271288828901612572565b9150509295509295909350565b600080600080600060a0868803121561273b5761273a613825565b5b6000612749888289016124c2565b955050602061275a888289016124c2565b945050604061276b888289016125ce565b935050606061277c888289016125ce565b925050608086013567ffffffffffffffff81111561279d5761279c613820565b5b6127a988828901612572565b9150509295509295909350565b600080604083850312156127cd576127cc613825565b5b60006127db858286016124c2565b92505060206127ec85828601612533565b9150509250929050565b6000806040838503121561280d5761280c613825565b5b600061281b858286016124c2565b925050602061282c858286016125ce565b9150509250929050565b6000806040838503121561284d5761284c613825565b5b600083013567ffffffffffffffff81111561286b5761286a613820565b5b612877858286016124d7565b925050602083013567ffffffffffffffff81111561289857612897613820565b5b6128a485828601612505565b9150509250929050565b6000602082840312156128c4576128c3613825565b5b60006128d284828501612548565b91505092915050565b6000602082840312156128f1576128f0613825565b5b60006128ff8482850161255d565b91505092915050565b60006020828403121561291e5761291d613825565b5b600082013567ffffffffffffffff81111561293c5761293b613820565b5b61294884828501612572565b91505092915050565b60006020828403121561296757612966613825565b5b600082013567ffffffffffffffff81111561298557612984613820565b5b612991848285016125a0565b91505092915050565b6000602082840312156129b0576129af613825565b5b60006129be848285016125ce565b91505092915050565b60006129d38383612e60565b60208301905092915050565b6129e88161355d565b82525050565b6129ff6129fa8261355d565b6136d6565b82525050565b6000612a1082613490565b612a1a81856134be565b9350612a2583613480565b8060005b83811015612a56578151612a3d88826129c7565b9750612a48836134b1565b925050600181019050612a29565b5085935050505092915050565b612a6c8161356f565b82525050565b612a7b8161357b565b82525050565b612a92612a8d8261357b565b6136e8565b82525050565b6000612aa38261349b565b612aad81856134cf565b9350612abd8185602086016135f7565b612ac68161382a565b840191505092915050565b6000612adc8261349b565b612ae681856134e0565b9350612af68185602086016135f7565b80840191505092915050565b6000612b0d826134a6565b612b1781856134eb565b9350612b278185602086016135f7565b612b308161382a565b840191505092915050565b6000612b486018836134eb565b9150612b5382613855565b602082019050919050565b6000612b6b6034836134eb565b9150612b768261387e565b604082019050919050565b6000612b8e6028836134eb565b9150612b99826138cd565b604082019050919050565b6000612bb1601f836134eb565b9150612bbc8261391c565b602082019050919050565b6000612bd4601c836134fc565b9150612bdf82613945565b601c82019050919050565b6000612bf7602b836134eb565b9150612c028261396e565b604082019050919050565b6000612c1a6026836134eb565b9150612c25826139bd565b604082019050919050565b6000612c3d6020836134eb565b9150612c4882613a0c565b602082019050919050565b6000612c606016836134eb565b9150612c6b82613a35565b602082019050919050565b6000612c836029836134eb565b9150612c8e82613a5e565b604082019050919050565b6000612ca66012836134eb565b9150612cb182613aad565b602082019050919050565b6000612cc96011836134eb565b9150612cd482613ad6565b602082019050919050565b6000612cec6022836134eb565b9150612cf782613aff565b604082019050919050565b6000612d0f6025836134eb565b9150612d1a82613b4e565b604082019050919050565b6000612d326032836134eb565b9150612d3d82613b9d565b604082019050919050565b6000612d556022836134eb565b9150612d6082613bec565b604082019050919050565b6000612d78602a836134eb565b9150612d8382613c3b565b604082019050919050565b6000612d9b6020836134eb565b9150612da682613c8a565b602082019050919050565b6000612dbe6029836134eb565b9150612dc982613cb3565b604082019050919050565b6000612de16029836134eb565b9150612dec82613d02565b604082019050919050565b6000612e046028836134eb565b9150612e0f82613d51565b604082019050919050565b6000612e276021836134eb565b9150612e3282613da0565b604082019050919050565b6000612e4a601f836134eb565b9150612e5582613def565b602082019050919050565b612e69816135d1565b82525050565b612e78816135d1565b82525050565b612e87816135db565b82525050565b6000612e9982846129ee565b60148201915081905092915050565b6000612eb48284612ad1565b915081905092915050565b6000612eca82612bc7565b9150612ed68284612a81565b60208201915081905092915050565b6000602082019050612efa60008301846129df565b92915050565b600060a082019050612f1560008301886129df565b612f2260208301876129df565b8181036040830152612f348186612a05565b90508181036060830152612f488185612a05565b90508181036080830152612f5c8184612a98565b90509695505050505050565b600060a082019050612f7d60008301886129df565b612f8a60208301876129df565b612f976040830186612e6f565b612fa46060830185612e6f565b8181036080830152612fb68184612a98565b90509695505050505050565b60006020820190508181036000830152612fdc8184612a05565b905092915050565b60006040820190508181036000830152612ffe8185612a05565b905081810360208301526130128184612a05565b90509392505050565b60006020820190506130306000830184612a63565b92915050565b600060808201905061304b6000830187612a72565b6130586020830186612e7e565b6130656040830185612a72565b6130726060830184612a72565b95945050505050565b600060208201905081810360008301526130958184612b02565b905092915050565b600060208201905081810360008301526130b681612b3b565b9050919050565b600060208201905081810360008301526130d681612b5e565b9050919050565b600060208201905081810360008301526130f681612b81565b9050919050565b6000602082019050818103600083015261311681612ba4565b9050919050565b6000602082019050818103600083015261313681612bea565b9050919050565b6000602082019050818103600083015261315681612c0d565b9050919050565b6000602082019050818103600083015261317681612c30565b9050919050565b6000602082019050818103600083015261319681612c53565b9050919050565b600060208201905081810360008301526131b681612c76565b9050919050565b600060208201905081810360008301526131d681612c99565b9050919050565b600060208201905081810360008301526131f681612cbc565b9050919050565b6000602082019050818103600083015261321681612cdf565b9050919050565b6000602082019050818103600083015261323681612d02565b9050919050565b6000602082019050818103600083015261325681612d25565b9050919050565b6000602082019050818103600083015261327681612d48565b9050919050565b6000602082019050818103600083015261329681612d6b565b9050919050565b600060208201905081810360008301526132b681612d8e565b9050919050565b600060208201905081810360008301526132d681612db1565b9050919050565b600060208201905081810360008301526132f681612dd4565b9050919050565b6000602082019050818103600083015261331681612df7565b9050919050565b6000602082019050818103600083015261333681612e1a565b9050919050565b6000602082019050818103600083015261335681612e3d565b9050919050565b60006020820190506133726000830184612e6f565b92915050565b600060408201905061338d6000830185612e6f565b61339a6020830184612e6f565b9392505050565b60006133ab6133bc565b90506133b7828261365c565b919050565b6000604051905090565b600067ffffffffffffffff8211156133e1576133e06137c0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561340d5761340c6137c0565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613439576134386137c0565b5b6134428261382a565b9050602081019050919050565b600067ffffffffffffffff82111561346a576134696137c0565b5b6134738261382a565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613512826135d1565b915061351d836135d1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561355257613551613704565b5b828201905092915050565b6000613568826135b1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156136155780820151818401526020810190506135fa565b83811115613624576000848401525b50505050565b6000600282049050600182168061364257607f821691505b6020821081141561365657613655613762565b5b50919050565b6136658261382a565b810181811067ffffffffffffffff82111715613684576136836137c0565b5b80604052505050565b6000613698826135d1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136cb576136ca613704565b5b600182019050919050565b60006136e1826136f2565b9050919050565b6000819050919050565b60006136fd8261383b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d111561380e5760046000803e61380b600051613848565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d206e756d626572206f6620746f6b656e73600082015250565b7f5369676e617475726520616c7265616479207573656400000000000000000000600082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f74206163746976650000000000000000000000000000600082015250565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600060443d1015613e2857613eab565b613e306133bc565b60043d036004823e80513d602482011167ffffffffffffffff82111715613e58575050613eab565b808201805167ffffffffffffffff811115613e765750505050613eab565b80602083010160043d038501811115613e93575050505050613eab565b613ea28260200185018661365c565b82955050505050505b90565b613eb78161355d565b8114613ec257600080fd5b50565b613ece8161356f565b8114613ed957600080fd5b50565b613ee581613585565b8114613ef057600080fd5b50565b613efc816135d1565b8114613f0757600080fd5b5056fea264697066735822122026b2940a678c7afce0de1edabc5a2d74643b6978d5fa093a54e3c6ca168ddd6864736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000115468657920737065616b206f6620796f75000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _uri (string): They speak of you

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [2] : 5468657920737065616b206f6620796f75000000000000000000000000000000


Deployed Bytecode Sourcemap

58447:1563:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42291:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41314:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42035:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58790:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58848:66;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44230:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58612:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42688:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58821:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59073:82;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57507:103;;;:::i;:::-;;59337:341;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58699:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56856:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43285:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59247:84;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58657:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58742:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59161:80;;;:::i;:::-;;43512:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43752:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57765:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42291:231;42377:7;42424:1;42405:21;;:7;:21;;;;42397:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;42492:9;:13;42502:2;42492:13;;;;;;;;;;;:22;42506:7;42492:22;;;;;;;;;;;;;;;;42485:29;;42291:231;;;;:::o;41314:310::-;41416:4;41468:26;41453:41;;;:11;:41;;;;:110;;;;41526:37;41511:52;;;:11;:52;;;;41453:110;:163;;;;41580:36;41604:11;41580:23;:36::i;:::-;41453:163;41433:183;;41314:310;;;:::o;42035:105::-;42095:13;42128:4;42121:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42035:105;;;:::o;58790:26::-;;;;:::o;58848:66::-;;;;;;;;;;;;;:::o;44230:442::-;44471:12;:10;:12::i;:::-;44463:20;;:4;:20;;;:60;;;;44487:36;44504:4;44510:12;:10;:12::i;:::-;44487:16;:36::i;:::-;44463:60;44441:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;44612:52;44635:4;44641:2;44645:3;44650:7;44659:4;44612:22;:52::i;:::-;44230:442;;;;;:::o;58612:40::-;58649:3;58612:40;:::o;42688:524::-;42844:16;42905:3;:10;42886:8;:15;:29;42878:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;42974:30;43021:8;:15;43007:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42974:63;;43055:9;43050:122;43074:8;:15;43070:1;:19;43050:122;;;43130:30;43140:8;43149:1;43140:11;;;;;;;;:::i;:::-;;;;;;;;43153:3;43157:1;43153:6;;;;;;;;:::i;:::-;;;;;;;;43130:9;:30::i;:::-;43111:13;43125:1;43111:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;43091:3;;;;:::i;:::-;;;43050:122;;;;43191:13;43184:20;;;42688:524;;;;:::o;58821:22::-;;;;;;;;;;;;;:::o;59073:82::-;57087:12;:10;:12::i;:::-;57076:23;;:7;:5;:7::i;:::-;:23;;;57068:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59142:7:::1;59133:6;;:16;;;;;;;;;;;;;;;;;;59073:82:::0;:::o;57507:103::-;57087:12;:10;:12::i;:::-;57076:23;;:7;:5;:7::i;:::-;:23;;;57068:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57572:30:::1;57599:1;57572:18;:30::i;:::-;57507:103::o:0;59337:341::-;38397:1;38995:7;;:19;;38987:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38397:1;39128:7;:18;;;;59407:9:::1;59745:13;59759:9;59745:24;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;59744:25;59736:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59803:15;59821:118;59843:71;59899:12;:10;:12::i;:::-;59882:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;59872:41;;;;;;59843:28;:71::i;:::-;59923:9;59821:13;:118::i;:::-;59803:136;;59964:7;59954:17;;:6;;;;;;;;;;;:17;;;59946:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;59433:10:::2;;;;;;;;;;;59425:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;58649:3;59481:18;59497:1;59481:11;;:15;;:18;;;;:::i;:::-;:32;;59473:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;59586:4;59559:13;59573:9;59559:24;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;59597:36;59603:12;:10;:12::i;:::-;58734:1;59627;59597:36;;;;;;;;;;;::::0;:5:::2;:36::i;:::-;59654:18;59670:1;59654:11;;:15;;:18;;;;:::i;:::-;59640:11;:32;;;;59729:278:::1;39159:1;38353::::0;39307:7;:22;;;;59337:341;:::o;58699:36::-;58734:1;58699:36;:::o;56856:87::-;56902:7;56929:6;;;;;;;;;;;56922:13;;56856:87;:::o;43285:155::-;43380:52;43399:12;:10;:12::i;:::-;43413:8;43423;43380:18;:52::i;:::-;43285:155;;:::o;59247:84::-;57087:12;:10;:12::i;:::-;57076:23;;:7;:5;:7::i;:::-;:23;;;57068:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59312:13:::1;59320:4;59312:7;:13::i;:::-;59247:84:::0;:::o;58657:37::-;58692:2;58657:37;:::o;58742:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59161:80::-;57087:12;:10;:12::i;:::-;57076:23;;:7;:5;:7::i;:::-;:23;;;57068:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59225:10:::1;;;;;;;;;;;59224:11;59211:10;;:24;;;;;;;;;;;;;;;;;;59161:80::o:0;43512:168::-;43611:4;43635:18;:27;43654:7;43635:27;;;;;;;;;;;;;;;:37;43663:8;43635:37;;;;;;;;;;;;;;;;;;;;;;;;;43628:44;;43512:168;;;;:::o;43752:401::-;43968:12;:10;:12::i;:::-;43960:20;;:4;:20;;;:60;;;;43984:36;44001:4;44007:12;:10;:12::i;:::-;43984:16;:36::i;:::-;43960:60;43938:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;44100:45;44118:4;44124:2;44128;44132:6;44140:4;44100:17;:45::i;:::-;43752:401;;;;;:::o;57765:201::-;57087:12;:10;:12::i;:::-;57076:23;;:7;:5;:7::i;:::-;:23;;;57068:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57874:1:::1;57854:22;;:8;:22;;;;57846:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;57930:28;57949:8;57930:18;:28::i;:::-;57765:201:::0;:::o;2862:98::-;2920:7;2951:1;2947;:5;;;;:::i;:::-;2940:12;;2862:98;;;;:::o;19918:326::-;19978:4;20235:1;20213:7;:19;;;:23;20206:30;;19918:326;;;:::o;28970:157::-;29055:4;29094:25;29079:40;;;:11;:40;;;;29072:47;;28970:157;;;:::o;40023:98::-;40076:7;40103:10;40096:17;;40023:98;:::o;46314:1074::-;46541:7;:14;46527:3;:10;:28;46519:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46633:1;46619:16;;:2;:16;;;;46611:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;46690:16;46709:12;:10;:12::i;:::-;46690:31;;46734:60;46755:8;46765:4;46771:2;46775:3;46780:7;46789:4;46734:20;:60::i;:::-;46812:9;46807:421;46831:3;:10;46827:1;:14;46807:421;;;46863:10;46876:3;46880:1;46876:6;;;;;;;;:::i;:::-;;;;;;;;46863:19;;46897:14;46914:7;46922:1;46914:10;;;;;;;;:::i;:::-;;;;;;;;46897:27;;46941:19;46963:9;:13;46973:2;46963:13;;;;;;;;;;;:19;46977:4;46963:19;;;;;;;;;;;;;;;;46941:41;;47020:6;47005:11;:21;;46997:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;47153:6;47139:11;:20;47117:9;:13;47127:2;47117:13;;;;;;;;;;;:19;47131:4;47117:19;;;;;;;;;;;;;;;:42;;;;47210:6;47189:9;:13;47199:2;47189:13;;;;;;;;;;;:17;47203:2;47189:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;46848:380;;;46843:3;;;;:::i;:::-;;;46807:421;;;;47275:2;47245:47;;47269:4;47245:47;;47259:8;47245:47;;;47279:3;47284:7;47245:47;;;;;;;:::i;:::-;;;;;;;;47305:75;47341:8;47351:4;47357:2;47361:3;47366:7;47375:4;47305:35;:75::i;:::-;46508:880;46314:1074;;;;;:::o;58126:191::-;58200:16;58219:6;;;;;;;;;;;58200:25;;58245:8;58236:6;;:17;;;;;;;;;;;;;;;;;;58300:8;58269:40;;58290:8;58269:40;;;;;;;;;;;;58189:128;58126:191;:::o;17370:269::-;17439:7;17625:4;17572:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;17562:69;;;;;;17555:76;;17370:269;;;:::o;13568:231::-;13646:7;13667:17;13686:18;13708:27;13719:4;13725:9;13708:10;:27::i;:::-;13666:69;;;;13746:18;13758:5;13746:11;:18::i;:::-;13782:9;13775:16;;;;13568:231;;;;:::o;48706:569::-;48873:1;48859:16;;:2;:16;;;;48851:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48926:16;48945:12;:10;:12::i;:::-;48926:31;;48970:102;48991:8;49009:1;49013:2;49017:21;49035:2;49017:17;:21::i;:::-;49040:25;49058:6;49040:17;:25::i;:::-;49067:4;48970:20;:102::i;:::-;49106:6;49085:9;:13;49095:2;49085:13;;;;;;;;;;;:17;49099:2;49085:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;49165:2;49128:52;;49161:1;49128:52;;49143:8;49128:52;;;49169:2;49173:6;49128:52;;;;;;;:::i;:::-;;;;;;;;49193:74;49224:8;49242:1;49246:2;49250;49254:6;49262:4;49193:30;:74::i;:::-;48840:435;48706:569;;;;:::o;52500:331::-;52655:8;52646:17;;:5;:17;;;;52638:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;52758:8;52720:18;:25;52739:5;52720:25;;;;;;;;;;;;;;;:35;52746:8;52720:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;52804:8;52782:41;;52797:5;52782:41;;;52814:8;52782:41;;;;;;:::i;:::-;;;;;;;;52500:331;;;:::o;48232:88::-;48306:6;48299:4;:13;;;;;;;;;;;;:::i;:::-;;48232:88;:::o;45136:820::-;45338:1;45324:16;;:2;:16;;;;45316:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45395:16;45414:12;:10;:12::i;:::-;45395:31;;45439:96;45460:8;45470:4;45476:2;45480:21;45498:2;45480:17;:21::i;:::-;45503:25;45521:6;45503:17;:25::i;:::-;45530:4;45439:20;:96::i;:::-;45548:19;45570:9;:13;45580:2;45570:13;;;;;;;;;;;:19;45584:4;45570:19;;;;;;;;;;;;;;;;45548:41;;45623:6;45608:11;:21;;45600:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;45748:6;45734:11;:20;45712:9;:13;45722:2;45712:13;;;;;;;;;;;:19;45726:4;45712:19;;;;;;;;;;;;;;;:42;;;;45797:6;45776:9;:13;45786:2;45776:13;;;;;;;;;;;:17;45790:2;45776:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;45852:2;45821:46;;45846:4;45821:46;;45836:8;45821:46;;;45856:2;45860:6;45821:46;;;;;;;:::i;:::-;;;;;;;;45880:68;45911:8;45921:4;45927:2;45931;45935:6;45943:4;45880:30;:68::i;:::-;45305:651;;45136:820;;;;;:::o;53787:221::-;;;;;;;:::o;54768:813::-;55008:15;:2;:13;;;:15::i;:::-;55004:570;;;55061:2;55044:43;;;55088:8;55098:4;55104:3;55109:7;55118:4;55044:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55040:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;55436:6;55429:14;;;;;;;;;;;:::i;:::-;;;;;;;;55040:523;;;55485:62;;;;;;;;;;:::i;:::-;;;;;;;;55040:523;55217:48;;;55205:60;;;:8;:60;;;;55201:159;;55290:50;;;;;;;;;;:::i;:::-;;;;;;;;55201:159;55124:251;55004:570;54768:813;;;;;;:::o;11458:1308::-;11539:7;11548:12;11793:2;11773:9;:16;:22;11769:990;;;11812:9;11836;11860:7;12069:4;12058:9;12054:20;12048:27;12043:32;;12119:4;12108:9;12104:20;12098:27;12093:32;;12177:4;12166:9;12162:20;12156:27;12153:1;12148:36;12143:41;;12220:25;12231:4;12237:1;12240;12243;12220:10;:25::i;:::-;12213:32;;;;;;;;;11769:990;12287:2;12267:9;:16;:22;12263:496;;;12306:9;12330:10;12542:4;12531:9;12527:20;12521:27;12516:32;;12593:4;12582:9;12578:20;12572:27;12566:33;;12635:23;12646:4;12652:1;12655:2;12635:10;:23::i;:::-;12628:30;;;;;;;;12263:496;12707:1;12711:35;12691:56;;;;11458:1308;;;;;;:::o;9729:643::-;9807:20;9798:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;9794:571;;;9844:7;;9794:571;9905:29;9896:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;9892:473;;;9951:34;;;;;;;;;;:::i;:::-;;;;;;;;9892:473;10016:35;10007:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;10003:362;;;10068:41;;;;;;;;;;:::i;:::-;;;;;;;;10003:362;10140:30;10131:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;10127:238;;;10187:44;;;;;;;;;;:::i;:::-;;;;;;;;10127:238;10262:30;10253:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;10249:116;;;10309:44;;;;;;;;;;:::i;:::-;;;;;;;;10249:116;9729:643;;:::o;55589:198::-;55655:16;55684:22;55723:1;55709:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55684:41;;55747:7;55736:5;55742:1;55736:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;55774:5;55767:12;;;55589:198;;;:::o;54016:744::-;54231:15;:2;:13;;;:15::i;:::-;54227:526;;;54284:2;54267:38;;;54306:8;54316:4;54322:2;54326:6;54334:4;54267:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54263:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;54615:6;54608:14;;;;;;;;;;;:::i;:::-;;;;;;;;54263:479;;;54664:62;;;;;;;;;;:::i;:::-;;;;;;;;54263:479;54401:43;;;54389:55;;;:8;:55;;;;54385:154;;54469:50;;;;;;;;;;:::i;:::-;;;;;;;;54385:154;54340:214;54227:526;54016:744;;;;;;:::o;15020:1632::-;15151:7;15160:12;16085:66;16080:1;16072:10;;:79;16068:163;;;16184:1;16188:30;16168:51;;;;;;16068:163;16250:2;16245:1;:7;;;;:18;;;;;16261:2;16256:1;:7;;;;16245:18;16241:102;;;16296:1;16300:30;16280:51;;;;;;16241:102;16440:14;16457:24;16467:4;16473:1;16476;16479;16457:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16440:41;;16514:1;16496:20;;:6;:20;;;16492:103;;;16549:1;16553:29;16533:50;;;;;;;16492:103;16615:6;16623:20;16607:37;;;;;15020:1632;;;;;;;;:::o;14062:344::-;14176:7;14185:12;14210:9;14235:66;14227:75;;14222:2;:80;14210:92;;14313:7;14352:2;14345:3;14338:2;14330:11;;:18;;14329:25;;;;:::i;:::-;14313:42;;14373:25;14384:4;14390:1;14393;14396;14373:10;:25::i;:::-;14366:32;;;;;;14062:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722: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:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:::-;2957:5;3006:3;2999:4;2991:6;2987:17;2983:27;2973:122;;3014:79;;:::i;:::-;2973:122;3131:6;3118:20;3156:94;3246:3;3238:6;3231:4;3223:6;3219:17;3156:94;:::i;:::-;3147:103;;2963:293;2886:370;;;;:::o;3262:133::-;3305:5;3343:6;3330:20;3321:29;;3359:30;3383:5;3359:30;:::i;:::-;3262:133;;;;:::o;3401:137::-;3446:5;3484:6;3471:20;3462:29;;3500:32;3526:5;3500:32;:::i;:::-;3401:137;;;;:::o;3544:141::-;3600:5;3631:6;3625:13;3616:22;;3647:32;3673:5;3647:32;:::i;:::-;3544:141;;;;:::o;3704:338::-;3759:5;3808:3;3801:4;3793:6;3789:17;3785:27;3775:122;;3816:79;;:::i;:::-;3775:122;3933:6;3920:20;3958:78;4032:3;4024:6;4017:4;4009:6;4005:17;3958:78;:::i;:::-;3949:87;;3765:277;3704:338;;;;:::o;4062:340::-;4118:5;4167:3;4160:4;4152:6;4148:17;4144:27;4134:122;;4175:79;;:::i;:::-;4134:122;4292:6;4279:20;4317:79;4392:3;4384:6;4377:4;4369:6;4365:17;4317:79;:::i;:::-;4308:88;;4124:278;4062:340;;;;:::o;4408:139::-;4454:5;4492:6;4479:20;4470:29;;4508:33;4535:5;4508:33;:::i;:::-;4408:139;;;;:::o;4553:329::-;4612:6;4661:2;4649:9;4640:7;4636:23;4632:32;4629:119;;;4667:79;;:::i;:::-;4629:119;4787:1;4812:53;4857:7;4848:6;4837:9;4833:22;4812:53;:::i;:::-;4802:63;;4758:117;4553:329;;;;:::o;4888:474::-;4956:6;4964;5013:2;5001:9;4992:7;4988:23;4984:32;4981:119;;;5019:79;;:::i;:::-;4981:119;5139:1;5164:53;5209:7;5200:6;5189:9;5185:22;5164:53;:::i;:::-;5154:63;;5110:117;5266:2;5292:53;5337:7;5328:6;5317:9;5313:22;5292:53;:::i;:::-;5282:63;;5237:118;4888:474;;;;;:::o;5368:1509::-;5522:6;5530;5538;5546;5554;5603:3;5591:9;5582:7;5578:23;5574:33;5571:120;;;5610:79;;:::i;:::-;5571:120;5730:1;5755:53;5800:7;5791:6;5780:9;5776:22;5755:53;:::i;:::-;5745:63;;5701:117;5857:2;5883:53;5928:7;5919:6;5908:9;5904:22;5883:53;:::i;:::-;5873:63;;5828:118;6013:2;6002:9;5998:18;5985:32;6044:18;6036:6;6033:30;6030:117;;;6066:79;;:::i;:::-;6030:117;6171:78;6241:7;6232:6;6221:9;6217:22;6171:78;:::i;:::-;6161:88;;5956:303;6326:2;6315:9;6311:18;6298:32;6357:18;6349:6;6346:30;6343:117;;;6379:79;;:::i;:::-;6343:117;6484:78;6554:7;6545:6;6534:9;6530:22;6484:78;:::i;:::-;6474:88;;6269:303;6639:3;6628:9;6624:19;6611:33;6671:18;6663:6;6660:30;6657:117;;;6693:79;;:::i;:::-;6657:117;6798:62;6852:7;6843:6;6832:9;6828:22;6798:62;:::i;:::-;6788:72;;6582:288;5368:1509;;;;;;;;:::o;6883:1089::-;6987:6;6995;7003;7011;7019;7068:3;7056:9;7047:7;7043:23;7039:33;7036:120;;;7075:79;;:::i;:::-;7036:120;7195:1;7220:53;7265:7;7256:6;7245:9;7241:22;7220:53;:::i;:::-;7210:63;;7166:117;7322:2;7348:53;7393:7;7384:6;7373:9;7369:22;7348:53;:::i;:::-;7338:63;;7293:118;7450:2;7476:53;7521:7;7512:6;7501:9;7497:22;7476:53;:::i;:::-;7466:63;;7421:118;7578:2;7604:53;7649:7;7640:6;7629:9;7625:22;7604:53;:::i;:::-;7594:63;;7549:118;7734:3;7723:9;7719:19;7706:33;7766:18;7758:6;7755:30;7752:117;;;7788:79;;:::i;:::-;7752:117;7893:62;7947:7;7938:6;7927:9;7923:22;7893:62;:::i;:::-;7883:72;;7677:288;6883:1089;;;;;;;;:::o;7978:468::-;8043:6;8051;8100:2;8088:9;8079:7;8075:23;8071:32;8068:119;;;8106:79;;:::i;:::-;8068:119;8226:1;8251:53;8296:7;8287:6;8276:9;8272:22;8251:53;:::i;:::-;8241:63;;8197:117;8353:2;8379:50;8421:7;8412:6;8401:9;8397:22;8379:50;:::i;:::-;8369:60;;8324:115;7978:468;;;;;:::o;8452:474::-;8520:6;8528;8577:2;8565:9;8556:7;8552:23;8548:32;8545:119;;;8583:79;;:::i;:::-;8545:119;8703:1;8728:53;8773:7;8764:6;8753:9;8749:22;8728:53;:::i;:::-;8718:63;;8674:117;8830:2;8856:53;8901:7;8892:6;8881:9;8877:22;8856:53;:::i;:::-;8846:63;;8801:118;8452:474;;;;;:::o;8932:894::-;9050:6;9058;9107:2;9095:9;9086:7;9082:23;9078:32;9075:119;;;9113:79;;:::i;:::-;9075:119;9261:1;9250:9;9246:17;9233:31;9291:18;9283:6;9280:30;9277:117;;;9313:79;;:::i;:::-;9277:117;9418:78;9488:7;9479:6;9468:9;9464:22;9418:78;:::i;:::-;9408:88;;9204:302;9573:2;9562:9;9558:18;9545:32;9604:18;9596:6;9593:30;9590:117;;;9626:79;;:::i;:::-;9590:117;9731:78;9801:7;9792:6;9781:9;9777:22;9731:78;:::i;:::-;9721:88;;9516:303;8932:894;;;;;:::o;9832:327::-;9890:6;9939:2;9927:9;9918:7;9914:23;9910:32;9907:119;;;9945:79;;:::i;:::-;9907:119;10065:1;10090:52;10134:7;10125:6;10114:9;10110:22;10090:52;:::i;:::-;10080:62;;10036:116;9832:327;;;;:::o;10165:349::-;10234:6;10283:2;10271:9;10262:7;10258:23;10254:32;10251:119;;;10289:79;;:::i;:::-;10251:119;10409:1;10434:63;10489:7;10480:6;10469:9;10465:22;10434:63;:::i;:::-;10424:73;;10380:127;10165:349;;;;:::o;10520:507::-;10588:6;10637:2;10625:9;10616:7;10612:23;10608:32;10605:119;;;10643:79;;:::i;:::-;10605:119;10791:1;10780:9;10776:17;10763:31;10821:18;10813:6;10810:30;10807:117;;;10843:79;;:::i;:::-;10807:117;10948:62;11002:7;10993:6;10982:9;10978:22;10948:62;:::i;:::-;10938:72;;10734:286;10520:507;;;;:::o;11033:509::-;11102:6;11151:2;11139:9;11130:7;11126:23;11122:32;11119:119;;;11157:79;;:::i;:::-;11119:119;11305:1;11294:9;11290:17;11277:31;11335:18;11327:6;11324:30;11321:117;;;11357:79;;:::i;:::-;11321:117;11462:63;11517:7;11508:6;11497:9;11493:22;11462:63;:::i;:::-;11452:73;;11248:287;11033:509;;;;:::o;11548:329::-;11607:6;11656:2;11644:9;11635:7;11631:23;11627:32;11624:119;;;11662:79;;:::i;:::-;11624:119;11782:1;11807:53;11852:7;11843:6;11832:9;11828:22;11807:53;:::i;:::-;11797:63;;11753:117;11548:329;;;;:::o;11883:179::-;11952:10;11973:46;12015:3;12007:6;11973:46;:::i;:::-;12051:4;12046:3;12042:14;12028:28;;11883:179;;;;:::o;12068:118::-;12155:24;12173:5;12155:24;:::i;:::-;12150:3;12143:37;12068:118;;:::o;12192:157::-;12297:45;12317:24;12335:5;12317:24;:::i;:::-;12297:45;:::i;:::-;12292:3;12285:58;12192:157;;:::o;12385:732::-;12504:3;12533:54;12581:5;12533:54;:::i;:::-;12603:86;12682:6;12677:3;12603:86;:::i;:::-;12596:93;;12713:56;12763:5;12713:56;:::i;:::-;12792:7;12823:1;12808:284;12833:6;12830:1;12827:13;12808:284;;;12909:6;12903:13;12936:63;12995:3;12980:13;12936:63;:::i;:::-;12929:70;;13022:60;13075:6;13022:60;:::i;:::-;13012:70;;12868:224;12855:1;12852;12848:9;12843:14;;12808:284;;;12812:14;13108:3;13101:10;;12509:608;;;12385:732;;;;:::o;13123:109::-;13204:21;13219:5;13204:21;:::i;:::-;13199:3;13192:34;13123:109;;:::o;13238:118::-;13325:24;13343:5;13325:24;:::i;:::-;13320:3;13313:37;13238:118;;:::o;13362:157::-;13467:45;13487:24;13505:5;13487:24;:::i;:::-;13467:45;:::i;:::-;13462:3;13455:58;13362:157;;:::o;13525:360::-;13611:3;13639:38;13671:5;13639:38;:::i;:::-;13693:70;13756:6;13751:3;13693:70;:::i;:::-;13686:77;;13772:52;13817:6;13812:3;13805:4;13798:5;13794:16;13772:52;:::i;:::-;13849:29;13871:6;13849:29;:::i;:::-;13844:3;13840:39;13833:46;;13615:270;13525:360;;;;:::o;13891:373::-;13995:3;14023:38;14055:5;14023:38;:::i;:::-;14077:88;14158:6;14153:3;14077:88;:::i;:::-;14070:95;;14174:52;14219:6;14214:3;14207:4;14200:5;14196:16;14174:52;:::i;:::-;14251:6;14246:3;14242:16;14235:23;;13999:265;13891:373;;;;:::o;14270:364::-;14358:3;14386:39;14419:5;14386:39;:::i;:::-;14441:71;14505:6;14500:3;14441:71;:::i;:::-;14434:78;;14521:52;14566:6;14561:3;14554:4;14547:5;14543:16;14521:52;:::i;:::-;14598:29;14620:6;14598:29;:::i;:::-;14593:3;14589:39;14582:46;;14362:272;14270:364;;;;:::o;14640:366::-;14782:3;14803:67;14867:2;14862:3;14803:67;:::i;:::-;14796:74;;14879:93;14968:3;14879:93;:::i;:::-;14997:2;14992:3;14988:12;14981:19;;14640:366;;;:::o;15012:::-;15154:3;15175:67;15239:2;15234:3;15175:67;:::i;:::-;15168:74;;15251:93;15340:3;15251:93;:::i;:::-;15369:2;15364:3;15360:12;15353:19;;15012:366;;;:::o;15384:::-;15526:3;15547:67;15611:2;15606:3;15547:67;:::i;:::-;15540:74;;15623:93;15712:3;15623:93;:::i;:::-;15741:2;15736:3;15732:12;15725:19;;15384:366;;;:::o;15756:::-;15898:3;15919:67;15983:2;15978:3;15919:67;:::i;:::-;15912:74;;15995:93;16084:3;15995:93;:::i;:::-;16113:2;16108:3;16104:12;16097:19;;15756:366;;;:::o;16128:402::-;16288:3;16309:85;16391:2;16386:3;16309:85;:::i;:::-;16302:92;;16403:93;16492:3;16403:93;:::i;:::-;16521:2;16516:3;16512:12;16505:19;;16128:402;;;:::o;16536:366::-;16678:3;16699:67;16763:2;16758:3;16699:67;:::i;:::-;16692:74;;16775:93;16864:3;16775:93;:::i;:::-;16893:2;16888:3;16884:12;16877:19;;16536:366;;;:::o;16908:::-;17050:3;17071:67;17135:2;17130:3;17071:67;:::i;:::-;17064:74;;17147:93;17236:3;17147:93;:::i;:::-;17265:2;17260:3;17256:12;17249:19;;16908:366;;;:::o;17280:::-;17422:3;17443:67;17507:2;17502:3;17443:67;:::i;:::-;17436:74;;17519:93;17608:3;17519:93;:::i;:::-;17637:2;17632:3;17628:12;17621:19;;17280:366;;;:::o;17652:::-;17794:3;17815:67;17879:2;17874:3;17815:67;:::i;:::-;17808:74;;17891:93;17980:3;17891:93;:::i;:::-;18009:2;18004:3;18000:12;17993:19;;17652:366;;;:::o;18024:::-;18166:3;18187:67;18251:2;18246:3;18187:67;:::i;:::-;18180:74;;18263:93;18352:3;18263:93;:::i;:::-;18381:2;18376:3;18372:12;18365:19;;18024:366;;;:::o;18396:::-;18538:3;18559:67;18623:2;18618:3;18559:67;:::i;:::-;18552:74;;18635:93;18724:3;18635:93;:::i;:::-;18753:2;18748:3;18744:12;18737:19;;18396:366;;;:::o;18768:::-;18910:3;18931:67;18995:2;18990:3;18931:67;:::i;:::-;18924:74;;19007:93;19096:3;19007:93;:::i;:::-;19125:2;19120:3;19116:12;19109:19;;18768:366;;;:::o;19140:::-;19282:3;19303:67;19367:2;19362:3;19303:67;:::i;:::-;19296:74;;19379:93;19468:3;19379:93;:::i;:::-;19497:2;19492:3;19488:12;19481:19;;19140:366;;;:::o;19512:::-;19654:3;19675:67;19739:2;19734:3;19675:67;:::i;:::-;19668:74;;19751:93;19840:3;19751:93;:::i;:::-;19869:2;19864:3;19860:12;19853:19;;19512:366;;;:::o;19884:::-;20026:3;20047:67;20111:2;20106:3;20047:67;:::i;:::-;20040:74;;20123:93;20212:3;20123:93;:::i;:::-;20241:2;20236:3;20232:12;20225:19;;19884:366;;;:::o;20256:::-;20398:3;20419:67;20483:2;20478:3;20419:67;:::i;:::-;20412:74;;20495:93;20584:3;20495:93;:::i;:::-;20613:2;20608:3;20604:12;20597:19;;20256:366;;;:::o;20628:::-;20770:3;20791:67;20855:2;20850:3;20791:67;:::i;:::-;20784:74;;20867:93;20956:3;20867:93;:::i;:::-;20985:2;20980:3;20976:12;20969:19;;20628:366;;;:::o;21000:::-;21142:3;21163:67;21227:2;21222:3;21163:67;:::i;:::-;21156:74;;21239:93;21328:3;21239:93;:::i;:::-;21357:2;21352:3;21348:12;21341:19;;21000:366;;;:::o;21372:::-;21514:3;21535:67;21599:2;21594:3;21535:67;:::i;:::-;21528:74;;21611:93;21700:3;21611:93;:::i;:::-;21729:2;21724:3;21720:12;21713:19;;21372:366;;;:::o;21744:::-;21886:3;21907:67;21971:2;21966:3;21907:67;:::i;:::-;21900:74;;21983:93;22072:3;21983:93;:::i;:::-;22101:2;22096:3;22092:12;22085:19;;21744:366;;;:::o;22116:::-;22258:3;22279:67;22343:2;22338:3;22279:67;:::i;:::-;22272:74;;22355:93;22444:3;22355:93;:::i;:::-;22473:2;22468:3;22464:12;22457:19;;22116:366;;;:::o;22488:::-;22630:3;22651:67;22715:2;22710:3;22651:67;:::i;:::-;22644:74;;22727:93;22816:3;22727:93;:::i;:::-;22845:2;22840:3;22836:12;22829:19;;22488:366;;;:::o;22860:::-;23002:3;23023:67;23087:2;23082:3;23023:67;:::i;:::-;23016:74;;23099:93;23188:3;23099:93;:::i;:::-;23217:2;23212:3;23208:12;23201:19;;22860:366;;;:::o;23232:108::-;23309:24;23327:5;23309:24;:::i;:::-;23304:3;23297:37;23232:108;;:::o;23346:118::-;23433:24;23451:5;23433:24;:::i;:::-;23428:3;23421:37;23346:118;;:::o;23470:112::-;23553:22;23569:5;23553:22;:::i;:::-;23548:3;23541:35;23470:112;;:::o;23588:256::-;23700:3;23715:75;23786:3;23777:6;23715:75;:::i;:::-;23815:2;23810:3;23806:12;23799:19;;23835:3;23828:10;;23588:256;;;;:::o;23850:271::-;23980:3;24002:93;24091:3;24082:6;24002:93;:::i;:::-;23995:100;;24112:3;24105:10;;23850:271;;;;:::o;24127:522::-;24340:3;24362:148;24506:3;24362:148;:::i;:::-;24355:155;;24520:75;24591:3;24582:6;24520:75;:::i;:::-;24620:2;24615:3;24611:12;24604:19;;24640:3;24633:10;;24127:522;;;;:::o;24655:222::-;24748:4;24786:2;24775:9;24771:18;24763:26;;24799:71;24867:1;24856:9;24852:17;24843:6;24799:71;:::i;:::-;24655:222;;;;:::o;24883:1053::-;25206:4;25244:3;25233:9;25229:19;25221:27;;25258:71;25326:1;25315:9;25311:17;25302:6;25258:71;:::i;:::-;25339:72;25407:2;25396:9;25392:18;25383:6;25339:72;:::i;:::-;25458:9;25452:4;25448:20;25443:2;25432:9;25428:18;25421:48;25486:108;25589:4;25580:6;25486:108;:::i;:::-;25478:116;;25641:9;25635:4;25631:20;25626:2;25615:9;25611:18;25604:48;25669:108;25772:4;25763:6;25669:108;:::i;:::-;25661:116;;25825:9;25819:4;25815:20;25809:3;25798:9;25794:19;25787:49;25853:76;25924:4;25915:6;25853:76;:::i;:::-;25845:84;;24883:1053;;;;;;;;:::o;25942:751::-;26165:4;26203:3;26192:9;26188:19;26180:27;;26217:71;26285:1;26274:9;26270:17;26261:6;26217:71;:::i;:::-;26298:72;26366:2;26355:9;26351:18;26342:6;26298:72;:::i;:::-;26380;26448:2;26437:9;26433:18;26424:6;26380:72;:::i;:::-;26462;26530:2;26519:9;26515:18;26506:6;26462:72;:::i;:::-;26582:9;26576:4;26572:20;26566:3;26555:9;26551:19;26544:49;26610:76;26681:4;26672:6;26610:76;:::i;:::-;26602:84;;25942:751;;;;;;;;:::o;26699:373::-;26842:4;26880:2;26869:9;26865:18;26857:26;;26929:9;26923:4;26919:20;26915:1;26904:9;26900:17;26893:47;26957:108;27060:4;27051:6;26957:108;:::i;:::-;26949:116;;26699:373;;;;:::o;27078:634::-;27299:4;27337:2;27326:9;27322:18;27314:26;;27386:9;27380:4;27376:20;27372:1;27361:9;27357:17;27350:47;27414:108;27517:4;27508:6;27414:108;:::i;:::-;27406:116;;27569:9;27563:4;27559:20;27554:2;27543:9;27539:18;27532:48;27597:108;27700:4;27691:6;27597:108;:::i;:::-;27589:116;;27078:634;;;;;:::o;27718:210::-;27805:4;27843:2;27832:9;27828:18;27820:26;;27856:65;27918:1;27907:9;27903:17;27894:6;27856:65;:::i;:::-;27718:210;;;;:::o;27934:545::-;28107:4;28145:3;28134:9;28130:19;28122:27;;28159:71;28227:1;28216:9;28212:17;28203:6;28159:71;:::i;:::-;28240:68;28304:2;28293:9;28289:18;28280:6;28240:68;:::i;:::-;28318:72;28386:2;28375:9;28371:18;28362:6;28318:72;:::i;:::-;28400;28468:2;28457:9;28453:18;28444:6;28400:72;:::i;:::-;27934:545;;;;;;;:::o;28485:313::-;28598:4;28636:2;28625:9;28621:18;28613:26;;28685:9;28679:4;28675:20;28671:1;28660:9;28656:17;28649:47;28713:78;28786:4;28777:6;28713:78;:::i;:::-;28705:86;;28485:313;;;;:::o;28804:419::-;28970:4;29008:2;28997:9;28993:18;28985:26;;29057:9;29051:4;29047:20;29043:1;29032:9;29028:17;29021:47;29085:131;29211:4;29085:131;:::i;:::-;29077:139;;28804:419;;;:::o;29229:::-;29395:4;29433:2;29422:9;29418:18;29410:26;;29482:9;29476:4;29472:20;29468:1;29457:9;29453:17;29446:47;29510:131;29636:4;29510:131;:::i;:::-;29502:139;;29229:419;;;:::o;29654:::-;29820:4;29858:2;29847:9;29843:18;29835:26;;29907:9;29901:4;29897:20;29893:1;29882:9;29878:17;29871:47;29935:131;30061:4;29935:131;:::i;:::-;29927:139;;29654:419;;;:::o;30079:::-;30245:4;30283:2;30272:9;30268:18;30260:26;;30332:9;30326:4;30322:20;30318:1;30307:9;30303:17;30296:47;30360:131;30486:4;30360:131;:::i;:::-;30352:139;;30079:419;;;:::o;30504:::-;30670:4;30708:2;30697:9;30693:18;30685:26;;30757:9;30751:4;30747:20;30743:1;30732:9;30728:17;30721:47;30785:131;30911:4;30785:131;:::i;:::-;30777:139;;30504:419;;;:::o;30929:::-;31095:4;31133:2;31122:9;31118:18;31110:26;;31182:9;31176:4;31172:20;31168:1;31157:9;31153:17;31146:47;31210:131;31336:4;31210:131;:::i;:::-;31202:139;;30929:419;;;:::o;31354:::-;31520:4;31558:2;31547:9;31543:18;31535:26;;31607:9;31601:4;31597:20;31593:1;31582:9;31578:17;31571:47;31635:131;31761:4;31635:131;:::i;:::-;31627:139;;31354:419;;;:::o;31779:::-;31945:4;31983:2;31972:9;31968:18;31960:26;;32032:9;32026:4;32022:20;32018:1;32007:9;32003:17;31996:47;32060:131;32186:4;32060:131;:::i;:::-;32052:139;;31779:419;;;:::o;32204:::-;32370:4;32408:2;32397:9;32393:18;32385:26;;32457:9;32451:4;32447:20;32443:1;32432:9;32428:17;32421:47;32485:131;32611:4;32485:131;:::i;:::-;32477:139;;32204:419;;;:::o;32629:::-;32795:4;32833:2;32822:9;32818:18;32810:26;;32882:9;32876:4;32872:20;32868:1;32857:9;32853:17;32846:47;32910:131;33036:4;32910:131;:::i;:::-;32902:139;;32629:419;;;:::o;33054:::-;33220:4;33258:2;33247:9;33243:18;33235:26;;33307:9;33301:4;33297:20;33293:1;33282:9;33278:17;33271:47;33335:131;33461:4;33335:131;:::i;:::-;33327:139;;33054:419;;;:::o;33479:::-;33645:4;33683:2;33672:9;33668:18;33660:26;;33732:9;33726:4;33722:20;33718:1;33707:9;33703:17;33696:47;33760:131;33886:4;33760:131;:::i;:::-;33752:139;;33479:419;;;:::o;33904:::-;34070:4;34108:2;34097:9;34093:18;34085:26;;34157:9;34151:4;34147:20;34143:1;34132:9;34128:17;34121:47;34185:131;34311:4;34185:131;:::i;:::-;34177:139;;33904:419;;;:::o;34329:::-;34495:4;34533:2;34522:9;34518:18;34510:26;;34582:9;34576:4;34572:20;34568:1;34557:9;34553:17;34546:47;34610:131;34736:4;34610:131;:::i;:::-;34602:139;;34329:419;;;:::o;34754:::-;34920:4;34958:2;34947:9;34943:18;34935:26;;35007:9;35001:4;34997:20;34993:1;34982:9;34978:17;34971:47;35035:131;35161:4;35035:131;:::i;:::-;35027:139;;34754:419;;;:::o;35179:::-;35345:4;35383:2;35372:9;35368:18;35360:26;;35432:9;35426:4;35422:20;35418:1;35407:9;35403:17;35396:47;35460:131;35586:4;35460:131;:::i;:::-;35452:139;;35179:419;;;:::o;35604:::-;35770:4;35808:2;35797:9;35793:18;35785:26;;35857:9;35851:4;35847:20;35843:1;35832:9;35828:17;35821:47;35885:131;36011:4;35885:131;:::i;:::-;35877:139;;35604:419;;;:::o;36029:::-;36195:4;36233:2;36222:9;36218:18;36210:26;;36282:9;36276:4;36272:20;36268:1;36257:9;36253:17;36246:47;36310:131;36436:4;36310:131;:::i;:::-;36302:139;;36029:419;;;:::o;36454:::-;36620:4;36658:2;36647:9;36643:18;36635:26;;36707:9;36701:4;36697:20;36693:1;36682:9;36678:17;36671:47;36735:131;36861:4;36735:131;:::i;:::-;36727:139;;36454:419;;;:::o;36879:::-;37045:4;37083:2;37072:9;37068:18;37060:26;;37132:9;37126:4;37122:20;37118:1;37107:9;37103:17;37096:47;37160:131;37286:4;37160:131;:::i;:::-;37152:139;;36879:419;;;:::o;37304:::-;37470:4;37508:2;37497:9;37493:18;37485:26;;37557:9;37551:4;37547:20;37543:1;37532:9;37528:17;37521:47;37585:131;37711:4;37585:131;:::i;:::-;37577:139;;37304:419;;;:::o;37729:::-;37895:4;37933:2;37922:9;37918:18;37910:26;;37982:9;37976:4;37972:20;37968:1;37957:9;37953:17;37946:47;38010:131;38136:4;38010:131;:::i;:::-;38002:139;;37729:419;;;:::o;38154:222::-;38247:4;38285:2;38274:9;38270:18;38262:26;;38298:71;38366:1;38355:9;38351:17;38342:6;38298:71;:::i;:::-;38154:222;;;;:::o;38382:332::-;38503:4;38541:2;38530:9;38526:18;38518:26;;38554:71;38622:1;38611:9;38607:17;38598:6;38554:71;:::i;:::-;38635:72;38703:2;38692:9;38688:18;38679:6;38635:72;:::i;:::-;38382:332;;;;;:::o;38720:129::-;38754:6;38781:20;;:::i;:::-;38771:30;;38810:33;38838:4;38830:6;38810:33;:::i;:::-;38720:129;;;:::o;38855:75::-;38888:6;38921:2;38915:9;38905:19;;38855:75;:::o;38936:311::-;39013:4;39103:18;39095:6;39092:30;39089:56;;;39125:18;;:::i;:::-;39089:56;39175:4;39167:6;39163:17;39155:25;;39235:4;39229;39225:15;39217:23;;38936:311;;;:::o;39253:::-;39330:4;39420:18;39412:6;39409:30;39406:56;;;39442:18;;:::i;:::-;39406:56;39492:4;39484:6;39480:17;39472:25;;39552:4;39546;39542:15;39534:23;;39253:311;;;:::o;39570:307::-;39631:4;39721:18;39713:6;39710:30;39707:56;;;39743:18;;:::i;:::-;39707:56;39781:29;39803:6;39781:29;:::i;:::-;39773:37;;39865:4;39859;39855:15;39847:23;;39570:307;;;:::o;39883:308::-;39945:4;40035:18;40027:6;40024:30;40021:56;;;40057:18;;:::i;:::-;40021:56;40095:29;40117:6;40095:29;:::i;:::-;40087:37;;40179:4;40173;40169:15;40161:23;;39883:308;;;:::o;40197:132::-;40264:4;40287:3;40279:11;;40317:4;40312:3;40308:14;40300:22;;40197:132;;;:::o;40335:114::-;40402:6;40436:5;40430:12;40420:22;;40335:114;;;:::o;40455:98::-;40506:6;40540:5;40534:12;40524:22;;40455:98;;;:::o;40559:99::-;40611:6;40645:5;40639:12;40629:22;;40559:99;;;:::o;40664:113::-;40734:4;40766;40761:3;40757:14;40749:22;;40664:113;;;:::o;40783:184::-;40882:11;40916:6;40911:3;40904:19;40956:4;40951:3;40947:14;40932:29;;40783:184;;;;:::o;40973:168::-;41056:11;41090:6;41085:3;41078:19;41130:4;41125:3;41121:14;41106:29;;40973:168;;;;:::o;41147:147::-;41248:11;41285:3;41270:18;;41147:147;;;;:::o;41300:169::-;41384:11;41418:6;41413:3;41406:19;41458:4;41453:3;41449:14;41434:29;;41300:169;;;;:::o;41475:148::-;41577:11;41614:3;41599:18;;41475:148;;;;:::o;41629:305::-;41669:3;41688:20;41706:1;41688:20;:::i;:::-;41683:25;;41722:20;41740:1;41722:20;:::i;:::-;41717:25;;41876:1;41808:66;41804:74;41801:1;41798:81;41795:107;;;41882:18;;:::i;:::-;41795:107;41926:1;41923;41919:9;41912:16;;41629:305;;;;:::o;41940:96::-;41977:7;42006:24;42024:5;42006:24;:::i;:::-;41995:35;;41940:96;;;:::o;42042:90::-;42076:7;42119:5;42112:13;42105:21;42094:32;;42042:90;;;:::o;42138:77::-;42175:7;42204:5;42193:16;;42138:77;;;:::o;42221:149::-;42257:7;42297:66;42290:5;42286:78;42275:89;;42221:149;;;:::o;42376:126::-;42413:7;42453:42;42446:5;42442:54;42431:65;;42376:126;;;:::o;42508:77::-;42545:7;42574:5;42563:16;;42508:77;;;:::o;42591:86::-;42626:7;42666:4;42659:5;42655:16;42644:27;;42591:86;;;:::o;42683:154::-;42767:6;42762:3;42757;42744:30;42829:1;42820:6;42815:3;42811:16;42804:27;42683:154;;;:::o;42843:307::-;42911:1;42921:113;42935:6;42932:1;42929:13;42921:113;;;43020:1;43015:3;43011:11;43005:18;43001:1;42996:3;42992:11;42985:39;42957:2;42954:1;42950:10;42945:15;;42921:113;;;43052:6;43049:1;43046:13;43043:101;;;43132:1;43123:6;43118:3;43114:16;43107:27;43043:101;42892:258;42843:307;;;:::o;43156:320::-;43200:6;43237:1;43231:4;43227:12;43217:22;;43284:1;43278:4;43274:12;43305:18;43295:81;;43361:4;43353:6;43349:17;43339:27;;43295:81;43423:2;43415:6;43412:14;43392:18;43389:38;43386:84;;;43442:18;;:::i;:::-;43386:84;43207:269;43156:320;;;:::o;43482:281::-;43565:27;43587:4;43565:27;:::i;:::-;43557:6;43553:40;43695:6;43683:10;43680:22;43659:18;43647:10;43644:34;43641:62;43638:88;;;43706:18;;:::i;:::-;43638:88;43746:10;43742:2;43735:22;43525:238;43482:281;;:::o;43769:233::-;43808:3;43831:24;43849:5;43831:24;:::i;:::-;43822:33;;43877:66;43870:5;43867:77;43864:103;;;43947:18;;:::i;:::-;43864:103;43994:1;43987:5;43983:13;43976:20;;43769:233;;;:::o;44008:100::-;44047:7;44076:26;44096:5;44076:26;:::i;:::-;44065:37;;44008:100;;;:::o;44114:79::-;44153:7;44182:5;44171:16;;44114:79;;;:::o;44199:94::-;44238:7;44267:20;44281:5;44267:20;:::i;:::-;44256:31;;44199:94;;;:::o;44299:180::-;44347:77;44344:1;44337:88;44444:4;44441:1;44434:15;44468:4;44465:1;44458:15;44485:180;44533:77;44530:1;44523:88;44630:4;44627:1;44620:15;44654:4;44651:1;44644:15;44671:180;44719:77;44716:1;44709:88;44816:4;44813:1;44806:15;44840:4;44837:1;44830:15;44857:180;44905:77;44902:1;44895:88;45002:4;44999:1;44992:15;45026:4;45023:1;45016:15;45043:180;45091:77;45088:1;45081:88;45188:4;45185:1;45178:15;45212:4;45209:1;45202:15;45229:183;45264:3;45302:1;45284:16;45281:23;45278:128;;;45340:1;45337;45334;45319:23;45362:34;45393:1;45387:8;45362:34;:::i;:::-;45355:41;;45278:128;45229:183;:::o;45418:117::-;45527:1;45524;45517:12;45541:117;45650:1;45647;45640:12;45664:117;45773:1;45770;45763:12;45787:117;45896:1;45893;45886:12;45910:117;46019:1;46016;46009:12;46033:102;46074:6;46125:2;46121:7;46116:2;46109:5;46105:14;46101:28;46091:38;;46033:102;;;:::o;46141:94::-;46174:8;46222:5;46218:2;46214:14;46193:35;;46141:94;;;:::o;46241:106::-;46285:8;46334:5;46329:3;46325:15;46304:36;;46241:106;;;:::o;46353:174::-;46493:26;46489:1;46481:6;46477:14;46470:50;46353:174;:::o;46533:239::-;46673:34;46669:1;46661:6;46657:14;46650:58;46742:22;46737:2;46729:6;46725:15;46718:47;46533:239;:::o;46778:227::-;46918:34;46914:1;46906:6;46902:14;46895:58;46987:10;46982:2;46974:6;46970:15;46963:35;46778:227;:::o;47011:181::-;47151:33;47147:1;47139:6;47135:14;47128:57;47011:181;:::o;47198:214::-;47338:66;47334:1;47326:6;47322:14;47315:90;47198:214;:::o;47418:230::-;47558:34;47554:1;47546:6;47542:14;47535:58;47627:13;47622:2;47614:6;47610:15;47603:38;47418:230;:::o;47654:225::-;47794:34;47790:1;47782:6;47778:14;47771:58;47863:8;47858:2;47850:6;47846:15;47839:33;47654:225;:::o;47885:182::-;48025:34;48021:1;48013:6;48009:14;48002:58;47885:182;:::o;48073:172::-;48213:24;48209:1;48201:6;48197:14;48190:48;48073:172;:::o;48251:228::-;48391:34;48387:1;48379:6;48375:14;48368:58;48460:11;48455:2;48447:6;48443:15;48436:36;48251:228;:::o;48485:168::-;48625:20;48621:1;48613:6;48609:14;48602:44;48485:168;:::o;48659:167::-;48799:19;48795:1;48787:6;48783:14;48776:43;48659:167;:::o;48832:221::-;48972:34;48968:1;48960:6;48956:14;48949:58;49041:4;49036:2;49028:6;49024:15;49017:29;48832:221;:::o;49059:224::-;49199:34;49195:1;49187:6;49183:14;49176:58;49268:7;49263:2;49255:6;49251:15;49244:32;49059:224;:::o;49289:237::-;49429:34;49425:1;49417:6;49413:14;49406:58;49498:20;49493:2;49485:6;49481:15;49474:45;49289:237;:::o;49532:221::-;49672:34;49668:1;49660:6;49656:14;49649:58;49741:4;49736:2;49728:6;49724:15;49717:29;49532:221;:::o;49759:229::-;49899:34;49895:1;49887:6;49883:14;49876:58;49968:12;49963:2;49955:6;49951:15;49944:37;49759:229;:::o;49994:182::-;50134:34;50130:1;50122:6;50118:14;50111:58;49994:182;:::o;50182:228::-;50322:34;50318:1;50310:6;50306:14;50299:58;50391:11;50386:2;50378:6;50374:15;50367:36;50182:228;:::o;50416:::-;50556:34;50552:1;50544:6;50540:14;50533:58;50625:11;50620:2;50612:6;50608:15;50601:36;50416:228;:::o;50650:227::-;50790:34;50786:1;50778:6;50774:14;50767:58;50859:10;50854:2;50846:6;50842:15;50835:35;50650:227;:::o;50883:220::-;51023:34;51019:1;51011:6;51007:14;51000:58;51092:3;51087:2;51079:6;51075:15;51068:28;50883:220;:::o;51109:181::-;51249:33;51245:1;51237:6;51233:14;51226:57;51109:181;:::o;51296:711::-;51335:3;51373:4;51355:16;51352:26;51349:39;;;51381:5;;51349:39;51410:20;;:::i;:::-;51485:1;51467:16;51463:24;51460:1;51454:4;51439:49;51518:4;51512:11;51617:16;51610:4;51602:6;51598:17;51595:39;51562:18;51554:6;51551:30;51535:113;51532:146;;;51663:5;;;;51532:146;51709:6;51703:4;51699:17;51745:3;51739:10;51772:18;51764:6;51761:30;51758:43;;;51794:5;;;;;;51758:43;51842:6;51835:4;51830:3;51826:14;51822:27;51901:1;51883:16;51879:24;51873:4;51869:35;51864:3;51861:44;51858:57;;;51908:5;;;;;;;51858:57;51925;51973:6;51967:4;51963:17;51955:6;51951:30;51945:4;51925:57;:::i;:::-;51998:3;51991:10;;51339:668;;;;;51296:711;;:::o;52013:122::-;52086:24;52104:5;52086:24;:::i;:::-;52079:5;52076:35;52066:63;;52125:1;52122;52115:12;52066:63;52013:122;:::o;52141:116::-;52211:21;52226:5;52211:21;:::i;:::-;52204:5;52201:32;52191:60;;52247:1;52244;52237:12;52191:60;52141:116;:::o;52263:120::-;52335:23;52352:5;52335:23;:::i;:::-;52328:5;52325:34;52315:62;;52373:1;52370;52363:12;52315:62;52263:120;:::o;52389:122::-;52462:24;52480:5;52462:24;:::i;:::-;52455:5;52452:35;52442:63;;52501:1;52498;52491:12;52442:63;52389:122;:::o

Swarm Source

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