ETH Price: $3,915.55 (-0.47%)

Token

CREEK Plus Membership (CREEKPLUS)
 

Overview

Max Total Supply

110 CREEKPLUS

Holders

74

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 CREEKPLUS
0x2345ce86d9c9cab4068197f88ff8022bd29c4c0d
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:
CreekMembership

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-23
*/

// 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/Counters.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @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/Context.sol


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/EIP712Whitelisting.sol

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.7;



contract EIP712Whitelisting is Ownable {
  using ECDSA for bytes32;

  address whitelistSigningKey = address(0);

  bytes32 public PREMIUM_DOMAIN;
  bytes32 public VIP_DOMAIN;
  bytes32 public DISCOUNT_DOMAIN;
  bytes32 public PROMO_DOMAIN;
  bytes32 public FREE_DOMAIN;
  bytes32 public constant MINTER_TYPEHASH = keccak256("Minter(address wallet)");
  bytes32 public constant DOMAIN_HEADER =
    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");

  bool public redemptionActive;

  enum MintType {PREMIUM, VIP, DISCOUNT, RESERVED, PROMO, FREE}

  constructor() {
    PREMIUM_DOMAIN = setDomain("PREMIUM", "1");
    VIP_DOMAIN = setDomain("VIP", "1");
    DISCOUNT_DOMAIN = setDomain("DISCOUNT", "1");
    PROMO_DOMAIN = setDomain("PROMO", "1");
    FREE_DOMAIN = setDomain("FREE", "1");
    redemptionActive = false;
  }

  function setDomain(string memory _name, string memory _version) internal view returns (bytes32) {
    return
      keccak256(
        abi.encode(
          DOMAIN_HEADER,
          keccak256(bytes(_name)),
          keccak256(bytes(_version)),
          block.chainid,
          address(this)
        )
      );
  }

  function setSigningAddress(address newSigningKey) public onlyOwner {
    whitelistSigningKey = newSigningKey;
    setRedemptionActive(true);
  }

  function setRedemptionActive(bool _redemptionState) public onlyOwner {
    require(whitelistSigningKey != address(0), "SIGNING KEY NOT SET");
    redemptionActive = _redemptionState;
  }

  modifier requiresSignature(bytes calldata _signature, MintType _mintType) {
    require(whitelistSigningKey != address(0), "SIGNING KEY NOT SET");

    bytes32 domain;

    if (_mintType == MintType.FREE || _mintType == MintType.PROMO) {
      require(redemptionActive, "REDEMPTIONS ARE NOT ACTIVE");
    }

    if (_mintType == MintType.FREE) {
      domain = FREE_DOMAIN;
    } else if (_mintType == MintType.PROMO) {
      domain = PROMO_DOMAIN;
    } else if (_mintType == MintType.VIP) {
      domain = VIP_DOMAIN;
    } else if (_mintType == MintType.DISCOUNT) {
      domain = DISCOUNT_DOMAIN;
    } else {
      domain = PREMIUM_DOMAIN;
    }

    bytes32 digest =
      keccak256(abi.encodePacked("\x19\x01", domain, keccak256(abi.encode(MINTER_TYPEHASH, msg.sender))));

    address recoveredAddress = digest.recover(_signature);

    require(recoveredAddress == whitelistSigningKey, "INVALID SIGNATURE");

    _;
  }
}
// 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/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// 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/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

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


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

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @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, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

// File: contracts/CreekMembership.sol


// Amended by CREEK

pragma solidity ^0.8.7;






contract CreekMembership is ERC721, ReentrancyGuard, Ownable, EIP712Whitelisting {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private premiumIssued;
  Counters.Counter private vipIssued;
  Counters.Counter private reservedIssued;
  Counters.Counter private promoIssued;
  Counters.Counter private freeIssued;

  string public uriPrefix;
  string public uriSuffix;
  string public contractURI;

  //  Contract Creation
  uint256 public immutable createdOn;

  //  Supply Limits
  uint256 public constant totalSupply = 110;
  uint256 public constant MAX_PREMIUM_SUPPLY = 100;
  uint256 public constant MAX_VIP_SUPPLY = 10;
  uint256 public maxReservedSupply = 10;
  uint256 public maxFreeSupply = 15;
  uint256 public maxPromoSupply = 10;

  //  Pricing
  uint256 public premiumCost = 0.02 ether;
  uint256 public vipCost = 0.5 ether;
  uint256 public discountCost = 0.015 ether;

  //  Max Per Wallet
  uint256 public maxPremiumPerWallet = 3;
  uint256 public maxOtherPerWallet = 1;
  uint256 public immutable giveawaySecs;

  //  Contract Minting State
  bool public paused = false;
  bool public giveawayIssued = false;

  constructor(uint256 _totalGiveawaySeconds)
    ERC721("CREEK Plus Membership", "CREEKPLUS")
    EIP712Whitelisting()
  {
    uriPrefix = "https://ipfs.creekdrops.io/ipfs/QmdK8GWmEevLjnMSYKaZHGhCAGFn4bk1UjoTHjzjQyh2fB/";
    uriSuffix = ".json";
    contractURI = "https://creekdrops.io/creek-plus.json/";

    createdOn = block.timestamp;
    giveawaySecs = _totalGiveawaySeconds;
  }

  //=======================================//
  //  Set mint price
  //======================================//
  function costToMint(uint256 _mintAmount, MintType _mintType) internal view returns (uint256) {
    if (_mintType == MintType.DISCOUNT) {
      return discountCost * _mintAmount;
    } else if (_mintType == MintType.VIP) {
      return vipCost * _mintAmount;
    } else if (_mintType == MintType.PREMIUM) {
      return premiumCost * _mintAmount;
    } else {
      return 0;
    }
  }

  //=======================================//
  //  Max assets per wallet
  //======================================//
  //  Mappings for payable mints
  mapping(address => uint256) private premiumMintCountMap;
  mapping(address => uint256) private vipMintCountMap;

  //  Mappings for free mints
  mapping(address => uint256) private freeMintCountMap;
  mapping(address => uint256) private promoMintCountMap;
  mapping(address => uint256) private reservedMintCountMap;

  //  Ensure that user cannot mint more than is allowed per wallet in single TX.
  function maxPaidPerTx(MintType _mintType) internal view returns (uint256) {
    if (_mintType == MintType.PREMIUM || _mintType == MintType.DISCOUNT) {
      return maxPremiumPerWallet;
    }
    return maxOtherPerWallet;
  }

  //  Ensure that user cannot mint more than is allowed per wallet.
  function allowedMintCount(address _to, MintType _mintType) public view returns (uint256) {
    uint256 _maxPremium = maxPremiumPerWallet;
    uint256 _maxOther = maxOtherPerWallet;
    if (_mintType == MintType.PREMIUM || _mintType == MintType.DISCOUNT) {
      return _maxPremium - premiumMintCountMap[_to];
    } else if (_mintType == MintType.VIP) {
      return _maxOther - vipMintCountMap[_to];
    } else if (_mintType == MintType.PROMO) {
      return _maxOther - promoMintCountMap[_to];
    } else if (_mintType == MintType.RESERVED) {
      return _maxOther - reservedMintCountMap[_to];
    }
    return _maxOther - freeMintCountMap[_to];
  }

  function supplyIssued(MintType _mintType) external view returns (uint256) {
    if (_mintType == MintType.VIP) {
      return vipIssued.current();
    } else if (_mintType == MintType.RESERVED) {
      return reservedIssued.current();
    } else if (_mintType == MintType.FREE) {
      return freeIssued.current();
    } else if (_mintType == MintType.PROMO) {
      return promoIssued.current();
    } else if (_mintType == MintType.PREMIUM) {
      return premiumIssued.current();
    } else {
      return 0;
    }
  }

  function availableSupply(MintType _mintType) public view returns (uint256) {
    if (_mintType == MintType.VIP) {
      return MAX_VIP_SUPPLY - vipIssued.current();
    } else if (_mintType == MintType.RESERVED) {
      return maxReservedSupply - reservedIssued.current();
    } else if (_mintType == MintType.FREE) {
      return maxFreeSupply - freeIssued.current();
    } else if (_mintType == MintType.PROMO) {
      return maxPromoSupply - promoIssued.current();
    }
    return MAX_PREMIUM_SUPPLY - maxReservedSupply - maxFreeSupply - maxPromoSupply - premiumIssued.current();
  }

  //=======================================//
  //  Mint Functions
  //======================================//

  function incrementMint(address _to, MintType _mintType) private {
    if (_mintType == MintType.PREMIUM || _mintType == MintType.DISCOUNT) {
      premiumIssued.increment();
      premiumMintCountMap[_to] += 1;
    } else if (_mintType == MintType.VIP) {
      vipIssued.increment();
      vipMintCountMap[_to] += 1;
    } else if (_mintType == MintType.PROMO) {
      promoIssued.increment();
      promoMintCountMap[_to] += 1;
      premiumMintCountMap[_to] += 1;
    } else if (_mintType == MintType.FREE) {
      freeIssued.increment();
      freeMintCountMap[_to] += 1;
      premiumMintCountMap[_to] += 1;
    } else if (_mintType == MintType.RESERVED) {
      reservedIssued.increment();
      reservedMintCountMap[_to] += 1;
      premiumMintCountMap[_to] += 1;
    }
  }

  function currentMintId(MintType _mintType) internal view returns (uint256) {
    if (_mintType == MintType.VIP) {
      return MAX_PREMIUM_SUPPLY + vipIssued.current();
    }
    return premiumIssued.current() + promoIssued.current() + freeIssued.current() + reservedIssued.current();
  }

  function _mintLoop(
    address _to,
    uint256 _mintAmount,
    MintType _mintType
  ) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      incrementMint(_to, _mintType);
      _safeMint(_to, currentMintId(_mintType));
    }
  }

  function isHolder(address _owner, MintType _mintType) external view returns (bool) {
    uint256 id;
    uint256 max;

    if (_mintType == MintType.PREMIUM) {
      id = 1;
      max = 100;
    } else if (_mintType == MintType.VIP) {
      id = 101;
      max = 110;
    } else {
      revert("INVALID MINT TYPE");
    }
    while (id <= max) {
      if (ownerOf(id) == _owner) {
        return true;
      } else {
        id++;
      }
    }
    return false;
  }

  function mintToAddress(address _to) public onlyOwner {
    require(allowedMintCount(_to, MintType.RESERVED) > 0, "MINT LIMIT REACHED");
    require(availableSupply(MintType.RESERVED) > 0, "NONE AVAILABLE");
    _mintLoop(_to, 1, MintType.RESERVED);
  }

  function mint(
    uint256 _mintAmount,
    MintType _mintType,
    bytes calldata signature
  ) public payable requiresSignature(signature, _mintType) nonReentrant {
    require(!paused, "CONTRACT IS PAUSED");
    require(_mintAmount <= maxPaidPerTx(_mintType), "EXCEEDS PER TX LIMIT");
    require(allowedMintCount(msg.sender, _mintType) >= _mintAmount, "MINT LIMIT REACHED");
    require(availableSupply(_mintType) >= _mintAmount, "NOT ENOUGH AVAILABLE");
    require(tx.origin == msg.sender, "CUSTOM CONTRACT MINTING NOT ALLOWED");
    require(msg.value >= costToMint(_mintAmount, _mintType), "INSUFFICIENT FUNDS");
    _mintLoop(msg.sender, _mintAmount, _mintType);
  }

  //=======================================//
  /** URI Functions **/
  //======================================//

  function _baseURI() internal view virtual override returns (string memory) {
    return uriPrefix;
  }

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");

    string memory currentBaseURI = _baseURI();
    return
      bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : "";
  }

  //=======================================//
  /** UPDATE CONTRACT **/
  //======================================//

  function setCost(MintType _mintType, uint256 _cost) external onlyOwner {
    require(
      _mintType == MintType.PREMIUM || _mintType == MintType.VIP || _mintType == MintType.DISCOUNT,
      "Invalid mint type"
    );
    if (_mintType == MintType.PREMIUM) {
      premiumCost = _cost;
    } else if (_mintType == MintType.VIP) {
      vipCost = _cost;
    } else {
      discountCost = _cost;
    }
  }

  function setMaxPerWallet(MintType _mintType, uint256 _max) external onlyOwner {
    _mintType == MintType.PREMIUM ? maxPremiumPerWallet = _max : maxOtherPerWallet = _max;
  }

  function setUriPrefix(string memory _uriPrefix) external onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) external onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setContractUri(string memory _uri) external onlyOwner {
    contractURI = _uri;
  }

  function togglePaused() external onlyOwner {
    paused = !paused;
  }

  function disableRedemption() external onlyOwner {
    setRedemptionActive(false);
    maxPromoSupply = promoIssued.current();
    maxFreeSupply = freeIssued.current();
  }

  //  Will transfer 10% of the initial sale revenue to a single token holder
  function gibs(uint256 _tokenId) public onlyOwner {
    require(
      block.timestamp >= createdOn + giveawaySecs ||
        (availableSupply(MintType.VIP) == 0 && availableSupply(MintType.PREMIUM) == 0),
      "CANNOT BE CALLED YET"
    );
    address winrar = ownerOf(_tokenId);

    (bool _winrar, ) = payable(winrar).call{value: (address(this).balance * 10) / 100}("");
    giveawayIssued = true;
    require(_winrar);
  }

  //  Withdraws the remaining balance to the owners address.
  function withdraw() public onlyOwner {
    require(giveawayIssued, "ISSUE GIVEAWAY FIRST");
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_totalGiveawaySeconds","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DISCOUNT_DOMAIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_HEADER","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_DOMAIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PREMIUM_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_VIP_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PREMIUM_DOMAIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROMO_DOMAIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VIP_DOMAIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"enum EIP712Whitelisting.MintType","name":"_mintType","type":"uint8"}],"name":"allowedMintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum EIP712Whitelisting.MintType","name":"_mintType","type":"uint8"}],"name":"availableSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"createdOn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableRedemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"discountCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"gibs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"giveawayIssued","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawaySecs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"enum EIP712Whitelisting.MintType","name":"_mintType","type":"uint8"}],"name":"isHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxOtherPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPremiumPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPromoSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReservedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"enum EIP712Whitelisting.MintType","name":"_mintType","type":"uint8"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"premiumCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"redemptionActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setContractUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum EIP712Whitelisting.MintType","name":"_mintType","type":"uint8"},{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum EIP712Whitelisting.MintType","name":"_mintType","type":"uint8"},{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_redemptionState","type":"bool"}],"name":"setRedemptionActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigningKey","type":"address"}],"name":"setSigningAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum EIP712Whitelisting.MintType","name":"_mintType","type":"uint8"}],"name":"supplyIssued","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vipCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c0604052600880546001600160a01b0319169055600a6017819055600f60185560195566470de4df820000601a556706f05b59d3b20000601b5566354a6ba7a18000601c556003601d556001601e55601f805461ffff191690553480156200006757600080fd5b5060405162003e1a38038062003e1a8339810160408190526200008a91620005ae565b604080518082018252601581527f435245454b20506c7573204d656d626572736869700000000000000000000000602080830191825283518085019094526009845268435245454b504c555360b81b908401528151919291620000f09160009162000508565b5080516200010690600190602084019062000508565b5050600160065550620001193362000455565b62000163604051806040016040528060078152602001665052454d49554d60c81b815250604051806040016040528060018152602001603160f81b815250620004a760201b60201c565b600955604080518082018252600381526205649560ec1b60208083019182528351808501855260018152603160f81b9082015291519020825160008051602062003dfa833981519152818401528084019190915260008051602062003d6583398151915260608201524660808201523060a0808301919091528351808303909101815260c09091019092528151910120600a556040805180820182526008815267111254d0d3d5539560c21b60208083019182528351808501855260018152603160f81b9082015291519020825160008051602062003dfa833981519152818401528084019190915260008051602062003d6583398151915260608201524660808201523060a0808301919091528351808303909101815260c09091019092528151910120600b55604080518082018252600581526450524f4d4f60d81b60208083019182528351808501855260018152603160f81b9082015291519020825160008051602062003dfa833981519152818401528084019190915260008051602062003d6583398151915260608201524660808201523060a0808301919091528351808303909101815260c09091019092528151910120600c5560408051808201825260048152634652454560e01b60208083019182528351808501855260018152603160f81b9082015291519020825160008051602062003dfa833981519152818401528084019190915260008051602062003d6583398151915260608201524660808201523060a0808301919091528351808303909101815260c09091019092528151910120600d55600e805460ff191690556040805160808101909152604f80825262003d8560208301398051620003e79160149160209091019062000508565b5060408051808201909152600580825264173539b7b760d91b6020909201918252620004169160159162000508565b5060405180606001604052806026815260200162003dd4602691398051620004479160169160209091019062000508565b504260805260a05262000605565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b81516020928301208151918301919091206040805160008051602062003dfa833981519152818601528082019390935260608301919091524660808301523060a0808401919091528151808403909101815260c09092019052805191012090565b8280546200051690620005c8565b90600052602060002090601f0160209004810192826200053a576000855562000585565b82601f106200055557805160ff191683800117855562000585565b8280016001018555821562000585579182015b828111156200058557825182559160200191906001019062000568565b506200059392915062000597565b5090565b5b8082111562000593576000815560010162000598565b600060208284031215620005c157600080fd5b5051919050565b600181811c90821680620005dd57607f821691505b60208210811415620005ff57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05161372c620006396000396000818161078c0152610e320152600081816108480152610e53015261372c6000f3fe60806040526004361061038c5760003560e01c80636352211e116101dc578063bba64ab411610102578063dd08b5c9116100a0578063effc4d771161006f578063effc4d7714610a08578063f2fde38b14610a1e578063fa4d280c14610a3e578063ffd4aa5514610a7257600080fd5b8063dd08b5c914610975578063dfa36fdd1461098a578063e8a3d485146109aa578063e985e9c5146109bf57600080fd5b8063c87b56dd116100dc578063c87b56dd14610902578063ccb4807b14610922578063cd9967fe14610942578063d0c801d51461096257600080fd5b8063bba64ab4146108c0578063c1333729146108d6578063c1fad42c146108ec57600080fd5b80638bf5ae901161017a5780639f2ce594116101495780639f2ce59414610836578063a22cb4651461086a578063a7cc6dfb1461088a578063b88d4fde146108a057600080fd5b80638bf5ae90146107ce5780638da5cb5b146107e357806395d89b4114610801578063967095051461081657600080fd5b8063715018a6116101b6578063715018a6146107455780637ec4a6591461075a578063882caf371461077a5780638a726a57146107ae57600080fd5b80636352211e146106ef5780636e63ce621461070f57806370a082311461072557600080fd5b806336566f06116102c15780634975f1f31161025f5780635531940e1161022e5780635531940e146106945780635c975abb146106aa5780635ec2f5ac146106c457806362b99ad4146106da57600080fd5b80634975f1f31461063a5780634e0bb07e146106505780634ecc1f77146106655780635503a0e81461067f57600080fd5b8063420087601161029b57806342008760146105b057806342842e0e146105e45780634751333414610604578063489999d11461061a57600080fd5b806336566f06146105675780633ccfd60b1461057c5780633cd884901461059157600080fd5b80630f1c5e401161032e5780631825ffbf116103085780631825ffbf146104f15780631c3459a21461050757806323b872dd1461052757806331beb6051461054757600080fd5b80630f1c5e40146104a657806316ba10e0146104bc57806318160ddd146104dc57600080fd5b8063095ea7b31161036a578063095ea7b314610420578063097ef40f146104425780630d85890c146104705780630ea854d11461049057600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac366004613208565b610a92565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610ae4565b6040516103bd919061348f565b3480156103f457600080fd5b506104086104033660046132c2565b610b76565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b3660046131c3565b610c10565b005b34801561044e57600080fd5b5061046261045d366004613242565b610d26565b6040519081526020016103bd565b34801561047c57600080fd5b5061044061048b3660046132c2565b610e03565b34801561049c57600080fd5b50610462601d5481565b3480156104b257600080fd5b50610462601a5481565b3480156104c857600080fd5b506104406104d7366004613279565b610f6f565b3480156104e857600080fd5b50610462606e81565b3480156104fd57600080fd5b50610462601e5481565b34801561051357600080fd5b5061044061052236600461325d565b610fb0565b34801561053357600080fd5b506104406105423660046130b7565b6110ad565b34801561055357600080fd5b50610440610562366004613069565b6110de565b34801561057357600080fd5b50610440611130565b34801561058857600080fd5b5061044061116e565b34801561059d57600080fd5b50601f546103b190610100900460ff1681565b3480156105bc57600080fd5b506104627f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b3480156105f057600080fd5b506104406105ff3660046130b7565b611257565b34801561061057600080fd5b5061046260185481565b34801561062657600080fd5b50610462610635366004613242565b611272565b34801561064657600080fd5b50610462600b5481565b34801561065c57600080fd5b50610462606481565b34801561067157600080fd5b50600e546103b19060ff1681565b34801561068b57600080fd5b506103db61132b565b3480156106a057600080fd5b50610462601b5481565b3480156106b657600080fd5b50601f546103b19060ff1681565b3480156106d057600080fd5b5061046260095481565b3480156106e657600080fd5b506103db6113b9565b3480156106fb57600080fd5b5061040861070a3660046132c2565b6113c6565b34801561071b57600080fd5b5061046260195481565b34801561073157600080fd5b50610462610740366004613069565b61143d565b34801561075157600080fd5b506104406114c4565b34801561076657600080fd5b50610440610775366004613279565b6114fa565b34801561078657600080fd5b506104627f000000000000000000000000000000000000000000000000000000000000000081565b3480156107ba57600080fd5b506104406107c93660046131ed565b611537565b3480156107da57600080fd5b50610462600a81565b3480156107ef57600080fd5b506007546001600160a01b0316610408565b34801561080d57600080fd5b506103db6115c2565b34801561082257600080fd5b506103b1610831366004613199565b6115d1565b34801561084257600080fd5b506104627f000000000000000000000000000000000000000000000000000000000000000081565b34801561087657600080fd5b5061044061088536600461316f565b6116ad565b34801561089657600080fd5b50610462600c5481565b3480156108ac57600080fd5b506104406108bb3660046130f3565b6116b8565b3480156108cc57600080fd5b50610462601c5481565b3480156108e257600080fd5b50610462600d5481565b3480156108f857600080fd5b5061046260175481565b34801561090e57600080fd5b506103db61091d3660046132c2565b6116f0565b34801561092e57600080fd5b5061044061093d366004613279565b6117ce565b34801561094e57600080fd5b5061046261095d366004613199565b61180b565b6104406109703660046132db565b611958565b34801561098157600080fd5b50610440611e30565b34801561099657600080fd5b506104406109a536600461325d565b611e72565b3480156109b657600080fd5b506103db611ec1565b3480156109cb57600080fd5b506103b16109da366004613084565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a1457600080fd5b50610462600a5481565b348015610a2a57600080fd5b50610440610a39366004613069565b611ece565b348015610a4a57600080fd5b506104627f68e83002b91b0fd96d4df3566b5122221117e3ec6c2468fda594f6491f89b1c981565b348015610a7e57600080fd5b50610440610a8d366004613069565b611f66565b60006001600160e01b031982166380ac58cd60e01b1480610ac357506001600160e01b03198216635b5e139f60e01b145b80610ade57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610af390613608565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1f90613608565b8015610b6c5780601f10610b4157610100808354040283529160200191610b6c565b820191906000526020600020905b815481529060010190602001808311610b4f57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610bf45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c1b826113c6565b9050806001600160a01b0316836001600160a01b03161415610c895760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610beb565b336001600160a01b0382161480610ca55750610ca581336109da565b610d175760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610beb565b610d218383612036565b505050565b60006001826005811115610d3c57610d3c61369e565b1415610d5057601054610ade90600a6135c5565b6003826005811115610d6457610d6461369e565b1415610d7a57601154601754610ade91906135c5565b6005826005811115610d8e57610d8e61369e565b1415610da457601354601854610ade91906135c5565b6004826005811115610db857610db861369e565b1415610dce57601254601954610ade91906135c5565b600f54601954601854601754610de59060646135c5565b610def91906135c5565b610df991906135c5565b610ade91906135c5565b6007546001600160a01b03163314610e2d5760405162461bcd60e51b8152600401610beb906134f4565b610e777f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061357a565b42101580610e9e5750610e8a6001610d26565b158015610e9e5750610e9c6000610d26565b155b610ee15760405162461bcd60e51b815260206004820152601460248201527310d0539393d50810914810d0531311510816515560621b6044820152606401610beb565b6000610eec826113c6565b905060006001600160a01b0382166064610f0747600a6135a6565b610f119190613592565b604051600081818185875af1925050503d8060008114610f4d576040519150601f19603f3d011682016040523d82523d6000602084013e610f52565b606091505b5050601f805461ff001916610100179055905080610d2157600080fd5b6007546001600160a01b03163314610f995760405162461bcd60e51b8152600401610beb906134f4565b8051610fac906015906020840190612f24565b5050565b6007546001600160a01b03163314610fda5760405162461bcd60e51b8152600401610beb906134f4565b6000826005811115610fee57610fee61369e565b148061100b575060018260058111156110095761100961369e565b145b80611027575060028260058111156110255761102561369e565b145b6110675760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964206d696e74207479706560781b6044820152606401610beb565b600082600581111561107b5761107b61369e565b141561108757601a5550565b600182600581111561109b5761109b61369e565b14156110a757601b5550565b601c5550565b6110b733826120a4565b6110d35760405162461bcd60e51b8152600401610beb90613529565b610d2183838361219b565b6007546001600160a01b031633146111085760405162461bcd60e51b8152600401610beb906134f4565b600880546001600160a01b0319166001600160a01b03831617905561112d6001611537565b50565b6007546001600160a01b0316331461115a5760405162461bcd60e51b8152600401610beb906134f4565b601f805460ff19811660ff90911615179055565b6007546001600160a01b031633146111985760405162461bcd60e51b8152600401610beb906134f4565b601f54610100900460ff166111e65760405162461bcd60e51b81526020600482015260146024820152731254d4d5514811d255915055d0564811925494d560621b6044820152606401610beb565b60006111fa6007546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611244576040519150601f19603f3d011682016040523d82523d6000602084013e611249565b606091505b505090508061112d57600080fd5b610d21838383604051806020016040528060008152506116b8565b600060018260058111156112885761128861369e565b141561129657601054610ade565b60038260058111156112aa576112aa61369e565b14156112b857601154610ade565b60058260058111156112cc576112cc61369e565b14156112da57601354610ade565b60048260058111156112ee576112ee61369e565b14156112fc57601254610ade565b60008260058111156113105761131061369e565b141561131e57600f54610ade565b506000919050565b919050565b6015805461133890613608565b80601f016020809104026020016040519081016040528092919081815260200182805461136490613608565b80156113b15780601f10611386576101008083540402835291602001916113b1565b820191906000526020600020905b81548152906001019060200180831161139457829003601f168201915b505050505081565b6014805461133890613608565b6000818152600260205260408120546001600160a01b031680610ade5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610beb565b60006001600160a01b0382166114a85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610beb565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b031633146114ee5760405162461bcd60e51b8152600401610beb906134f4565b6114f86000612337565b565b6007546001600160a01b031633146115245760405162461bcd60e51b8152600401610beb906134f4565b8051610fac906014906020840190612f24565b6007546001600160a01b031633146115615760405162461bcd60e51b8152600401610beb906134f4565b6008546001600160a01b03166115af5760405162461bcd60e51b815260206004820152601360248201527214d251d3925391c812d156481393d50814d155606a1b6044820152606401610beb565b600e805460ff1916911515919091179055565b606060018054610af390613608565b60008080808460058111156115e8576115e861369e565b14156115fa575060019050606461165c565b600184600581111561160e5761160e61369e565b1415611620575060659050606e61165c565b60405162461bcd60e51b8152602060048201526011602482015270494e56414c4944204d494e54205459504560781b6044820152606401610beb565b8082116116a257846001600160a01b0316611676836113c6565b6001600160a01b0316141561169057600192505050610ade565b8161169a81613643565b92505061165c565b506000949350505050565b610fac338383612389565b6116c233836120a4565b6116de5760405162461bcd60e51b8152600401610beb90613529565b6116ea84848484612458565b50505050565b6000818152600260205260409020546060906001600160a01b031661176f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610beb565b600061177961248b565b9050600081511161179957604051806020016040528060008152506117c7565b806117a38461249a565b60156040516020016117b79392919061338e565b6040516020818303038152906040525b9392505050565b6007546001600160a01b031633146117f85760405162461bcd60e51b8152600401610beb906134f4565b8051610fac906016906020840190612f24565b601d54601e5460009190828460058111156118285761182861369e565b1480611845575060028460058111156118435761184361369e565b145b15611875576001600160a01b038516600090815260208052604090205461186c90836135c5565b92505050610ade565b60018460058111156118895761188961369e565b14156118b2576001600160a01b03851660009081526021602052604090205461186c90826135c5565b60048460058111156118c6576118c661369e565b14156118ef576001600160a01b03851660009081526023602052604090205461186c90826135c5565b60038460058111156119035761190361369e565b141561192c576001600160a01b03851660009081526024602052604090205461186c90826135c5565b6001600160a01b03851660009081526022602052604090205461194f90826135c5565b95945050505050565b6008548290829085906001600160a01b03166119ac5760405162461bcd60e51b815260206004820152601360248201527214d251d3925391c812d156481393d50814d155606a1b6044820152606401610beb565b600060058260058111156119c2576119c261369e565b14806119df575060048260058111156119dd576119dd61369e565b145b15611a3657600e5460ff16611a365760405162461bcd60e51b815260206004820152601a60248201527f524544454d5054494f4e5320415245204e4f54204143544956450000000000006044820152606401610beb565b6005826005811115611a4a57611a4a61369e565b1415611a595750600d54611ac7565b6004826005811115611a6d57611a6d61369e565b1415611a7c5750600c54611ac7565b6001826005811115611a9057611a9061369e565b1415611a9f5750600a54611ac7565b6002826005811115611ab357611ab361369e565b1415611ac25750600b54611ac7565b506009545b604080517f68e83002b91b0fd96d4df3566b5122221117e3ec6c2468fda594f6491f89b1c9602080830191909152338284015282518083038401815260608301909352825192019190912061190160f01b60808301526082820183905260a282015260009060c2016040516020818303038152906040528051906020012090506000611b8b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506125989050565b6008549091506001600160a01b03808316911614611bdf5760405162461bcd60e51b8152602060048201526011602482015270494e56414c4944205349474e415455524560781b6044820152606401610beb565b60026006541415611c325760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610beb565b6002600655601f5460ff1615611c7f5760405162461bcd60e51b815260206004820152601260248201527110d3d395149050d5081254c814105554d15160721b6044820152606401610beb565b611c88896125bc565b8a1115611cce5760405162461bcd60e51b8152602060048201526014602482015273115610d1515114c814115488151608131253525560621b6044820152606401610beb565b89611cd9338b61180b565b1015611d1c5760405162461bcd60e51b8152602060048201526012602482015271135253950813125352550814915050d2115160721b6044820152606401610beb565b89611d268a610d26565b1015611d6b5760405162461bcd60e51b81526020600482015260146024820152734e4f5420454e4f55474820415641494c41424c4560601b6044820152606401610beb565b323314611dc65760405162461bcd60e51b815260206004820152602360248201527f435553544f4d20434f4e5452414354204d494e54494e47204e4f5420414c4c4f60448201526215d15160ea1b6064820152608401610beb565b611dd08a8a612603565b341015611e145760405162461bcd60e51b8152602060048201526012602482015271494e53554646494349454e542046554e445360701b6044820152606401610beb565b611e1f338b8b61268c565b505060016006555050505050505050565b6007546001600160a01b03163314611e5a5760405162461bcd60e51b8152600401610beb906134f4565b611e646000611537565b601254601955601354601855565b6007546001600160a01b03163314611e9c5760405162461bcd60e51b8152600401610beb906134f4565b6000826005811115611eb057611eb061369e565b14611ebb57601e5550565b601d5550565b6016805461133890613608565b6007546001600160a01b03163314611ef85760405162461bcd60e51b8152600401610beb906134f4565b6001600160a01b038116611f5d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610beb565b61112d81612337565b6007546001600160a01b03163314611f905760405162461bcd60e51b8152600401610beb906134f4565b6000611f9d82600361180b565b11611fdf5760405162461bcd60e51b8152602060048201526012602482015271135253950813125352550814915050d2115160721b6044820152606401610beb565b6000611feb6003610d26565b116120295760405162461bcd60e51b815260206004820152600e60248201526d4e4f4e4520415641494c41424c4560901b6044820152606401610beb565b61112d816001600361268c565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061206b826113c6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661211d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610beb565b6000612128836113c6565b9050806001600160a01b0316846001600160a01b031614806121635750836001600160a01b031661215884610b76565b6001600160a01b0316145b8061219357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166121ae826113c6565b6001600160a01b0316146122125760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610beb565b6001600160a01b0382166122745760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610beb565b61227f600082612036565b6001600160a01b03831660009081526003602052604081208054600192906122a89084906135c5565b90915550506001600160a01b03821660009081526003602052604081208054600192906122d690849061357a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156123eb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610beb565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61246384848461219b565b61246f848484846126c5565b6116ea5760405162461bcd60e51b8152600401610beb906134a2565b606060148054610af390613608565b6060816124be5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124e857806124d281613643565b91506124e19050600a83613592565b91506124c2565b60008167ffffffffffffffff811115612503576125036136ca565b6040519080825280601f01601f19166020018201604052801561252d576020820181803683370190505b5090505b8415612193576125426001836135c5565b915061254f600a8661365e565b61255a90603061357a565b60f81b81838151811061256f5761256f6136b4565b60200101906001600160f81b031916908160001a905350612591600a86613592565b9450612531565b60008060006125a785856127d2565b915091506125b481612842565b509392505050565b6000808260058111156125d1576125d161369e565b14806125ee575060028260058111156125ec576125ec61369e565b145b156125fb575050601d5490565b5050601e5490565b600060028260058111156126195761261961369e565b14156126345782601c5461262d91906135a6565b9050610ade565b60018260058111156126485761264861369e565b141561265c5782601b5461262d91906135a6565b60008260058111156126705761267061369e565b14156126845782601a5461262d91906135a6565b506000610ade565b60005b828110156116ea576126a184836129fd565b6126b3846126ae84612c1b565b612c6f565b806126bd81613643565b91505061268f565b60006001600160a01b0384163b156127c757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612709903390899088908890600401613452565b602060405180830381600087803b15801561272357600080fd5b505af1925050508015612753575060408051601f3d908101601f1916820190925261275091810190613225565b60015b6127ad573d808015612781576040519150601f19603f3d011682016040523d82523d6000602084013e612786565b606091505b5080516127a55760405162461bcd60e51b8152600401610beb906134a2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612193565b506001949350505050565b6000808251604114156128095760208301516040840151606085015160001a6127fd87828585612c89565b9450945050505061283b565b8251604014156128335760208301516040840151612828868383612d76565b93509350505061283b565b506000905060025b9250929050565b60008160048111156128565761285661369e565b141561285f5750565b60018160048111156128735761287361369e565b14156128c15760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610beb565b60028160048111156128d5576128d561369e565b14156129235760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610beb565b60038160048111156129375761293761369e565b14156129905760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610beb565b60048160048111156129a4576129a461369e565b141561112d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610beb565b6000816005811115612a1157612a1161369e565b1480612a2e57506002816005811115612a2c57612a2c61369e565b145b15612a7457612a41600f80546001019055565b6001600160a01b03821660009081526020805260408120805460019290612a6990849061357a565b90915550610fac9050565b6001816005811115612a8857612a8861369e565b1415612ac557612a9c601080546001019055565b6001600160a01b0382166000908152602160205260408120805460019290612a6990849061357a565b6004816005811115612ad957612ad961369e565b1415612b4357612aed601280546001019055565b6001600160a01b0382166000908152602360205260408120805460019290612b1690849061357a565b90915550506001600160a01b03821660009081526020805260408120805460019290612a6990849061357a565b6005816005811115612b5757612b5761369e565b1415612b9457612b6b601380546001019055565b6001600160a01b0382166000908152602260205260408120805460019290612b1690849061357a565b6003816005811115612ba857612ba861369e565b1415610fac57612bbc601180546001019055565b6001600160a01b0382166000908152602460205260408120805460019290612be590849061357a565b90915550506001600160a01b03821660009081526020805260408120805460019290612c1290849061357a565b90915550505050565b60006001826005811115612c3157612c3161369e565b1415612c4557601054610ade90606461357a565b601154601354601254600f54612c5b919061357a565b612c65919061357a565b610ade919061357a565b610fac828260405180602001604052806000815250612daf565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612cc05750600090506003612d6d565b8460ff16601b14158015612cd857508460ff16601c14155b15612ce95750600090506004612d6d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612d3d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d6657600060019250925050612d6d565b9150600090505b94509492505050565b6000806001600160ff1b03831681612d9360ff86901c601b61357a565b9050612da187828885612c89565b935093505050935093915050565b612db98383612de2565b612dc660008484846126c5565b610d215760405162461bcd60e51b8152600401610beb906134a2565b6001600160a01b038216612e385760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610beb565b6000818152600260205260409020546001600160a01b031615612e9d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610beb565b6001600160a01b0382166000908152600360205260408120805460019290612ec690849061357a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612f3090613608565b90600052602060002090601f016020900481019282612f525760008555612f98565b82601f10612f6b57805160ff1916838001178555612f98565b82800160010185558215612f98579182015b82811115612f98578251825591602001919060010190612f7d565b50612fa4929150612fa8565b5090565b5b80821115612fa45760008155600101612fa9565b600067ffffffffffffffff80841115612fd857612fd86136ca565b604051601f8501601f19908116603f01168101908282118183101715613000576130006136ca565b8160405280935085815286868601111561301957600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461132657600080fd5b8035801515811461132657600080fd5b80356006811061132657600080fd5b60006020828403121561307b57600080fd5b6117c782613033565b6000806040838503121561309757600080fd5b6130a083613033565b91506130ae60208401613033565b90509250929050565b6000806000606084860312156130cc57600080fd5b6130d584613033565b92506130e360208501613033565b9150604084013590509250925092565b6000806000806080858703121561310957600080fd5b61311285613033565b935061312060208601613033565b925060408501359150606085013567ffffffffffffffff81111561314357600080fd5b8501601f8101871361315457600080fd5b61316387823560208401612fbd565b91505092959194509250565b6000806040838503121561318257600080fd5b61318b83613033565b91506130ae6020840161304a565b600080604083850312156131ac57600080fd5b6131b583613033565b91506130ae6020840161305a565b600080604083850312156131d657600080fd5b6131df83613033565b946020939093013593505050565b6000602082840312156131ff57600080fd5b6117c78261304a565b60006020828403121561321a57600080fd5b81356117c7816136e0565b60006020828403121561323757600080fd5b81516117c7816136e0565b60006020828403121561325457600080fd5b6117c78261305a565b6000806040838503121561327057600080fd5b6131df8361305a565b60006020828403121561328b57600080fd5b813567ffffffffffffffff8111156132a257600080fd5b8201601f810184136132b357600080fd5b61219384823560208401612fbd565b6000602082840312156132d457600080fd5b5035919050565b600080600080606085870312156132f157600080fd5b843593506133016020860161305a565b9250604085013567ffffffffffffffff8082111561331e57600080fd5b818701915087601f83011261333257600080fd5b81358181111561334157600080fd5b88602082850101111561335357600080fd5b95989497505060200194505050565b6000815180845261337a8160208601602086016135dc565b601f01601f19169290920160200192915050565b6000845160206133a18285838a016135dc565b8551918401916133b48184848a016135dc565b8554920191600090600181811c90808316806133d157607f831692505b8583108114156133ef57634e487b7160e01b85526022600452602485fd5b808015613403576001811461341457613441565b60ff19851688528388019550613441565b60008b81526020902060005b858110156134395781548a820152908401908801613420565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061348590830184613362565b9695505050505050565b6020815260006117c76020830184613362565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561358d5761358d613672565b500190565b6000826135a1576135a1613688565b500490565b60008160001904831182151516156135c0576135c0613672565b500290565b6000828210156135d7576135d7613672565b500390565b60005b838110156135f75781810151838201526020016135df565b838111156116ea5750506000910152565b600181811c9082168061361c57607f821691505b6020821081141561363d57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561365757613657613672565b5060010190565b60008261366d5761366d613688565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461112d57600080fdfea264697066735822122085a3cb72b3cecbfac644cfbd065f7515b09c420a17d6f32f8158f671224c642e64736f6c63430008070033c89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc668747470733a2f2f697066732e637265656b64726f70732e696f2f697066732f516d644b3847576d4565764c6a6e4d53594b615a484768434147466e34626b31556a6f54486a7a6a5179683266422f68747470733a2f2f637265656b64726f70732e696f2f637265656b2d706c75732e6a736f6e2f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f0000000000000000000000000000000000000000000000000000000000278d00

Deployed Bytecode

0x60806040526004361061038c5760003560e01c80636352211e116101dc578063bba64ab411610102578063dd08b5c9116100a0578063effc4d771161006f578063effc4d7714610a08578063f2fde38b14610a1e578063fa4d280c14610a3e578063ffd4aa5514610a7257600080fd5b8063dd08b5c914610975578063dfa36fdd1461098a578063e8a3d485146109aa578063e985e9c5146109bf57600080fd5b8063c87b56dd116100dc578063c87b56dd14610902578063ccb4807b14610922578063cd9967fe14610942578063d0c801d51461096257600080fd5b8063bba64ab4146108c0578063c1333729146108d6578063c1fad42c146108ec57600080fd5b80638bf5ae901161017a5780639f2ce594116101495780639f2ce59414610836578063a22cb4651461086a578063a7cc6dfb1461088a578063b88d4fde146108a057600080fd5b80638bf5ae90146107ce5780638da5cb5b146107e357806395d89b4114610801578063967095051461081657600080fd5b8063715018a6116101b6578063715018a6146107455780637ec4a6591461075a578063882caf371461077a5780638a726a57146107ae57600080fd5b80636352211e146106ef5780636e63ce621461070f57806370a082311461072557600080fd5b806336566f06116102c15780634975f1f31161025f5780635531940e1161022e5780635531940e146106945780635c975abb146106aa5780635ec2f5ac146106c457806362b99ad4146106da57600080fd5b80634975f1f31461063a5780634e0bb07e146106505780634ecc1f77146106655780635503a0e81461067f57600080fd5b8063420087601161029b57806342008760146105b057806342842e0e146105e45780634751333414610604578063489999d11461061a57600080fd5b806336566f06146105675780633ccfd60b1461057c5780633cd884901461059157600080fd5b80630f1c5e401161032e5780631825ffbf116103085780631825ffbf146104f15780631c3459a21461050757806323b872dd1461052757806331beb6051461054757600080fd5b80630f1c5e40146104a657806316ba10e0146104bc57806318160ddd146104dc57600080fd5b8063095ea7b31161036a578063095ea7b314610420578063097ef40f146104425780630d85890c146104705780630ea854d11461049057600080fd5b806301ffc9a71461039157806306fdde03146103c6578063081812fc146103e8575b600080fd5b34801561039d57600080fd5b506103b16103ac366004613208565b610a92565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103db610ae4565b6040516103bd919061348f565b3480156103f457600080fd5b506104086104033660046132c2565b610b76565b6040516001600160a01b0390911681526020016103bd565b34801561042c57600080fd5b5061044061043b3660046131c3565b610c10565b005b34801561044e57600080fd5b5061046261045d366004613242565b610d26565b6040519081526020016103bd565b34801561047c57600080fd5b5061044061048b3660046132c2565b610e03565b34801561049c57600080fd5b50610462601d5481565b3480156104b257600080fd5b50610462601a5481565b3480156104c857600080fd5b506104406104d7366004613279565b610f6f565b3480156104e857600080fd5b50610462606e81565b3480156104fd57600080fd5b50610462601e5481565b34801561051357600080fd5b5061044061052236600461325d565b610fb0565b34801561053357600080fd5b506104406105423660046130b7565b6110ad565b34801561055357600080fd5b50610440610562366004613069565b6110de565b34801561057357600080fd5b50610440611130565b34801561058857600080fd5b5061044061116e565b34801561059d57600080fd5b50601f546103b190610100900460ff1681565b3480156105bc57600080fd5b506104627f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81565b3480156105f057600080fd5b506104406105ff3660046130b7565b611257565b34801561061057600080fd5b5061046260185481565b34801561062657600080fd5b50610462610635366004613242565b611272565b34801561064657600080fd5b50610462600b5481565b34801561065c57600080fd5b50610462606481565b34801561067157600080fd5b50600e546103b19060ff1681565b34801561068b57600080fd5b506103db61132b565b3480156106a057600080fd5b50610462601b5481565b3480156106b657600080fd5b50601f546103b19060ff1681565b3480156106d057600080fd5b5061046260095481565b3480156106e657600080fd5b506103db6113b9565b3480156106fb57600080fd5b5061040861070a3660046132c2565b6113c6565b34801561071b57600080fd5b5061046260195481565b34801561073157600080fd5b50610462610740366004613069565b61143d565b34801561075157600080fd5b506104406114c4565b34801561076657600080fd5b50610440610775366004613279565b6114fa565b34801561078657600080fd5b506104627f0000000000000000000000000000000000000000000000000000000000278d0081565b3480156107ba57600080fd5b506104406107c93660046131ed565b611537565b3480156107da57600080fd5b50610462600a81565b3480156107ef57600080fd5b506007546001600160a01b0316610408565b34801561080d57600080fd5b506103db6115c2565b34801561082257600080fd5b506103b1610831366004613199565b6115d1565b34801561084257600080fd5b506104627f000000000000000000000000000000000000000000000000000000006211966a81565b34801561087657600080fd5b5061044061088536600461316f565b6116ad565b34801561089657600080fd5b50610462600c5481565b3480156108ac57600080fd5b506104406108bb3660046130f3565b6116b8565b3480156108cc57600080fd5b50610462601c5481565b3480156108e257600080fd5b50610462600d5481565b3480156108f857600080fd5b5061046260175481565b34801561090e57600080fd5b506103db61091d3660046132c2565b6116f0565b34801561092e57600080fd5b5061044061093d366004613279565b6117ce565b34801561094e57600080fd5b5061046261095d366004613199565b61180b565b6104406109703660046132db565b611958565b34801561098157600080fd5b50610440611e30565b34801561099657600080fd5b506104406109a536600461325d565b611e72565b3480156109b657600080fd5b506103db611ec1565b3480156109cb57600080fd5b506103b16109da366004613084565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a1457600080fd5b50610462600a5481565b348015610a2a57600080fd5b50610440610a39366004613069565b611ece565b348015610a4a57600080fd5b506104627f68e83002b91b0fd96d4df3566b5122221117e3ec6c2468fda594f6491f89b1c981565b348015610a7e57600080fd5b50610440610a8d366004613069565b611f66565b60006001600160e01b031982166380ac58cd60e01b1480610ac357506001600160e01b03198216635b5e139f60e01b145b80610ade57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610af390613608565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1f90613608565b8015610b6c5780601f10610b4157610100808354040283529160200191610b6c565b820191906000526020600020905b815481529060010190602001808311610b4f57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610bf45760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610c1b826113c6565b9050806001600160a01b0316836001600160a01b03161415610c895760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610beb565b336001600160a01b0382161480610ca55750610ca581336109da565b610d175760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610beb565b610d218383612036565b505050565b60006001826005811115610d3c57610d3c61369e565b1415610d5057601054610ade90600a6135c5565b6003826005811115610d6457610d6461369e565b1415610d7a57601154601754610ade91906135c5565b6005826005811115610d8e57610d8e61369e565b1415610da457601354601854610ade91906135c5565b6004826005811115610db857610db861369e565b1415610dce57601254601954610ade91906135c5565b600f54601954601854601754610de59060646135c5565b610def91906135c5565b610df991906135c5565b610ade91906135c5565b6007546001600160a01b03163314610e2d5760405162461bcd60e51b8152600401610beb906134f4565b610e777f0000000000000000000000000000000000000000000000000000000000278d007f000000000000000000000000000000000000000000000000000000006211966a61357a565b42101580610e9e5750610e8a6001610d26565b158015610e9e5750610e9c6000610d26565b155b610ee15760405162461bcd60e51b815260206004820152601460248201527310d0539393d50810914810d0531311510816515560621b6044820152606401610beb565b6000610eec826113c6565b905060006001600160a01b0382166064610f0747600a6135a6565b610f119190613592565b604051600081818185875af1925050503d8060008114610f4d576040519150601f19603f3d011682016040523d82523d6000602084013e610f52565b606091505b5050601f805461ff001916610100179055905080610d2157600080fd5b6007546001600160a01b03163314610f995760405162461bcd60e51b8152600401610beb906134f4565b8051610fac906015906020840190612f24565b5050565b6007546001600160a01b03163314610fda5760405162461bcd60e51b8152600401610beb906134f4565b6000826005811115610fee57610fee61369e565b148061100b575060018260058111156110095761100961369e565b145b80611027575060028260058111156110255761102561369e565b145b6110675760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964206d696e74207479706560781b6044820152606401610beb565b600082600581111561107b5761107b61369e565b141561108757601a5550565b600182600581111561109b5761109b61369e565b14156110a757601b5550565b601c5550565b6110b733826120a4565b6110d35760405162461bcd60e51b8152600401610beb90613529565b610d2183838361219b565b6007546001600160a01b031633146111085760405162461bcd60e51b8152600401610beb906134f4565b600880546001600160a01b0319166001600160a01b03831617905561112d6001611537565b50565b6007546001600160a01b0316331461115a5760405162461bcd60e51b8152600401610beb906134f4565b601f805460ff19811660ff90911615179055565b6007546001600160a01b031633146111985760405162461bcd60e51b8152600401610beb906134f4565b601f54610100900460ff166111e65760405162461bcd60e51b81526020600482015260146024820152731254d4d5514811d255915055d0564811925494d560621b6044820152606401610beb565b60006111fa6007546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114611244576040519150601f19603f3d011682016040523d82523d6000602084013e611249565b606091505b505090508061112d57600080fd5b610d21838383604051806020016040528060008152506116b8565b600060018260058111156112885761128861369e565b141561129657601054610ade565b60038260058111156112aa576112aa61369e565b14156112b857601154610ade565b60058260058111156112cc576112cc61369e565b14156112da57601354610ade565b60048260058111156112ee576112ee61369e565b14156112fc57601254610ade565b60008260058111156113105761131061369e565b141561131e57600f54610ade565b506000919050565b919050565b6015805461133890613608565b80601f016020809104026020016040519081016040528092919081815260200182805461136490613608565b80156113b15780601f10611386576101008083540402835291602001916113b1565b820191906000526020600020905b81548152906001019060200180831161139457829003601f168201915b505050505081565b6014805461133890613608565b6000818152600260205260408120546001600160a01b031680610ade5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610beb565b60006001600160a01b0382166114a85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610beb565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b031633146114ee5760405162461bcd60e51b8152600401610beb906134f4565b6114f86000612337565b565b6007546001600160a01b031633146115245760405162461bcd60e51b8152600401610beb906134f4565b8051610fac906014906020840190612f24565b6007546001600160a01b031633146115615760405162461bcd60e51b8152600401610beb906134f4565b6008546001600160a01b03166115af5760405162461bcd60e51b815260206004820152601360248201527214d251d3925391c812d156481393d50814d155606a1b6044820152606401610beb565b600e805460ff1916911515919091179055565b606060018054610af390613608565b60008080808460058111156115e8576115e861369e565b14156115fa575060019050606461165c565b600184600581111561160e5761160e61369e565b1415611620575060659050606e61165c565b60405162461bcd60e51b8152602060048201526011602482015270494e56414c4944204d494e54205459504560781b6044820152606401610beb565b8082116116a257846001600160a01b0316611676836113c6565b6001600160a01b0316141561169057600192505050610ade565b8161169a81613643565b92505061165c565b506000949350505050565b610fac338383612389565b6116c233836120a4565b6116de5760405162461bcd60e51b8152600401610beb90613529565b6116ea84848484612458565b50505050565b6000818152600260205260409020546060906001600160a01b031661176f5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610beb565b600061177961248b565b9050600081511161179957604051806020016040528060008152506117c7565b806117a38461249a565b60156040516020016117b79392919061338e565b6040516020818303038152906040525b9392505050565b6007546001600160a01b031633146117f85760405162461bcd60e51b8152600401610beb906134f4565b8051610fac906016906020840190612f24565b601d54601e5460009190828460058111156118285761182861369e565b1480611845575060028460058111156118435761184361369e565b145b15611875576001600160a01b038516600090815260208052604090205461186c90836135c5565b92505050610ade565b60018460058111156118895761188961369e565b14156118b2576001600160a01b03851660009081526021602052604090205461186c90826135c5565b60048460058111156118c6576118c661369e565b14156118ef576001600160a01b03851660009081526023602052604090205461186c90826135c5565b60038460058111156119035761190361369e565b141561192c576001600160a01b03851660009081526024602052604090205461186c90826135c5565b6001600160a01b03851660009081526022602052604090205461194f90826135c5565b95945050505050565b6008548290829085906001600160a01b03166119ac5760405162461bcd60e51b815260206004820152601360248201527214d251d3925391c812d156481393d50814d155606a1b6044820152606401610beb565b600060058260058111156119c2576119c261369e565b14806119df575060048260058111156119dd576119dd61369e565b145b15611a3657600e5460ff16611a365760405162461bcd60e51b815260206004820152601a60248201527f524544454d5054494f4e5320415245204e4f54204143544956450000000000006044820152606401610beb565b6005826005811115611a4a57611a4a61369e565b1415611a595750600d54611ac7565b6004826005811115611a6d57611a6d61369e565b1415611a7c5750600c54611ac7565b6001826005811115611a9057611a9061369e565b1415611a9f5750600a54611ac7565b6002826005811115611ab357611ab361369e565b1415611ac25750600b54611ac7565b506009545b604080517f68e83002b91b0fd96d4df3566b5122221117e3ec6c2468fda594f6491f89b1c9602080830191909152338284015282518083038401815260608301909352825192019190912061190160f01b60808301526082820183905260a282015260009060c2016040516020818303038152906040528051906020012090506000611b8b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525086939250506125989050565b6008549091506001600160a01b03808316911614611bdf5760405162461bcd60e51b8152602060048201526011602482015270494e56414c4944205349474e415455524560781b6044820152606401610beb565b60026006541415611c325760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610beb565b6002600655601f5460ff1615611c7f5760405162461bcd60e51b815260206004820152601260248201527110d3d395149050d5081254c814105554d15160721b6044820152606401610beb565b611c88896125bc565b8a1115611cce5760405162461bcd60e51b8152602060048201526014602482015273115610d1515114c814115488151608131253525560621b6044820152606401610beb565b89611cd9338b61180b565b1015611d1c5760405162461bcd60e51b8152602060048201526012602482015271135253950813125352550814915050d2115160721b6044820152606401610beb565b89611d268a610d26565b1015611d6b5760405162461bcd60e51b81526020600482015260146024820152734e4f5420454e4f55474820415641494c41424c4560601b6044820152606401610beb565b323314611dc65760405162461bcd60e51b815260206004820152602360248201527f435553544f4d20434f4e5452414354204d494e54494e47204e4f5420414c4c4f60448201526215d15160ea1b6064820152608401610beb565b611dd08a8a612603565b341015611e145760405162461bcd60e51b8152602060048201526012602482015271494e53554646494349454e542046554e445360701b6044820152606401610beb565b611e1f338b8b61268c565b505060016006555050505050505050565b6007546001600160a01b03163314611e5a5760405162461bcd60e51b8152600401610beb906134f4565b611e646000611537565b601254601955601354601855565b6007546001600160a01b03163314611e9c5760405162461bcd60e51b8152600401610beb906134f4565b6000826005811115611eb057611eb061369e565b14611ebb57601e5550565b601d5550565b6016805461133890613608565b6007546001600160a01b03163314611ef85760405162461bcd60e51b8152600401610beb906134f4565b6001600160a01b038116611f5d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610beb565b61112d81612337565b6007546001600160a01b03163314611f905760405162461bcd60e51b8152600401610beb906134f4565b6000611f9d82600361180b565b11611fdf5760405162461bcd60e51b8152602060048201526012602482015271135253950813125352550814915050d2115160721b6044820152606401610beb565b6000611feb6003610d26565b116120295760405162461bcd60e51b815260206004820152600e60248201526d4e4f4e4520415641494c41424c4560901b6044820152606401610beb565b61112d816001600361268c565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061206b826113c6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b031661211d5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610beb565b6000612128836113c6565b9050806001600160a01b0316846001600160a01b031614806121635750836001600160a01b031661215884610b76565b6001600160a01b0316145b8061219357506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166121ae826113c6565b6001600160a01b0316146122125760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610beb565b6001600160a01b0382166122745760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610beb565b61227f600082612036565b6001600160a01b03831660009081526003602052604081208054600192906122a89084906135c5565b90915550506001600160a01b03821660009081526003602052604081208054600192906122d690849061357a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156123eb5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610beb565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61246384848461219b565b61246f848484846126c5565b6116ea5760405162461bcd60e51b8152600401610beb906134a2565b606060148054610af390613608565b6060816124be5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124e857806124d281613643565b91506124e19050600a83613592565b91506124c2565b60008167ffffffffffffffff811115612503576125036136ca565b6040519080825280601f01601f19166020018201604052801561252d576020820181803683370190505b5090505b8415612193576125426001836135c5565b915061254f600a8661365e565b61255a90603061357a565b60f81b81838151811061256f5761256f6136b4565b60200101906001600160f81b031916908160001a905350612591600a86613592565b9450612531565b60008060006125a785856127d2565b915091506125b481612842565b509392505050565b6000808260058111156125d1576125d161369e565b14806125ee575060028260058111156125ec576125ec61369e565b145b156125fb575050601d5490565b5050601e5490565b600060028260058111156126195761261961369e565b14156126345782601c5461262d91906135a6565b9050610ade565b60018260058111156126485761264861369e565b141561265c5782601b5461262d91906135a6565b60008260058111156126705761267061369e565b14156126845782601a5461262d91906135a6565b506000610ade565b60005b828110156116ea576126a184836129fd565b6126b3846126ae84612c1b565b612c6f565b806126bd81613643565b91505061268f565b60006001600160a01b0384163b156127c757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612709903390899088908890600401613452565b602060405180830381600087803b15801561272357600080fd5b505af1925050508015612753575060408051601f3d908101601f1916820190925261275091810190613225565b60015b6127ad573d808015612781576040519150601f19603f3d011682016040523d82523d6000602084013e612786565b606091505b5080516127a55760405162461bcd60e51b8152600401610beb906134a2565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612193565b506001949350505050565b6000808251604114156128095760208301516040840151606085015160001a6127fd87828585612c89565b9450945050505061283b565b8251604014156128335760208301516040840151612828868383612d76565b93509350505061283b565b506000905060025b9250929050565b60008160048111156128565761285661369e565b141561285f5750565b60018160048111156128735761287361369e565b14156128c15760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610beb565b60028160048111156128d5576128d561369e565b14156129235760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610beb565b60038160048111156129375761293761369e565b14156129905760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610beb565b60048160048111156129a4576129a461369e565b141561112d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610beb565b6000816005811115612a1157612a1161369e565b1480612a2e57506002816005811115612a2c57612a2c61369e565b145b15612a7457612a41600f80546001019055565b6001600160a01b03821660009081526020805260408120805460019290612a6990849061357a565b90915550610fac9050565b6001816005811115612a8857612a8861369e565b1415612ac557612a9c601080546001019055565b6001600160a01b0382166000908152602160205260408120805460019290612a6990849061357a565b6004816005811115612ad957612ad961369e565b1415612b4357612aed601280546001019055565b6001600160a01b0382166000908152602360205260408120805460019290612b1690849061357a565b90915550506001600160a01b03821660009081526020805260408120805460019290612a6990849061357a565b6005816005811115612b5757612b5761369e565b1415612b9457612b6b601380546001019055565b6001600160a01b0382166000908152602260205260408120805460019290612b1690849061357a565b6003816005811115612ba857612ba861369e565b1415610fac57612bbc601180546001019055565b6001600160a01b0382166000908152602460205260408120805460019290612be590849061357a565b90915550506001600160a01b03821660009081526020805260408120805460019290612c1290849061357a565b90915550505050565b60006001826005811115612c3157612c3161369e565b1415612c4557601054610ade90606461357a565b601154601354601254600f54612c5b919061357a565b612c65919061357a565b610ade919061357a565b610fac828260405180602001604052806000815250612daf565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612cc05750600090506003612d6d565b8460ff16601b14158015612cd857508460ff16601c14155b15612ce95750600090506004612d6d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612d3d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612d6657600060019250925050612d6d565b9150600090505b94509492505050565b6000806001600160ff1b03831681612d9360ff86901c601b61357a565b9050612da187828885612c89565b935093505050935093915050565b612db98383612de2565b612dc660008484846126c5565b610d215760405162461bcd60e51b8152600401610beb906134a2565b6001600160a01b038216612e385760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610beb565b6000818152600260205260409020546001600160a01b031615612e9d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610beb565b6001600160a01b0382166000908152600360205260408120805460019290612ec690849061357a565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612f3090613608565b90600052602060002090601f016020900481019282612f525760008555612f98565b82601f10612f6b57805160ff1916838001178555612f98565b82800160010185558215612f98579182015b82811115612f98578251825591602001919060010190612f7d565b50612fa4929150612fa8565b5090565b5b80821115612fa45760008155600101612fa9565b600067ffffffffffffffff80841115612fd857612fd86136ca565b604051601f8501601f19908116603f01168101908282118183101715613000576130006136ca565b8160405280935085815286868601111561301957600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461132657600080fd5b8035801515811461132657600080fd5b80356006811061132657600080fd5b60006020828403121561307b57600080fd5b6117c782613033565b6000806040838503121561309757600080fd5b6130a083613033565b91506130ae60208401613033565b90509250929050565b6000806000606084860312156130cc57600080fd5b6130d584613033565b92506130e360208501613033565b9150604084013590509250925092565b6000806000806080858703121561310957600080fd5b61311285613033565b935061312060208601613033565b925060408501359150606085013567ffffffffffffffff81111561314357600080fd5b8501601f8101871361315457600080fd5b61316387823560208401612fbd565b91505092959194509250565b6000806040838503121561318257600080fd5b61318b83613033565b91506130ae6020840161304a565b600080604083850312156131ac57600080fd5b6131b583613033565b91506130ae6020840161305a565b600080604083850312156131d657600080fd5b6131df83613033565b946020939093013593505050565b6000602082840312156131ff57600080fd5b6117c78261304a565b60006020828403121561321a57600080fd5b81356117c7816136e0565b60006020828403121561323757600080fd5b81516117c7816136e0565b60006020828403121561325457600080fd5b6117c78261305a565b6000806040838503121561327057600080fd5b6131df8361305a565b60006020828403121561328b57600080fd5b813567ffffffffffffffff8111156132a257600080fd5b8201601f810184136132b357600080fd5b61219384823560208401612fbd565b6000602082840312156132d457600080fd5b5035919050565b600080600080606085870312156132f157600080fd5b843593506133016020860161305a565b9250604085013567ffffffffffffffff8082111561331e57600080fd5b818701915087601f83011261333257600080fd5b81358181111561334157600080fd5b88602082850101111561335357600080fd5b95989497505060200194505050565b6000815180845261337a8160208601602086016135dc565b601f01601f19169290920160200192915050565b6000845160206133a18285838a016135dc565b8551918401916133b48184848a016135dc565b8554920191600090600181811c90808316806133d157607f831692505b8583108114156133ef57634e487b7160e01b85526022600452602485fd5b808015613403576001811461341457613441565b60ff19851688528388019550613441565b60008b81526020902060005b858110156134395781548a820152908401908801613420565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061348590830184613362565b9695505050505050565b6020815260006117c76020830184613362565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561358d5761358d613672565b500190565b6000826135a1576135a1613688565b500490565b60008160001904831182151516156135c0576135c0613672565b500290565b6000828210156135d7576135d7613672565b500390565b60005b838110156135f75781810151838201526020016135df565b838111156116ea5750506000910152565b600181811c9082168061361c57607f821691505b6020821081141561363d57634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561365757613657613672565b5060010190565b60008261366d5761366d613688565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461112d57600080fdfea264697066735822122085a3cb72b3cecbfac644cfbd065f7515b09c420a17d6f32f8158f671224c642e64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000278d00

-----Decoded View---------------
Arg [0] : _totalGiveawaySeconds (uint256): 2592000

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000278d00


Deployed Bytecode Sourcemap

53740:10426:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40522:305;;;;;;;;;;-1:-1:-1;40522:305:0;;;;;:::i;:::-;;:::i;:::-;;;9246:14:1;;9239:22;9221:41;;9209:2;9194:18;40522:305:0;;;;;;;;41467:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43026:221::-;;;;;;;;;;-1:-1:-1;43026:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8544:32:1;;;8526:51;;8514:2;8499:18;43026:221:0;8380:203:1;42549:411:0;;;;;;;;;;-1:-1:-1;42549:411:0;;;;;:::i;:::-;;:::i;:::-;;57943:598;;;;;;;;;;-1:-1:-1;57943:598:0;;;;;:::i;:::-;;:::i;:::-;;;9419:25:1;;;9407:2;9392:18;57943:598:0;9273:177:1;63467:437:0;;;;;;;;;;-1:-1:-1;63467:437:0;;;;;:::i;:::-;;:::i;54718:38::-;;;;;;;;;;;;;;;;54565:39;;;;;;;;;;;;;;;;62922:102;;;;;;;;;;-1:-1:-1;62922:102:0;;;;;:::i;:::-;;:::i;54282:41::-;;;;;;;;;;;;54320:3;54282:41;;54761:36;;;;;;;;;;;;;;;;62210:416;;;;;;;;;;-1:-1:-1;62210:416:0;;;;;:::i;:::-;;:::i;43776:339::-;;;;;;;;;;-1:-1:-1;43776:339:0;;;;;:::i;:::-;;:::i;20651:147::-;;;;;;;;;;-1:-1:-1;20651:147:0;;;;;:::i;:::-;;:::i;63130:72::-;;;;;;;;;;;;;:::i;63972:191::-;;;;;;;;;;;;;:::i;54907:34::-;;;;;;;;;;-1:-1:-1;54907:34:0;;;;;;;;;;;19784:140;;;;;;;;;;;;19829:95;19784:140;;44186:185;;;;;;;;;;-1:-1:-1;44186:185:0;;;;;:::i;:::-;;:::i;54471:33::-;;;;;;;;;;;;;;;;57402:535;;;;;;;;;;-1:-1:-1;57402:535:0;;;;;:::i;:::-;;:::i;19604:30::-;;;;;;;;;;;;;;;;54328:48;;;;;;;;;;;;54373:3;54328:48;;19931:28;;;;;;;;;;-1:-1:-1;19931:28:0;;;;;;;;54135:23;;;;;;;;;;;;;:::i;54609:34::-;;;;;;;;;;;;;;;;54876:26;;;;;;;;;;-1:-1:-1;54876:26:0;;;;;;;;19540:29;;;;;;;;;;;;;;;;54107:23;;;;;;;;;;;;;:::i;41161:239::-;;;;;;;;;;-1:-1:-1;41161:239:0;;;;;:::i;:::-;;:::i;54509:34::-;;;;;;;;;;;;;;;;40891:208;;;;;;;;;;-1:-1:-1;40891:208:0;;;;;:::i;:::-;;:::i;18488:103::-;;;;;;;;;;;;;:::i;62814:102::-;;;;;;;;;;-1:-1:-1;62814:102:0;;;;;:::i;:::-;;:::i;54802:37::-;;;;;;;;;;;;;;;20804:189;;;;;;;;;;-1:-1:-1;20804:189:0;;;;;:::i;:::-;;:::i;54381:43::-;;;;;;;;;;;;54422:2;54381:43;;17837:87;;;;;;;;;;-1:-1:-1;17910:6:0;;-1:-1:-1;;;;;17910:6:0;17837:87;;41636:104;;;;;;;;;;;;;:::i;60025:487::-;;;;;;;;;;-1:-1:-1;60025:487:0;;;;;:::i;:::-;;:::i;54220:34::-;;;;;;;;;;;;;;;43319:155;;;;;;;;;;-1:-1:-1;43319:155:0;;;;;:::i;:::-;;:::i;19639:27::-;;;;;;;;;;;;;;;;44442:328;;;;;;;;;;-1:-1:-1;44442:328:0;;;;;:::i;:::-;;:::i;54648:41::-;;;;;;;;;;;;;;;;19671:26;;;;;;;;;;;;;;;;54429:37;;;;;;;;;;;;;;;;61702:380;;;;;;;;;;-1:-1:-1;61702:380:0;;;;;:::i;:::-;;:::i;63030:94::-;;;;;;;;;;-1:-1:-1;63030:94:0;;;;;:::i;:::-;;:::i;56732:664::-;;;;;;;;;;-1:-1:-1;56732:664:0;;;;;:::i;:::-;;:::i;60780:686::-;;;;;;:::i;:::-;;:::i;63208:175::-;;;;;;;;;;;;;:::i;62632:176::-;;;;;;;;;;-1:-1:-1;62632:176:0;;;;;:::i;:::-;;:::i;54163:25::-;;;;;;;;;;;;;:::i;43545:164::-;;;;;;;;;;-1:-1:-1;43545:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;43666:25:0;;;43642:4;43666:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;43545:164;19574:25;;;;;;;;;;;;;;;;18746:201;;;;;;;;;;-1:-1:-1;18746:201:0;;;;;:::i;:::-;;:::i;19702:77::-;;;;;;;;;;;;19744:35;19702:77;;60518:256;;;;;;;;;;-1:-1:-1;60518:256:0;;;;;:::i;:::-;;:::i;40522:305::-;40624:4;-1:-1:-1;;;;;;40661:40:0;;-1:-1:-1;;;40661:40:0;;:105;;-1:-1:-1;;;;;;;40718:48:0;;-1:-1:-1;;;40718:48:0;40661:105;:158;;;-1:-1:-1;;;;;;;;;;33385:40:0;;;40783:36;40641:178;40522:305;-1:-1:-1;;40522:305:0:o;41467:100::-;41521:13;41554:5;41547:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41467:100;:::o;43026:221::-;43102:7;46369:16;;;:7;:16;;;;;;-1:-1:-1;;;;;46369:16:0;43122:73;;;;-1:-1:-1;;;43122:73:0;;19294:2:1;43122:73:0;;;19276:21:1;19333:2;19313:18;;;19306:30;19372:34;19352:18;;;19345:62;-1:-1:-1;;;19423:18:1;;;19416:42;19475:19;;43122:73:0;;;;;;;;;-1:-1:-1;43215:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;43215:24:0;;43026:221::o;42549:411::-;42630:13;42646:23;42661:7;42646:14;:23::i;:::-;42630:39;;42694:5;-1:-1:-1;;;;;42688:11:0;:2;-1:-1:-1;;;;;42688:11:0;;;42680:57;;;;-1:-1:-1;;;42680:57:0;;20484:2:1;42680:57:0;;;20466:21:1;20523:2;20503:18;;;20496:30;20562:34;20542:18;;;20535:62;-1:-1:-1;;;20613:18:1;;;20606:31;20654:19;;42680:57:0;20282:397:1;42680:57:0;16641:10;-1:-1:-1;;;;;42772:21:0;;;;:62;;-1:-1:-1;42797:37:0;42814:5;16641:10;43545:164;:::i;42797:37::-;42750:168;;;;-1:-1:-1;;;42750:168:0;;17284:2:1;42750:168:0;;;17266:21:1;17323:2;17303:18;;;17296:30;17362:34;17342:18;;;17335:62;17433:26;17413:18;;;17406:54;17477:19;;42750:168:0;17082:420:1;42750:168:0;42931:21;42940:2;42944:7;42931:8;:21::i;:::-;42619:341;42549:411;;:::o;57943:598::-;58009:7;58042:12;58029:9;:25;;;;;;;;:::i;:::-;;58025:400;;;58089:9;3723:14;58072:36;;54422:2;58072:36;:::i;58025:400::-;58139:17;58126:9;:30;;;;;;;;:::i;:::-;;58122:303;;;58194:14;3723;58174:17;;:44;;;;:::i;58122:303::-;58249:13;58236:9;:26;;;;;;;;:::i;:::-;;58232:193;;;58296:10;3723:14;58280:13;;:36;;;;:::i;58232:193::-;58347:14;58334:9;:27;;;;;;;;:::i;:::-;;58330:95;;;58396:11;3723:14;58379;;:38;;;;:::i;58330:95::-;58512:13;3723:14;58495;;58479:13;;58459:17;;58438:38;;54373:3;58438:38;:::i;:::-;:54;;;;:::i;:::-;:71;;;;:::i;:::-;:97;;;;:::i;63467:437::-;17910:6;;-1:-1:-1;;;;;17910:6:0;16641:10;18057:23;18049:68;;;;-1:-1:-1;;;18049:68:0;;;;;;;:::i;:::-;63558:24:::1;63570:12;63558:9;:24;:::i;:::-;63539:15;:43;;:134;;;;63596:29;63612:12;63596:15;:29::i;:::-;:34:::0;:76;::::1;;;;63634:33;63650:16;63634:15;:33::i;:::-;:38:::0;63596:76:::1;63523:188;;;::::0;-1:-1:-1;;;63523:188:0;;16119:2:1;63523:188:0::1;::::0;::::1;16101:21:1::0;16158:2;16138:18;;;16131:30;-1:-1:-1;;;16177:18:1;;;16170:50;16237:18;;63523:188:0::1;15917:344:1::0;63523:188:0::1;63718:14;63735:17;63743:8;63735:7;:17::i;:::-;63718:34:::0;-1:-1:-1;63762:12:0::1;-1:-1:-1::0;;;;;63780:20:0;::::1;63839:3;63809:26;:21;63833:2;63809:26;:::i;:::-;63808:34;;;;:::i;:::-;63780:67;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;63854:14:0::1;:21:::0;;-1:-1:-1;;63854:21:0::1;;;::::0;;63761:86;-1:-1:-1;63761:86:0;63882:16:::1;;;::::0;::::1;62922:102:::0;17910:6;;-1:-1:-1;;;;;17910:6:0;16641:10;18057:23;18049:68;;;;-1:-1:-1;;;18049:68:0;;;;;;;:::i;:::-;62996:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;62922:102:::0;:::o;62210:416::-;17910:6;;-1:-1:-1;;;;;17910:6:0;16641:10;18057:23;18049:68;;;;-1:-1:-1;;;18049:68:0;;;;;;;:::i;:::-;62317:16:::1;62304:9;:29;;;;;;;;:::i;:::-;;:58;;;-1:-1:-1::0;62350:12:0::1;62337:9;:25;;;;;;;;:::i;:::-;;62304:58;:92;;;-1:-1:-1::0;62379:17:0::1;62366:9;:30;;;;;;;;:::i;:::-;;62304:92;62288:143;;;::::0;-1:-1:-1;;;62288:143:0;;15773:2:1;62288:143:0::1;::::0;::::1;15755:21:1::0;15812:2;15792:18;;;15785:30;-1:-1:-1;;;15831:18:1;;;15824:47;15888:18;;62288:143:0::1;15571:341:1::0;62288:143:0::1;62455:16;62442:9;:29;;;;;;;;:::i;:::-;;62438:183;;;62482:11;:19:::0;-1:-1:-1;62922:102:0:o;62438:183::-:1;62532:12;62519:9;:25;;;;;;;;:::i;:::-;;62515:106;;;62555:7;:15:::0;-1:-1:-1;62922:102:0:o;62515:106::-:1;62593:12;:20:::0;-1:-1:-1;62210:416:0:o;43776:339::-;43971:41;16641:10;44004:7;43971:18;:41::i;:::-;43963:103;;;;-1:-1:-1;;;43963:103:0;;;;;;;:::i;:::-;44079:28;44089:4;44095:2;44099:7;44079:9;:28::i;20651:147::-;17910:6;;-1:-1:-1;;;;;17910:6:0;16641:10;18057:23;18049:68;;;;-1:-1:-1;;;18049:68:0;;;;;;;:::i;:::-;20725:19:::1;:35:::0;;-1:-1:-1;;;;;;20725:35:0::1;-1:-1:-1::0;;;;;20725:35:0;::::1;;::::0;;20767:25:::1;-1:-1:-1::0;20767:19:0::1;:25::i;:::-;20651:147:::0;:::o;63130:72::-;17910:6;;-1:-1:-1;;;;;17910:6:0;16641:10;18057:23;18049:68;;;;-1:-1:-1;;;18049:68:0;;;;;;;:::i;:::-;63190:6:::1;::::0;;-1:-1:-1;;63180:16:0;::::1;63190:6;::::0;;::::1;63189:7;63180:16;::::0;;63130:72::o;63972:191::-;17910:6;;-1:-1:-1;;;;;17910:6:0;16641:10;18057:23;18049:68;;;;-1:-1:-1;;;18049:68:0;;;;;;;:::i;:::-;64024:14:::1;::::0;::::1;::::0;::::1;;;64016:47;;;::::0;-1:-1:-1;;;64016:47:0;;22342:2:1;64016:47:0::1;::::0;::::1;22324:21:1::0;22381:2;22361:18;;;22354:30;-1:-1:-1;;;22400:18:1;;;22393:50;22460:18;;64016:47:0::1;22140:344:1::0;64016:47:0::1;64071:7;64092;17910:6:::0;;-1:-1:-1;;;;;17910:6:0;;17837:87;64092:7:::1;-1:-1:-1::0;;;;;64084:21:0::1;64113;64084:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64070:69;;;64154:2;64146:11;;;::::0;::::1;44186:185:::0;44324:39;44341:4;44347:2;44351:7;44324:39;;;;;;;;;;;;:16;:39::i;57402:535::-;57467:7;57500:12;57487:9;:25;;;;;;;;:::i;:::-;;57483:449;;;57530:9;3723:14;57530:19;3631:114;57483:449;57580:17;57567:9;:30;;;;;;;;:::i;:::-;;57563:369;;;57615:14;3723;57615:24;3631:114;57563:369;57670:13;57657:9;:26;;;;;;;;:::i;:::-;;57653:279;;;57701:10;3723:14;57701:20;3631:114;57653:279;57752:14;57739:9;:27;;;;;;;;:::i;:::-;;57735:197;;;57784:11;3723:14;57784:21;3631:114;57735:197;57836:16;57823:9;:29;;;;;;;;:::i;:::-;;57819:113;;;57870:13;3723:14;57870:23;3631:114;57819:113;-1:-1:-1;57923:1:0;;57402:535;-1:-1:-1;57402:535:0:o;57819:113::-;57402:535;;;:::o;54135:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54107:::-;;;;;;;:::i;41161:239::-;41233:7;41269:16;;;:7;:16;;;;;;-1:-1:-1;;;;;41269:16:0;41304:19;41296:73;;;;-1:-1:-1;;;41296:73:0;;18120:2:1;41296:73:0;;;18102:21:1;18159:2;18139:18;;;18132:30;18198:34;18178:18;;;18171:62;-1:-1:-1;;;18249:18:1;;;18242:39;18298:19;;41296:73:0;17918:405:1;40891:208:0;40963:7;-1:-1:-1;;;;;40991:19:0;;40983:74;;;;-1:-1:-1;;;40983:74:0;;17709:2:1;40983:74:0;;;17691:21:1;17748:2;17728:18;;;17721:30;17787:34;17767:18;;;17760:62;-1:-1:-1;;;17838:18:1;;;17831:40;17888:19;;40983:74:0;17507:406:1;40983:74:0;-1:-1:-1;;;;;;41075:16:0;;;;;:9;:16;;;;;;;40891:208::o;18488:103::-;17910:6;;-1:-1:-1;;;;;17910:6:0;16641:10;18057:23;18049:68;;;;-1:-1:-1;;;18049:68:0;;;;;;;:::i;:::-;18553:30:::1;18580:1;18553:18;:30::i;:::-;18488:103::o:0;62814:102::-;17910:6;;-1:-1:-1;;;;;17910:6:0;16641:10;18057:23;18049:68;;;;-1:-1:-1;;;18049:68:0;;;;;;;:::i;:::-;62888:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;20804:189::-:0;17910:6;;-1:-1:-1;;;;;17910:6:0;16641:10;18057:23;18049:68;;;;-1:-1:-1;;;18049:68:0;;;;;;;:::i;:::-;20888:19:::1;::::0;-1:-1:-1;;;;;20888:19:0::1;20880:65;;;::::0;-1:-1:-1;;;20880:65:0;;21233:2:1;20880:65:0::1;::::0;::::1;21215:21:1::0;21272:2;21252:18;;;21245:30;-1:-1:-1;;;21291:18:1;;;21284:49;21350:18;;20880:65:0::1;21031:343:1::0;20880:65:0::1;20952:16;:35:::0;;-1:-1:-1;;20952:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;20804:189::o;41636:104::-;41692:13;41725:7;41718:14;;;;;:::i;60025:487::-;60102:4;;;;60156:9;:29;;;;;;;;:::i;:::-;;60152:206;;;-1:-1:-1;60201:1:0;;-1:-1:-1;60217:3:0;60152:206;;;60251:12;60238:9;:25;;;;;;;;:::i;:::-;;60234:124;;;-1:-1:-1;60279:3:0;;-1:-1:-1;60297:3:0;60234:124;;;60323:27;;-1:-1:-1;;;60323:27:0;;12745:2:1;60323:27:0;;;12727:21:1;12784:2;12764:18;;;12757:30;-1:-1:-1;;;12803:18:1;;;12796:47;12860:18;;60323:27:0;12543:341:1;60234:124:0;60377:3;60371:2;:9;60364:124;;60410:6;-1:-1:-1;;;;;60395:21:0;:11;60403:2;60395:7;:11::i;:::-;-1:-1:-1;;;;;60395:21:0;;60391:90;;;60436:4;60429:11;;;;;;60391:90;60467:4;;;;:::i;:::-;;;;60364:124;;;-1:-1:-1;60501:5:0;;60025:487;-1:-1:-1;;;;60025:487:0:o;43319:155::-;43414:52;16641:10;43447:8;43457;43414:18;:52::i;44442:328::-;44617:41;16641:10;44650:7;44617:18;:41::i;:::-;44609:103;;;;-1:-1:-1;;;44609:103:0;;;;;;;:::i;:::-;44723:39;44737:4;44743:2;44747:7;44756:5;44723:13;:39::i;:::-;44442:328;;;;:::o;61702:380::-;46345:4;46369:16;;;:7;:16;;;;;;61776:13;;-1:-1:-1;;;;;46369:16:0;61798:77;;;;-1:-1:-1;;;61798:77:0;;20068:2:1;61798:77:0;;;20050:21:1;20107:2;20087:18;;;20080:30;20146:34;20126:18;;;20119:62;-1:-1:-1;;;20197:18:1;;;20190:45;20252:19;;61798:77:0;19866:411:1;61798:77:0;61884:28;61915:10;:8;:10::i;:::-;61884:41;;61977:1;61952:14;61946:28;:32;:130;;;;;;;;;;;;;;;;;62014:14;62030:19;:8;:17;:19::i;:::-;62051:9;61997:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61946:130;61932:144;61702:380;-1:-1:-1;;;61702:380:0:o;63030:94::-;17910:6;;-1:-1:-1;;;;;17910:6:0;16641:10;18057:23;18049:68;;;;-1:-1:-1;;;18049:68:0;;;;;;;:::i;:::-;63100:18;;::::1;::::0;:11:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;56732:664::-:0;56850:19;;56896:17;;56812:7;;56850:19;56812:7;56924:9;:29;;;;;;;;:::i;:::-;;:63;;;-1:-1:-1;56970:17:0;56957:9;:30;;;;;;;;:::i;:::-;;56924:63;56920:424;;;-1:-1:-1;;;;;57019:24:0;;;;;;:19;:24;;;;;;57005:38;;:11;:38;:::i;:::-;56998:45;;;;;;56920:424;57074:12;57061:9;:25;;;;;;;;:::i;:::-;;57057:287;;;-1:-1:-1;;;;;57116:20:0;;;;;;:15;:20;;;;;;57104:32;;:9;:32;:::i;57057:287::-;57167:14;57154:9;:27;;;;;;;;:::i;:::-;;57150:194;;;-1:-1:-1;;;;;57211:22:0;;;;;;:17;:22;;;;;;57199:34;;:9;:34;:::i;57150:194::-;57264:17;57251:9;:30;;;;;;;;:::i;:::-;;57247:97;;;-1:-1:-1;;;;;57311:25:0;;;;;;:20;:25;;;;;;57299:37;;:9;:37;:::i;57247:97::-;-1:-1:-1;;;;;57369:21:0;;;;;;:16;:21;;;;;;57357:33;;:9;:33;:::i;:::-;57350:40;56732:664;-1:-1:-1;;;;;56732:664:0:o;60780:686::-;21088:19;;60914:9;;;;60925;;-1:-1:-1;;;;;21088:19:0;21080:65;;;;-1:-1:-1;;;21080:65:0;;21233:2:1;21080:65:0;;;21215:21:1;21272:2;21252:18;;;21245:30;-1:-1:-1;;;21291:18:1;;;21284:49;21350:18;;21080:65:0;21031:343:1;21080:65:0;21154:14;21194:13;21181:9;:26;;;;;;;;:::i;:::-;;:57;;;-1:-1:-1;21224:14:0;21211:9;:27;;;;;;;;:::i;:::-;;21181:57;21177:135;;;21257:16;;;;21249:55;;;;-1:-1:-1;;;21249:55:0;;10916:2:1;21249:55:0;;;10898:21:1;10955:2;10935:18;;;10928:30;10994:28;10974:18;;;10967:56;11040:18;;21249:55:0;10714:350:1;21249:55:0;21337:13;21324:9;:26;;;;;;;;:::i;:::-;;21320:348;;;-1:-1:-1;21370:11:0;;21320:348;;;21412:14;21399:9;:27;;;;;;;;:::i;:::-;;21395:273;;;-1:-1:-1;21446:12:0;;21395:273;;;21489:12;21476:9;:25;;;;;;;;:::i;:::-;;21472:196;;;-1:-1:-1;21521:10:0;;21472:196;;;21562:17;21549:9;:30;;;;;;;;:::i;:::-;;21545:123;;;-1:-1:-1;21599:15:0;;21545:123;;;-1:-1:-1;21646:14:0;;21545:123;21757:39;;;19744:35;21757:39;;;;9629:25:1;;;;21785:10:0;9670:18:1;;;9663:60;21757:39:0;;;;;;;;;9602:18:1;;;21757:39:0;;;21747:50;;;;;;;;-1:-1:-1;;;21710:88:0;;;8031:27:1;8074:11;;;8067:27;;;8110:12;;;8103:28;-1:-1:-1;;8147:12:1;;21710:88:0;;;;;;;;;;;;21700:99;;;;;;21676:123;;21808:24;21835:26;21850:10;;21835:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21835:6:0;;:26;-1:-1:-1;;21835:14:0;:26;-1:-1:-1;21835:26:0:i;:::-;21898:19;;21808:53;;-1:-1:-1;;;;;;21878:39:0;;;21898:19;;21878:39;21870:69;;;;-1:-1:-1;;;21870:69:0;;11980:2:1;21870:69:0;;;11962:21:1;12019:2;11999:18;;;11992:30;-1:-1:-1;;;12038:18:1;;;12031:47;12095:18;;21870:69:0;11778:341:1;21870:69:0;1812:1:::1;2410:7;;:19;;2402:63;;;::::0;-1:-1:-1;;;2402:63:0;;23385:2:1;2402:63:0::1;::::0;::::1;23367:21:1::0;23424:2;23404:18;;;23397:30;23463:33;23443:18;;;23436:61;23514:18;;2402:63:0::1;23183:355:1::0;2402:63:0::1;1812:1;2543:7;:18:::0;60965:6:::2;::::0;::::2;;60964:7;60956:38;;;::::0;-1:-1:-1;;;60956:38:0;;20886:2:1;60956:38:0::2;::::0;::::2;20868:21:1::0;20925:2;20905:18;;;20898:30;-1:-1:-1;;;20944:18:1;;;20937:48;21002:18;;60956:38:0::2;20684:342:1::0;60956:38:0::2;61024:23;61037:9;61024:12;:23::i;:::-;61009:11;:38;;61001:71;;;::::0;-1:-1:-1;;;61001:71:0;;11271:2:1;61001:71:0::2;::::0;::::2;11253:21:1::0;11310:2;11290:18;;;11283:30;-1:-1:-1;;;11329:18:1;;;11322:50;11389:18;;61001:71:0::2;11069:344:1::0;61001:71:0::2;61130:11;61087:39;61104:10;61116:9;61087:16;:39::i;:::-;:54;;61079:85;;;::::0;-1:-1:-1;;;61079:85:0;;23038:2:1;61079:85:0::2;::::0;::::2;23020:21:1::0;23077:2;23057:18;;;23050:30;-1:-1:-1;;;23096:18:1;;;23089:48;23154:18;;61079:85:0::2;22836:342:1::0;61079:85:0::2;61209:11;61179:26;61195:9;61179:15;:26::i;:::-;:41;;61171:74;;;::::0;-1:-1:-1;;;61171:74:0;;14665:2:1;61171:74:0::2;::::0;::::2;14647:21:1::0;14704:2;14684:18;;;14677:30;-1:-1:-1;;;14723:18:1;;;14716:50;14783:18;;61171:74:0::2;14463:344:1::0;61171:74:0::2;61260:9;61273:10;61260:23;61252:71;;;::::0;-1:-1:-1;;;61252:71:0;;13091:2:1;61252:71:0::2;::::0;::::2;13073:21:1::0;13130:2;13110:18;;;13103:30;13169:34;13149:18;;;13142:62;-1:-1:-1;;;13220:18:1;;;13213:33;13263:19;;61252:71:0::2;12889:399:1::0;61252:71:0::2;61351:34;61362:11;61375:9;61351:10;:34::i;:::-;61338:9;:47;;61330:78;;;::::0;-1:-1:-1;;;61330:78:0;;22691:2:1;61330:78:0::2;::::0;::::2;22673:21:1::0;22730:2;22710:18;;;22703:30;-1:-1:-1;;;22749:18:1;;;22742:48;22807:18;;61330:78:0::2;22489:342:1::0;61330:78:0::2;61415:45;61425:10;61437:11;61450:9;61415;:45::i;:::-;-1:-1:-1::0;;1768:1:0::1;2722:7;:22:::0;-1:-1:-1;;;;;;;;60780:686:0:o;63208:175::-;17910:6;;-1:-1:-1;;;;;17910:6:0;16641:10;18057:23;18049:68;;;;-1:-1:-1;;;18049:68:0;;;;;;;:::i;:::-;63263:26:::1;63283:5;63263:19;:26::i;:::-;63313:11;3723:14:::0;63296::::1;:38:::0;63357:10:::1;3723:14:::0;63341:13:::1;:36:::0;63208:175::o;62632:176::-;17910:6;;-1:-1:-1;;;;;17910:6:0;16641:10;18057:23;18049:68;;;;-1:-1:-1;;;18049:68:0;;;;;;;:::i;:::-;62730:16:::1;62717:9;:29;;;;;;;;:::i;:::-;;:85;;62778:17;:24:::0;-1:-1:-1;42549:411:0:o;62717:85::-:1;62749:19;:26:::0;-1:-1:-1;62632:176:0:o;54163:25::-;;;;;;;:::i;18746:201::-;17910:6;;-1:-1:-1;;;;;17910:6:0;16641:10;18057:23;18049:68;;;;-1:-1:-1;;;18049:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18835:22:0;::::1;18827:73;;;::::0;-1:-1:-1;;;18827:73:0;;13495:2:1;18827:73:0::1;::::0;::::1;13477:21:1::0;13534:2;13514:18;;;13507:30;13573:34;13553:18;;;13546:62;-1:-1:-1;;;13624:18:1;;;13617:36;13670:19;;18827:73:0::1;13293:402:1::0;18827:73:0::1;18911:28;18930:8;18911:18;:28::i;60518:256::-:0;17910:6;;-1:-1:-1;;;;;17910:6:0;16641:10;18057:23;18049:68;;;;-1:-1:-1;;;18049:68:0;;;;;;;:::i;:::-;60629:1:::1;60586:40;60603:3;60608:17;60586:16;:40::i;:::-;:44;60578:75;;;::::0;-1:-1:-1;;;60578:75:0;;23038:2:1;60578:75:0::1;::::0;::::1;23020:21:1::0;23077:2;23057:18;;;23050:30;-1:-1:-1;;;23096:18:1;;;23089:48;23154:18;;60578:75:0::1;22836:342:1::0;60578:75:0::1;60705:1;60668:34;60684:17;60668:15;:34::i;:::-;:38;60660:65;;;::::0;-1:-1:-1;;;60660:65:0;;21581:2:1;60660:65:0::1;::::0;::::1;21563:21:1::0;21620:2;21600:18;;;21593:30;-1:-1:-1;;;21639:18:1;;;21632:44;21693:18;;60660:65:0::1;21379:338:1::0;60660:65:0::1;60732:36;60742:3;60747:1;60750:17;60732:9;:36::i;50426:174::-:0;50501:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;50501:29:0;-1:-1:-1;;;;;50501:29:0;;;;;;;;:24;;50555:23;50501:24;50555:14;:23::i;:::-;-1:-1:-1;;;;;50546:46:0;;;;;;;;;;;50426:174;;:::o;46574:348::-;46667:4;46369:16;;;:7;:16;;;;;;-1:-1:-1;;;;;46369:16:0;46684:73;;;;-1:-1:-1;;;46684:73:0;;16871:2:1;46684:73:0;;;16853:21:1;16910:2;16890:18;;;16883:30;16949:34;16929:18;;;16922:62;-1:-1:-1;;;17000:18:1;;;16993:42;17052:19;;46684:73:0;16669:408:1;46684:73:0;46768:13;46784:23;46799:7;46784:14;:23::i;:::-;46768:39;;46837:5;-1:-1:-1;;;;;46826:16:0;:7;-1:-1:-1;;;;;46826:16:0;;:51;;;;46870:7;-1:-1:-1;;;;;46846:31:0;:20;46858:7;46846:11;:20::i;:::-;-1:-1:-1;;;;;46846:31:0;;46826:51;:87;;;-1:-1:-1;;;;;;43666:25:0;;;43642:4;43666:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;46881:32;46818:96;46574:348;-1:-1:-1;;;;46574:348:0:o;49683:625::-;49842:4;-1:-1:-1;;;;;49815:31:0;:23;49830:7;49815:14;:23::i;:::-;-1:-1:-1;;;;;49815:31:0;;49807:81;;;;-1:-1:-1;;;49807:81:0;;13902:2:1;49807:81:0;;;13884:21:1;13941:2;13921:18;;;13914:30;13980:34;13960:18;;;13953:62;-1:-1:-1;;;14031:18:1;;;14024:35;14076:19;;49807:81:0;13700:401:1;49807:81:0;-1:-1:-1;;;;;49907:16:0;;49899:65;;;;-1:-1:-1;;;49899:65:0;;15014:2:1;49899:65:0;;;14996:21:1;15053:2;15033:18;;;15026:30;15092:34;15072:18;;;15065:62;-1:-1:-1;;;15143:18:1;;;15136:34;15187:19;;49899:65:0;14812:400:1;49899:65:0;50081:29;50098:1;50102:7;50081:8;:29::i;:::-;-1:-1:-1;;;;;50123:15:0;;;;;;:9;:15;;;;;:20;;50142:1;;50123:15;:20;;50142:1;;50123:20;:::i;:::-;;;;-1:-1:-1;;;;;;;50154:13:0;;;;;;:9;:13;;;;;:18;;50171:1;;50154:13;:18;;50171:1;;50154:18;:::i;:::-;;;;-1:-1:-1;;50183:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;50183:21:0;-1:-1:-1;;;;;50183:21:0;;;;;;;;;50222:27;;50183:16;;50222:27;;;;;;;42619:341;42549:411;;:::o;19107:191::-;19200:6;;;-1:-1:-1;;;;;19217:17:0;;;-1:-1:-1;;;;;;19217:17:0;;;;;;;19250:40;;19200:6;;;19217:17;19200:6;;19250:40;;19181:16;;19250:40;19170:128;19107:191;:::o;50742:315::-;50897:8;-1:-1:-1;;;;;50888:17:0;:5;-1:-1:-1;;;;;50888:17:0;;;50880:55;;;;-1:-1:-1;;;50880:55:0;;15419:2:1;50880:55:0;;;15401:21:1;15458:2;15438:18;;;15431:30;15497:27;15477:18;;;15470:55;15542:18;;50880:55:0;15217:349:1;50880:55:0;-1:-1:-1;;;;;50946:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;50946:46:0;;;;;;;;;;51008:41;;9221::1;;;51008::0;;9194:18:1;51008:41:0;;;;;;;50742:315;;;:::o;45652:::-;45809:28;45819:4;45825:2;45829:7;45809:9;:28::i;:::-;45856:48;45879:4;45885:2;45889:7;45898:5;45856:22;:48::i;:::-;45848:111;;;;-1:-1:-1;;;45848:111:0;;;;;;;:::i;61592:104::-;61652:13;61681:9;61674:16;;;;;:::i;4589:723::-;4645:13;4866:10;4862:53;;-1:-1:-1;;4893:10:0;;;;;;;;;;;;-1:-1:-1;;;4893:10:0;;;;;4589:723::o;4862:53::-;4940:5;4925:12;4981:78;4988:9;;4981:78;;5014:8;;;;:::i;:::-;;-1:-1:-1;5037:10:0;;-1:-1:-1;5045:2:0;5037:10;;:::i;:::-;;;4981:78;;;5069:19;5101:6;5091:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5091:17:0;;5069:39;;5119:154;5126:10;;5119:154;;5153:11;5163:1;5153:11;;:::i;:::-;;-1:-1:-1;5222:10:0;5230:2;5222:5;:10;:::i;:::-;5209:24;;:2;:24;:::i;:::-;5196:39;;5179:6;5186;5179:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;5179:56:0;;;;;;;;-1:-1:-1;5250:11:0;5259:2;5250:11;;:::i;:::-;;;5119:154;;10765:231;10843:7;10864:17;10883:18;10905:27;10916:4;10922:9;10905:10;:27::i;:::-;10863:69;;;;10943:18;10955:5;10943:11;:18::i;:::-;-1:-1:-1;10979:9:0;10765:231;-1:-1:-1;;;10765:231:0:o;56428:229::-;56493:7;;56513:9;:29;;;;;;;;:::i;:::-;;:63;;;-1:-1:-1;56559:17:0;56546:9;:30;;;;;;;;:::i;:::-;;56513:63;56509:112;;;-1:-1:-1;;56594:19:0;;;56428:229::o;56509:112::-;-1:-1:-1;;56634:17:0;;;56428:229::o;55463:394::-;55547:7;55580:17;55567:9;:30;;;;;;;;:::i;:::-;;55563:289;;;55630:11;55615:12;;:26;;;;:::i;:::-;55608:33;;;;55563:289;55672:12;55659:9;:25;;;;;;;;:::i;:::-;;55655:197;;;55712:11;55702:7;;:21;;;;:::i;55655:197::-;55754:16;55741:9;:29;;;;;;;;:::i;:::-;;55737:115;;;55802:11;55788;;:25;;;;:::i;55737:115::-;-1:-1:-1;55843:1:0;55836:8;;59768:251;59882:9;59877:137;59901:11;59897:1;:15;59877:137;;;59928:29;59942:3;59947:9;59928:13;:29::i;:::-;59966:40;59976:3;59981:24;59995:9;59981:13;:24::i;:::-;59966:9;:40::i;:::-;59914:3;;;;:::i;:::-;;;;59877:137;;51622:799;51777:4;-1:-1:-1;;;;;51798:13:0;;23488:19;:23;51794:620;;51834:72;;-1:-1:-1;;;51834:72:0;;-1:-1:-1;;;;;51834:36:0;;;;;:72;;16641:10;;51885:4;;51891:7;;51900:5;;51834:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51834:72:0;;;;;;;;-1:-1:-1;;51834:72:0;;;;;;;;;;;;:::i;:::-;;;51830:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52076:13:0;;52072:272;;52119:60;;-1:-1:-1;;;52119:60:0;;;;;;;:::i;52072:272::-;52294:6;52288:13;52279:6;52275:2;52271:15;52264:38;51830:529;-1:-1:-1;;;;;;51957:51:0;-1:-1:-1;;;51957:51:0;;-1:-1:-1;51950:58:0;;51794:620;-1:-1:-1;52398:4:0;51622:799;;;;;;:::o;8655:1308::-;8736:7;8745:12;8970:9;:16;8990:2;8970:22;8966:990;;;9266:4;9251:20;;9245:27;9316:4;9301:20;;9295:27;9374:4;9359:20;;9353:27;9009:9;9345:36;9417:25;9428:4;9345:36;9245:27;9295;9417:10;:25::i;:::-;9410:32;;;;;;;;;8966:990;9464:9;:16;9484:2;9464:22;9460:496;;;9739:4;9724:20;;9718:27;9790:4;9775:20;;9769:27;9832:23;9843:4;9718:27;9769;9832:10;:23::i;:::-;9825:30;;;;;;;;9460:496;-1:-1:-1;9904:1:0;;-1:-1:-1;9908:35:0;9460:496;8655:1308;;;;;:::o;6926:643::-;7004:20;6995:5;:29;;;;;;;;:::i;:::-;;6991:571;;;6926:643;:::o;6991:571::-;7102:29;7093:5;:38;;;;;;;;:::i;:::-;;7089:473;;;7148:34;;-1:-1:-1;;;7148:34:0;;10563:2:1;7148:34:0;;;10545:21:1;10602:2;10582:18;;;10575:30;10641:26;10621:18;;;10614:54;10685:18;;7148:34:0;10361:348:1;7089:473:0;7213:35;7204:5;:44;;;;;;;;:::i;:::-;;7200:362;;;7265:41;;-1:-1:-1;;;7265:41:0;;11620:2:1;7265:41:0;;;11602:21:1;11659:2;11639:18;;;11632:30;11698:33;11678:18;;;11671:61;11749:18;;7265:41:0;11418:355:1;7200:362:0;7337:30;7328:5;:39;;;;;;;;:::i;:::-;;7324:238;;;7384:44;;-1:-1:-1;;;7384:44:0;;16468:2:1;7384:44:0;;;16450:21:1;16507:2;16487:18;;;16480:30;16546:34;16526:18;;;16519:62;-1:-1:-1;;;16597:18:1;;;16590:32;16639:19;;7384:44:0;16266:398:1;7324:238:0;7459:30;7450:5;:39;;;;;;;;:::i;:::-;;7446:116;;;7506:44;;-1:-1:-1;;;7506:44:0;;18530:2:1;7506:44:0;;;18512:21:1;18569:2;18549:18;;;18542:30;18608:34;18588:18;;;18581:62;-1:-1:-1;;;18659:18:1;;;18652:32;18701:19;;7506:44:0;18328:398:1;58664:799:0;58752:16;58739:9;:29;;;;;;;;:::i;:::-;;:63;;;-1:-1:-1;58785:17:0;58772:9;:30;;;;;;;;:::i;:::-;;58739:63;58735:723;;;58813:25;:13;3842:19;;3860:1;3842:19;;;3753:127;58813:25;-1:-1:-1;;;;;58847:24:0;;;;;;:19;:24;;;;;:29;;58875:1;;58847:24;:29;;58875:1;;58847:29;:::i;:::-;;;;-1:-1:-1;58735:723:0;;-1:-1:-1;58735:723:0;;58907:12;58894:9;:25;;;;;;;;:::i;:::-;;58890:568;;;58930:21;:9;3842:19;;3860:1;3842:19;;;3753:127;58930:21;-1:-1:-1;;;;;58960:20:0;;;;;;:15;:20;;;;;:25;;58984:1;;58960:20;:25;;58984:1;;58960:25;:::i;58890:568::-;59016:14;59003:9;:27;;;;;;;;:::i;:::-;;58999:459;;;59041:23;:11;3842:19;;3860:1;3842:19;;;3753:127;59041:23;-1:-1:-1;;;;;59073:22:0;;;;;;:17;:22;;;;;:27;;59099:1;;59073:22;:27;;59099:1;;59073:27;:::i;:::-;;;;-1:-1:-1;;;;;;;59109:24:0;;;;;;:19;:24;;;;;:29;;59137:1;;59109:24;:29;;59137:1;;59109:29;:::i;58999:459::-;59169:13;59156:9;:26;;;;;;;;:::i;:::-;;59152:306;;;59193:22;:10;3842:19;;3860:1;3842:19;;;3753:127;59193:22;-1:-1:-1;;;;;59224:21:0;;;;;;:16;:21;;;;;:26;;59249:1;;59224:21;:26;;59249:1;;59224:26;:::i;59152:306::-;59319:17;59306:9;:30;;;;;;;;:::i;:::-;;59302:156;;;59347:26;:14;3842:19;;3860:1;3842:19;;;3753:127;59347:26;-1:-1:-1;;;;;59382:25:0;;;;;;:20;:25;;;;;:30;;59411:1;;59382:25;:30;;59411:1;;59382:30;:::i;:::-;;;;-1:-1:-1;;;;;;;59421:24:0;;;;;;:19;:24;;;;;:29;;59449:1;;59421:24;:29;;59449:1;;59421:29;:::i;:::-;;;;-1:-1:-1;;58664:799:0;;:::o;59469:293::-;59535:7;59568:12;59555:9;:25;;;;;;;;:::i;:::-;;59551:95;;;59619:9;3723:14;59598:40;;54373:3;59598:40;:::i;59551:95::-;59732:14;3723;59709:10;3723:14;59685:11;3723:14;59659:13;3723:14;59659:47;;;;:::i;:::-;:70;;;;:::i;:::-;:97;;;;:::i;47264:110::-;47340:26;47350:2;47354:7;47340:26;;;;;;;;;;;;:9;:26::i;12217:1632::-;12348:7;;13282:66;13269:79;;13265:163;;;-1:-1:-1;13381:1:0;;-1:-1:-1;13385:30:0;13365:51;;13265:163;13442:1;:7;;13447:2;13442:7;;:18;;;;;13453:1;:7;;13458:2;13453:7;;13442:18;13438:102;;;-1:-1:-1;13493:1:0;;-1:-1:-1;13497:30:0;13477:51;;13438:102;13654:24;;;13637:14;13654:24;;;;;;;;;9961:25:1;;;10034:4;10022:17;;10002:18;;;9995:45;;;;10056:18;;;10049:34;;;10099:18;;;10092:34;;;13654:24:0;;9933:19:1;;13654:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13654:24:0;;-1:-1:-1;;13654:24:0;;;-1:-1:-1;;;;;;;13693:20:0;;13689:103;;13746:1;13750:29;13730:50;;;;;;;13689:103;13812:6;-1:-1:-1;13820:20:0;;-1:-1:-1;12217:1632:0;;;;;;;;:::o;11259:344::-;11373:7;;-1:-1:-1;;;;;11419:80:0;;11373:7;11526:25;11542:3;11527:18;;;11549:2;11526:25;:::i;:::-;11510:42;;11570:25;11581:4;11587:1;11590;11593;11570:10;:25::i;:::-;11563:32;;;;;;11259:344;;;;;;:::o;47601:321::-;47731:18;47737:2;47741:7;47731:5;:18::i;:::-;47782:54;47813:1;47817:2;47821:7;47830:5;47782:22;:54::i;:::-;47760:154;;;;-1:-1:-1;;;47760:154:0;;;;;;;:::i;48258:439::-;-1:-1:-1;;;;;48338:16:0;;48330:61;;;;-1:-1:-1;;;48330:61:0;;18933:2:1;48330:61:0;;;18915:21:1;;;18952:18;;;18945:30;19011:34;18991:18;;;18984:62;19063:18;;48330:61:0;18731:356:1;48330:61:0;46345:4;46369:16;;;:7;:16;;;;;;-1:-1:-1;;;;;46369:16:0;:30;48402:58;;;;-1:-1:-1;;;48402:58:0;;14308:2:1;48402:58:0;;;14290:21:1;14347:2;14327:18;;;14320:30;14386;14366:18;;;14359:58;14434:18;;48402:58:0;14106:352:1;48402:58:0;-1:-1:-1;;;;;48531:13:0;;;;;;:9;:13;;;;;:18;;48548:1;;48531:13;:18;;48548:1;;48531:18;:::i;:::-;;;;-1:-1:-1;;48560:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;48560:21:0;-1:-1:-1;;;;;48560:21:0;;;;;;;;48599:33;;48560:16;;;48599:33;;48560:16;;48599:33;62996:22:::1;62922:102:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;828:160;893:20;;949:13;;942:21;932:32;;922:60;;978:1;975;968:12;993:149;1067:20;;1116:1;1106:12;;1096:40;;1132:1;1129;1122:12;1147:186;1206:6;1259:2;1247:9;1238:7;1234:23;1230:32;1227:52;;;1275:1;1272;1265:12;1227:52;1298:29;1317:9;1298:29;:::i;1338:260::-;1406:6;1414;1467:2;1455:9;1446:7;1442:23;1438:32;1435:52;;;1483:1;1480;1473:12;1435:52;1506:29;1525:9;1506:29;:::i;:::-;1496:39;;1554:38;1588:2;1577:9;1573:18;1554:38;:::i;:::-;1544:48;;1338:260;;;;;:::o;1603:328::-;1680:6;1688;1696;1749:2;1737:9;1728:7;1724:23;1720:32;1717:52;;;1765:1;1762;1755:12;1717:52;1788:29;1807:9;1788:29;:::i;:::-;1778:39;;1836:38;1870:2;1859:9;1855:18;1836:38;:::i;:::-;1826:48;;1921:2;1910:9;1906:18;1893:32;1883:42;;1603:328;;;;;:::o;1936:666::-;2031:6;2039;2047;2055;2108:3;2096:9;2087:7;2083:23;2079:33;2076:53;;;2125:1;2122;2115:12;2076:53;2148:29;2167:9;2148:29;:::i;:::-;2138:39;;2196:38;2230:2;2219:9;2215:18;2196:38;:::i;:::-;2186:48;;2281:2;2270:9;2266:18;2253:32;2243:42;;2336:2;2325:9;2321:18;2308:32;2363:18;2355:6;2352:30;2349:50;;;2395:1;2392;2385:12;2349:50;2418:22;;2471:4;2463:13;;2459:27;-1:-1:-1;2449:55:1;;2500:1;2497;2490:12;2449:55;2523:73;2588:7;2583:2;2570:16;2565:2;2561;2557:11;2523:73;:::i;:::-;2513:83;;;1936:666;;;;;;;:::o;2607:254::-;2672:6;2680;2733:2;2721:9;2712:7;2708:23;2704:32;2701:52;;;2749:1;2746;2739:12;2701:52;2772:29;2791:9;2772:29;:::i;:::-;2762:39;;2820:35;2851:2;2840:9;2836:18;2820:35;:::i;2866:278::-;2946:6;2954;3007:2;2995:9;2986:7;2982:23;2978:32;2975:52;;;3023:1;3020;3013:12;2975:52;3046:29;3065:9;3046:29;:::i;:::-;3036:39;;3094:44;3134:2;3123:9;3119:18;3094:44;:::i;3149:254::-;3217:6;3225;3278:2;3266:9;3257:7;3253:23;3249:32;3246:52;;;3294:1;3291;3284:12;3246:52;3317:29;3336:9;3317:29;:::i;:::-;3307:39;3393:2;3378:18;;;;3365:32;;-1:-1:-1;;;3149:254:1:o;3408:180::-;3464:6;3517:2;3505:9;3496:7;3492:23;3488:32;3485:52;;;3533:1;3530;3523:12;3485:52;3556:26;3572:9;3556:26;:::i;3593:245::-;3651:6;3704:2;3692:9;3683:7;3679:23;3675:32;3672:52;;;3720:1;3717;3710:12;3672:52;3759:9;3746:23;3778:30;3802:5;3778:30;:::i;3843:249::-;3912:6;3965:2;3953:9;3944:7;3940:23;3936:32;3933:52;;;3981:1;3978;3971:12;3933:52;4013:9;4007:16;4032:30;4056:5;4032:30;:::i;4097:204::-;4168:6;4221:2;4209:9;4200:7;4196:23;4192:32;4189:52;;;4237:1;4234;4227:12;4189:52;4260:35;4285:9;4260:35;:::i;4306:272::-;4386:6;4394;4447:2;4435:9;4426:7;4422:23;4418:32;4415:52;;;4463:1;4460;4453:12;4415:52;4486:35;4511:9;4486:35;:::i;4583:450::-;4652:6;4705:2;4693:9;4684:7;4680:23;4676:32;4673:52;;;4721:1;4718;4711:12;4673:52;4761:9;4748:23;4794:18;4786:6;4783:30;4780:50;;;4826:1;4823;4816:12;4780:50;4849:22;;4902:4;4894:13;;4890:27;-1:-1:-1;4880:55:1;;4931:1;4928;4921:12;4880:55;4954:73;5019:7;5014:2;5001:16;4996:2;4992;4988:11;4954:73;:::i;5038:180::-;5097:6;5150:2;5138:9;5129:7;5125:23;5121:32;5118:52;;;5166:1;5163;5156:12;5118:52;-1:-1:-1;5189:23:1;;5038:180;-1:-1:-1;5038:180:1:o;5223:751::-;5323:6;5331;5339;5347;5400:2;5388:9;5379:7;5375:23;5371:32;5368:52;;;5416:1;5413;5406:12;5368:52;5452:9;5439:23;5429:33;;5481:44;5521:2;5510:9;5506:18;5481:44;:::i;:::-;5471:54;;5576:2;5565:9;5561:18;5548:32;5599:18;5640:2;5632:6;5629:14;5626:34;;;5656:1;5653;5646:12;5626:34;5694:6;5683:9;5679:22;5669:32;;5739:7;5732:4;5728:2;5724:13;5720:27;5710:55;;5761:1;5758;5751:12;5710:55;5801:2;5788:16;5827:2;5819:6;5816:14;5813:34;;;5843:1;5840;5833:12;5813:34;5888:7;5883:2;5874:6;5870:2;5866:15;5862:24;5859:37;5856:57;;;5909:1;5906;5899:12;5856:57;5223:751;;;;-1:-1:-1;;5940:2:1;5932:11;;-1:-1:-1;;;5223:751:1:o;5979:257::-;6020:3;6058:5;6052:12;6085:6;6080:3;6073:19;6101:63;6157:6;6150:4;6145:3;6141:14;6134:4;6127:5;6123:16;6101:63;:::i;:::-;6218:2;6197:15;-1:-1:-1;;6193:29:1;6184:39;;;;6225:4;6180:50;;5979:257;-1:-1:-1;;5979:257:1:o;6241:1527::-;6465:3;6503:6;6497:13;6529:4;6542:51;6586:6;6581:3;6576:2;6568:6;6564:15;6542:51;:::i;:::-;6656:13;;6615:16;;;;6678:55;6656:13;6615:16;6700:15;;;6678:55;:::i;:::-;6822:13;;6755:20;;;6795:1;;6882;6904:18;;;;6957;;;;6984:93;;7062:4;7052:8;7048:19;7036:31;;6984:93;7125:2;7115:8;7112:16;7092:18;7089:40;7086:167;;;-1:-1:-1;;;7152:33:1;;7208:4;7205:1;7198:15;7238:4;7159:3;7226:17;7086:167;7269:18;7296:110;;;;7420:1;7415:328;;;;7262:481;;7296:110;-1:-1:-1;;7331:24:1;;7317:39;;7376:20;;;;-1:-1:-1;7296:110:1;;7415:328;23798:1;23791:14;;;23835:4;23822:18;;7510:1;7524:169;7538:8;7535:1;7532:15;7524:169;;;7620:14;;7605:13;;;7598:37;7663:16;;;;7555:10;;7524:169;;;7528:3;;7724:8;7717:5;7713:20;7706:27;;7262:481;-1:-1:-1;7759:3:1;;6241:1527;-1:-1:-1;;;;;;;;;;;6241:1527:1:o;8588:488::-;-1:-1:-1;;;;;8857:15:1;;;8839:34;;8909:15;;8904:2;8889:18;;8882:43;8956:2;8941:18;;8934:34;;;9004:3;8999:2;8984:18;;8977:31;;;8782:4;;9025:45;;9050:19;;9042:6;9025:45;:::i;:::-;9017:53;8588:488;-1:-1:-1;;;;;;8588:488:1:o;10137:219::-;10286:2;10275:9;10268:21;10249:4;10306:44;10346:2;10335:9;10331:18;10323:6;10306:44;:::i;12124:414::-;12326:2;12308:21;;;12365:2;12345:18;;;12338:30;12404:34;12399:2;12384:18;;12377:62;-1:-1:-1;;;12470:2:1;12455:18;;12448:48;12528:3;12513:19;;12124:414::o;19505:356::-;19707:2;19689:21;;;19726:18;;;19719:30;19785:34;19780:2;19765:18;;19758:62;19852:2;19837:18;;19505:356::o;21722:413::-;21924:2;21906:21;;;21963:2;21943:18;;;21936:30;22002:34;21997:2;21982:18;;21975:62;-1:-1:-1;;;22068:2:1;22053:18;;22046:47;22125:3;22110:19;;21722:413::o;23851:128::-;23891:3;23922:1;23918:6;23915:1;23912:13;23909:39;;;23928:18;;:::i;:::-;-1:-1:-1;23964:9:1;;23851:128::o;23984:120::-;24024:1;24050;24040:35;;24055:18;;:::i;:::-;-1:-1:-1;24089:9:1;;23984:120::o;24109:168::-;24149:7;24215:1;24211;24207:6;24203:14;24200:1;24197:21;24192:1;24185:9;24178:17;24174:45;24171:71;;;24222:18;;:::i;:::-;-1:-1:-1;24262:9:1;;24109:168::o;24282:125::-;24322:4;24350:1;24347;24344:8;24341:34;;;24355:18;;:::i;:::-;-1:-1:-1;24392:9:1;;24282:125::o;24412:258::-;24484:1;24494:113;24508:6;24505:1;24502:13;24494:113;;;24584:11;;;24578:18;24565:11;;;24558:39;24530:2;24523:10;24494:113;;;24625:6;24622:1;24619:13;24616:48;;;-1:-1:-1;;24660:1:1;24642:16;;24635:27;24412:258::o;24675:380::-;24754:1;24750:12;;;;24797;;;24818:61;;24872:4;24864:6;24860:17;24850:27;;24818:61;24925:2;24917:6;24914:14;24894:18;24891:38;24888:161;;;24971:10;24966:3;24962:20;24959:1;24952:31;25006:4;25003:1;24996:15;25034:4;25031:1;25024:15;24888:161;;24675:380;;;:::o;25060:135::-;25099:3;-1:-1:-1;;25120:17:1;;25117:43;;;25140:18;;:::i;:::-;-1:-1:-1;25187:1:1;25176:13;;25060:135::o;25200:112::-;25232:1;25258;25248:35;;25263:18;;:::i;:::-;-1:-1:-1;25297:9:1;;25200:112::o;25317:127::-;25378:10;25373:3;25369:20;25366:1;25359:31;25409:4;25406:1;25399:15;25433:4;25430:1;25423:15;25449:127;25510:10;25505:3;25501:20;25498:1;25491:31;25541:4;25538:1;25531:15;25565:4;25562:1;25555:15;25581:127;25642:10;25637:3;25633:20;25630:1;25623:31;25673:4;25670:1;25663:15;25697:4;25694:1;25687:15;25713:127;25774:10;25769:3;25765:20;25762:1;25755:31;25805:4;25802:1;25795:15;25829:4;25826:1;25819:15;25845:127;25906:10;25901:3;25897:20;25894:1;25887:31;25937:4;25934:1;25927:15;25961:4;25958:1;25951:15;25977:131;-1:-1:-1;;;;;;26051:32:1;;26041:43;;26031:71;;26098:1;26095;26088:12

Swarm Source

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