ETH Price: $3,434.88 (+3.63%)

Token

HAYY (HAYY)
 

Overview

Max Total Supply

1,077,283 HAYY

Holders

291

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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:
HAYY

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

// SPDX-License-Identifier: MIT
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts v4.4.1 (utils/structs/EnumerableSet.sol)

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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 overridden 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 || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721Burnable.sol


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

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

// File: wgg.sol



pragma solidity 0.8.7;




contract WGG is ERC721Burnable, Ownable {
   
    using Strings for uint256;
    using Counters for Counters.Counter;
    
    string public baseURI;
    string public baseExtension = ".json";
    uint8 public maxTx = 3;
    uint256 public maxSupply = 10000;
    uint256 public price = 0.08 ether;
    
    bool public goatPresaleOpen = true;
    bool public goatMainsaleOpen = false;
    
    Counters.Counter private _tokenIdTracker;

    mapping (address => bool) whiteListed;
    mapping (address => uint256) walletMinted;
    
    constructor(string memory _initBaseURI) ERC721("Wild Goat Gang", "WGG")
    {
        setBaseURI(_initBaseURI);

        for(uint i=0;i<10;i++)
        {
            _tokenIdTracker.increment();
            _safeMint(msg.sender, totalToken());
        }
    }
    
    modifier isPresaleOpen
    {
         require(goatPresaleOpen == true);
         _;
    }

    modifier isMainsaleOpen
    {
         require(goatMainsaleOpen == true);
         _;
    }

    function flipPresale() public onlyOwner
    {
        goatPresaleOpen = false;
        goatMainsaleOpen = true;
    }

    function changeMaxSupply(uint256 _maxSupply) public onlyOwner
    {
        maxSupply = _maxSupply;
    }
    
    function totalToken() public view returns (uint256) {
            return _tokenIdTracker.current();
    }

    function addWhiteList(address[] memory whiteListedAddresses) public onlyOwner
    {
        for(uint256 i=0; i<whiteListedAddresses.length;i++)
        {
            whiteListed[whiteListedAddresses[i]] = true;
        }
    }

    function isAddressWhitelisted(address whitelist) public view returns(bool)
    {
        return whiteListed[whitelist];
    }


    function preSale(uint8 mintTotal) public payable isPresaleOpen
    {
        uint256 totalMinted = mintTotal + walletMinted[msg.sender];
        
        require(whiteListed[msg.sender] == true, "You are not whitelisted!");
        require(totalMinted <= maxTx, "Mint exceeds limitations");
        require(mintTotal >= 1 , "Mint Amount Incorrect");
        require(msg.value >= price * mintTotal, "Minting a Wild Goat Costs 0.08 Ether Each!");
        require(totalToken() < maxSupply, "SOLD OUT!");
       
        for(uint i=0;i<mintTotal;i++)
        {
            require(totalToken() < maxSupply, "SOLD OUT!");
            _tokenIdTracker.increment();
            _safeMint(msg.sender, totalToken());
        }
    }

    
    function mainSale(uint8 mintTotal) public payable isMainsaleOpen
    {
        uint256 totalMinted = mintTotal + walletMinted[msg.sender];

        require(totalMinted <= maxTx, "Mint exceeds limitations");
        require(mintTotal >= 1 , "Mint Amount Incorrect");
        require(msg.value >= price * mintTotal, "Minting a Wild Goat Costs 0.08 Ether Each!");
        require(totalToken() < maxSupply, "SOLD OUT!");
       
        for(uint i=0;i<mintTotal;i++)
        {
            require(totalToken() < maxSupply, "SOLD OUT!");
            _tokenIdTracker.increment();
            _safeMint(msg.sender, totalToken());
        }
    }
   
    function withdrawContractEther() external onlyOwner
    {
        address payable teamOne = payable(0x9f199f62a1aCb6877AC6C82759Df34B24A484e9C);
        address payable teamTwo = payable(0x1599f9F775451DBd03a1a951d4D93107900276A4);
        address payable teamThree = payable(0xEEe7dB024C2c629556Df7F80f528913048f12fbc);
        address payable teamFour = payable(0xD43763625605fF5894100B24Db41EB19A9c0E65e);
        
        uint256 totalSplit = (getBalance() / 4);

        teamOne.transfer(totalSplit);
        teamTwo.transfer(totalSplit);
        teamThree.transfer(totalSplit);
        teamFour.transfer(totalSplit);

    }
    function getBalance() public view returns(uint)
    {
        return address(this).balance;
    }
   
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }
   
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }
   
    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(), baseExtension)) : "";
    }
}
// File: ERC20I.sol


pragma solidity ^0.8.0;

contract ERC20I {
    // Token Params
    string public name;
    string public symbol;
    constructor(string memory name_, string memory symbol_) {
        name = name_;
        symbol = symbol_;
    }

    // Decimals
    uint8 public constant decimals = 18;

    // Supply
    uint256 public totalSupply;
    
    // Mappings of Balances
    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(address => uint256)) public allowance;

    // Events
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    // Internal Functions
    function _mint(address to_, uint256 amount_) internal virtual {
        totalSupply += amount_;
        balanceOf[to_] += amount_;
        emit Transfer(address(0x0), to_, amount_);
    }
    function _burn(address from_, uint256 amount_) internal virtual {
        balanceOf[from_] -= amount_;
        totalSupply -= amount_;
        emit Transfer(from_, address(0x0), amount_);
    }
    function _approve(address owner_, address spender_, uint256 amount_) internal virtual {
        allowance[owner_][spender_] = amount_;
        emit Approval(owner_, spender_, amount_);
    }

    // Public Functions
    function approve(address spender_, uint256 amount_) public virtual returns (bool) {
        _approve(msg.sender, spender_, amount_);
        return true;
    }
    function transfer(address to_, uint256 amount_) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount_;
        balanceOf[to_] += amount_;
        emit Transfer(msg.sender, to_, amount_);
        return true;
    }
    function transferFrom(address from_, address to_, uint256 amount_) public virtual returns (bool) {
        if (allowance[from_][msg.sender] != type(uint256).max) {
            allowance[from_][msg.sender] -= amount_; }
        balanceOf[from_] -= amount_;
        balanceOf[to_] += amount_;
        emit Transfer(from_, to_, amount_);
        return true;
    }

    // 0xInuarashi Custom Functions
    function multiTransfer(address[] memory to_, uint256[] memory amounts_) public virtual {
        require(to_.length == amounts_.length, "ERC20I: To and Amounts length Mismatch!");
        for (uint256 i = 0; i < to_.length; i++) {
            transfer(to_[i], amounts_[i]);
        }
    }
    function multiTransferFrom(address[] memory from_, address[] memory to_, uint256[] memory amounts_) public virtual {
        require(from_.length == to_.length && from_.length == amounts_.length, "ERC20I: From, To, and Amounts length Mismatch!");
        for (uint256 i = 0; i < from_.length; i++) {
            transferFrom(from_[i], to_[i], amounts_[i]);
        }
    }
}

abstract contract ERC20IBurnable is ERC20I {
    function burn(uint256 amount_) external virtual {
        _burn(msg.sender, amount_);
    }
    function burnFrom(address from_, uint256 amount_) public virtual {
        uint256 _currentAllowance = allowance[from_][msg.sender];
        require(_currentAllowance >= amount_, "ERC20IBurnable: Burn amount requested exceeds allowance!");

        if (allowance[from_][msg.sender] != type(uint256).max) {
            allowance[from_][msg.sender] -= amount_; }

        _burn(from_, amount_);
    }
}
// File: hayy.sol


pragma solidity 0.8.7;


contract HAYY is ERC20IBurnable, IERC721Receiver, Ownable {

    constructor() ERC20I("HAYY", "HAYY") {}

    using EnumerableSet for EnumerableSet.UintSet;

    mapping(address => EnumerableSet.UintSet) private _deposits;
    mapping(address => bool) public addressStaked;
    mapping(uint256 => uint256) public tokenIDDays;

    WGG public wildGoat = WGG(0xd151BbC88DB8A7803a2ca7a9722037aBdAca9B8e);

    uint256 ratePerDay = 10 ether; 
    uint256 lockingPeriod = 1;

    uint256 tier1Hayy = 600 ether;
    uint256 tier1Cost = 0.5 ether;

    uint256 tier2Hayy = 1000 ether;
    uint256 tier2Cost = 1 ether;

    uint256 tier3Hayy = 2250 ether;
    uint256 tier3Cost = 2.5 ether;

    uint256[] public burnedTokens;

    function addBurnedTokens(uint256 tokenId) public onlyOwner
    {
        burnedTokens.push(tokenId);
    }

    function changeTier1(uint256 totalHayy, uint256 hayCost) public onlyOwner
    {
        tier1Hayy = (totalHayy * 10 ** 18);
        tier1Cost = (hayCost * 10 ** 18);
    }

    function changeTier2(uint256 totalHayy, uint256 hayCost) public onlyOwner
    {
        tier2Hayy = (totalHayy * 10 ** 18);
        tier2Cost = (hayCost * 10 ** 18);
    }

    function changeTier3(uint256 totalHayy, uint256 hayCost) public onlyOwner
    {
        tier3Hayy = (totalHayy * 10 ** 18);
        tier3Cost = (hayCost * 10 ** 18);
    }

    function devMint(uint256 amount) public onlyOwner
    {
        _mint(msg.sender, (amount * 10 ** 18));
    }

    function setWGGAddress(address incoming) public onlyOwner
    {
        wildGoat = WGG(incoming);
    }

    function buyHayy(uint256 tierLevel) public payable
    {
        require(tierLevel >= 1 && tierLevel <= 3);
        if(tierLevel == 1)
        {
            require(msg.value >= tier1Cost);
            _mint(msg.sender, tier1Hayy);
        }
        else if(tierLevel == 2)
        {
            require(msg.value >= tier2Cost);
            _mint(msg.sender, tier2Hayy);
        }
        else if(tierLevel == 3)
        {
            require(msg.value >= tier3Cost);
            _mint(msg.sender, tier3Hayy);
        }
    }
    
    function changeRatePerDay(uint256 _rate) public onlyOwner
    {
        ratePerDay = (_rate * 10 ** 18);
    }

    function changeLockingPeriod(uint256 _period) public onlyOwner
    {
        lockingPeriod = _period;
    }

    function stakeGoat(uint256[] calldata tokenIDs) external {
        
        require(wildGoat.isApprovedForAll(msg.sender, address(this)), "You are not Approved!");
        
        
        for (uint256 i; i < tokenIDs.length; i++) {
            wildGoat.safeTransferFrom(
                msg.sender,
                address(this),
                tokenIDs[i],
                ''
            );
            
            _deposits[msg.sender].add(tokenIDs[i]);
            addressStaked[msg.sender] = true;
            tokenIDDays[tokenIDs[i]] = block.timestamp;
        }
        
    }

    function unstakeGoat(uint256[] calldata tokenIds) external {
        
        require(wildGoat.isApprovedForAll(msg.sender, address(this)), "You are not Approved!");
        
        this.claimHayy();

        for (uint256 i; i < tokenIds.length; i++) {
            require(
                _deposits[msg.sender].contains(tokenIds[i]),
                'Token not deposited'
            );

            require(daysStaked(tokenIds[i]) >= lockingPeriod, "You must be staked for at least 3 days!");
            
            _deposits[msg.sender].remove(tokenIds[i]);
            
            wildGoat.safeTransferFrom(
                address(this),
                msg.sender,
                tokenIds[i],
                ''
            );
        }
        if(_deposits[msg.sender].length() < 1)
        {
            addressStaked[msg.sender] = false;
        }
    }

    function returnStakedGoats() public view returns (uint256[] memory)
    {
        return _deposits[msg.sender].values();
    }

    function claimHayy() external
    {
        uint256 totalReward = 0;
        for(uint256 i = 0; i < _deposits[msg.sender].length(); i++)
        {
            totalReward += rewardsToPay(_deposits[msg.sender].at(i));
            tokenIDDays[_deposits[msg.sender].at(i)] = block.timestamp;
        }
        _mint(msg.sender, totalReward);
    }

    function rewardsToPay(uint256 tokenID) internal view returns(uint256)
    {
        uint256 earnedRewards = daysStaked(tokenID) * ratePerDay;
                
        return earnedRewards;
    }

    function daysStaked(uint256 tokenID) public view returns(uint256)
    {
        
        require(
            _deposits[msg.sender].contains(tokenID),
            'Token not deposited'
        );
        
        uint256 returndays;
        uint256 timeCalc = block.timestamp - tokenIDDays[tokenID];
        returndays = timeCalc / 86400;
       
        return returndays;
    }

    function totalYieldEarned() public view returns(uint256)
    {
        uint256 totalReward = 0;
        for(uint256 i = 0; i < _deposits[msg.sender].length(); i++)
        {
            totalReward += rewardsToPay(_deposits[msg.sender].at(i));
        }
        return totalReward;
    }

    function goatsStaked() public view returns (uint256[] memory)
    {
        return _deposits[msg.sender].values();
    }

    function withdrawContractEther() external onlyOwner
    {
        payable(msg.sender).transfer(address(this).balance);
    }

    function walletOfOwner(address address_) public view returns (uint256[] memory) {
        uint256 _balance = wildGoat.balanceOf(address_);
        if (_balance == 0) return new uint256[](0);

        uint256[] memory _tokens = new uint256[] (_balance);
        uint256 _index;
        bool burned = false;
        
        
        for (uint256 i = 1; i <= wildGoat.totalToken(); i++) {
            burned = false;
            
            for(uint256 x=0; x<burnedTokens.length;x++)
            {
                if(i == burnedTokens[x])
                {
                    burned = true;
                }
            }
            if(!burned)
            {
                if (wildGoat.ownerOf(i) == address_) {
                    _tokens[_index] = i; _index++;
                }
            }

        }
        return _tokens;
    }

    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external pure override returns (bytes4) {
        return IERC721Receiver.onERC721Received.selector;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"addBurnedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tierLevel","type":"uint256"}],"name":"buyHayy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"changeLockingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"changeRatePerDay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalHayy","type":"uint256"},{"internalType":"uint256","name":"hayCost","type":"uint256"}],"name":"changeTier1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalHayy","type":"uint256"},{"internalType":"uint256","name":"hayCost","type":"uint256"}],"name":"changeTier2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalHayy","type":"uint256"},{"internalType":"uint256","name":"hayCost","type":"uint256"}],"name":"changeTier3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimHayy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"daysStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"goatsStaked","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"name":"multiTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"from_","type":"address[]"},{"internalType":"address[]","name":"to_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"name":"multiTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"returnStakedGoats","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"incoming","type":"address"}],"name":"setWGGAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIDs","type":"uint256[]"}],"name":"stakeGoat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIDDays","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalYieldEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeGoat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wildGoat","outputs":[{"internalType":"contract WGG","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawContractEther","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600980546001600160a01b03191673d151bbc88db8a7803a2ca7a9722037abdaca9b8e179055678ac7230489e80000600a556001600b55682086ac351052600000600c556706f05b59d3b20000600d55683635c9adc5dea00000600e55670de0b6b3a7640000600f556879f905c6fd34e800006010556722b1c8c1227a00006011553480156200009357600080fd5b506040805180820182526004808252634841595960e01b602080840182815285518087019096529285528401528151919291620000d39160009162000162565b508051620000e990600190602084019062000162565b50505062000106620001006200010c60201b60201c565b62000110565b62000245565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001709062000208565b90600052602060002090601f016020900481019282620001945760008555620001df565b82601f10620001af57805160ff1916838001178555620001df565b82800160010185558215620001df579182015b82811115620001df578251825591602001919060010190620001c2565b50620001ed929150620001f1565b5090565b5b80821115620001ed5760008155600101620001f2565b600181811c908216806200021d57607f821691505b602082108114156200023f57634e487b7160e01b600052602260045260246000fd5b50919050565b6124e080620002556000396000f3fe6080604052600436106102305760003560e01c806370a082311161012e578063a9059cbb116100ab578063d7ca7cc51161006f578063d7ca7cc51461068c578063dd62ed3e146106ac578063e74d059f146106e4578063ec03cfdf14610714578063f2fde38b1461073457600080fd5b8063a9059cbb146105ea578063c9359d151461060a578063cc00967914610637578063ce3d179c1461064c578063d5e7be561461066c57600080fd5b80638313e905116100f25780638313e905146105505780638da5cb5b14610563578063906ca0231461059557806392e47417146105b557806395d89b41146105d557600080fd5b806370a08231146104ae578063715018a6146104db57806371ab145c146104f057806379cc6790146105105780637bde17a31461053057600080fd5b806323c8bcd5116101bc578063438b630011610180578063438b63001461044457806352143d4d146104645780635c77ddab14610479578063642f063b14610290578063671388c01461048e57600080fd5b806323c8bcd51461039d57806328b5ddc7146103bd578063313ce567146103dd578063375a069a1461040457806342966c681461042457600080fd5b8063150b7a0211610203578063150b7a02146102d457806318160ddd146103195780631c348dd31461033d5780631e89d5451461035d57806323b872dd1461037d57600080fd5b806306fdde0314610235578063095ea7b3146102605780630b65d1df1461029057806311d3ed36146102b2575b600080fd5b34801561024157600080fd5b5061024a610754565b604051610257919061227e565b60405180910390f35b34801561026c57600080fd5b5061028061027b366004612037565b6107e2565b6040519015158152602001610257565b34801561029c57600080fd5b506102a56107f9565b604051610257919061223a565b3480156102be57600080fd5b506102d26102cd366004612218565b610819565b005b3480156102e057600080fd5b506103006102ef366004611f98565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610257565b34801561032557600080fd5b5061032f60025481565b604051908152602001610257565b34801561034957600080fd5b5061032f6103583660046121e6565b61087a565b34801561036957600080fd5b506102d26103783660046120eb565b61089b565b34801561038957600080fd5b50610280610398366004611f57565b61095c565b3480156103a957600080fd5b506102d26103b836600461214f565b610a62565b3480156103c957600080fd5b506102d26103d83660046121e6565b610c65565b3480156103e957600080fd5b506103f2601281565b60405160ff9091168152602001610257565b34801561041057600080fd5b506102d261041f3660046121e6565b610cc4565b34801561043057600080fd5b506102d261043f3660046121e6565b610d0c565b34801561045057600080fd5b506102a561045f366004611ee4565b610d16565b34801561047057600080fd5b506102d2610fb7565b34801561048557600080fd5b506102d2611056565b34801561049a57600080fd5b506102d26104a93660046121e6565b6110ac565b3480156104ba57600080fd5b5061032f6104c9366004611ee4565b60036020526000908152604090205481565b3480156104e757600080fd5b506102d26110ee565b3480156104fc57600080fd5b506102d261050b366004612218565b611124565b34801561051c57600080fd5b506102d261052b366004612037565b61117c565b34801561053c57600080fd5b506102d261054b366004612063565b611285565b6102d261055e3660046121e6565b611375565b34801561056f57600080fd5b506005546001600160a01b03165b6040516001600160a01b039091168152602001610257565b3480156105a157600080fd5b506102d26105b0366004612218565b6113fc565b3480156105c157600080fd5b5061032f6105d03660046121e6565b611454565b3480156105e157600080fd5b5061024a6114e1565b3480156105f657600080fd5b50610280610605366004612037565b6114ee565b34801561061657600080fd5b5061032f6106253660046121e6565b60086020526000908152604090205481565b34801561064357600080fd5b5061032f611578565b34801561065857600080fd5b506102d2610667366004611ee4565b6115dd565b34801561067857600080fd5b5060095461057d906001600160a01b031681565b34801561069857600080fd5b506102d26106a73660046121e6565b611629565b3480156106b857600080fd5b5061032f6106c7366004611f1e565b600460209081526000928352604080842090915290825290205481565b3480156106f057600080fd5b506102806106ff366004611ee4565b60076020526000908152604090205460ff1681565b34801561072057600080fd5b506102d261072f36600461214f565b611658565b34801561074057600080fd5b506102d261074f366004611ee4565b611999565b60008054610761906123cd565b80601f016020809104026020016040519081016040528092919081815260200182805461078d906123cd565b80156107da5780601f106107af576101008083540402835291602001916107da565b820191906000526020600020905b8154815290600101906020018083116107bd57829003601f168201915b505050505081565b60006107ef338484611a31565b5060015b92915050565b33600090815260066020526040902060609061081490611a92565b905090565b6005546001600160a01b0316331461084c5760405162461bcd60e51b8152600401610843906122d3565b60405180910390fd5b61085e82670de0b6b3a7640000612397565b600e5561087381670de0b6b3a7640000612397565b600f555050565b6012818154811061088a57600080fd5b600091825260209091200154905081565b80518251146108fc5760405162461bcd60e51b815260206004820152602760248201527f4552433230493a20546f20616e6420416d6f756e7473206c656e677468204d69604482015266736d617463682160c81b6064820152608401610843565b60005b82518110156109575761094483828151811061091d5761091d612449565b602002602001015183838151811061093757610937612449565b60200260200101516114ee565b508061094f81612402565b9150506108ff565b505050565b6001600160a01b0383166000908152600460209081526040808320338452909152812054600019146109c1576001600160a01b0384166000908152600460209081526040808320338452909152812080548492906109bb9084906123b6565b90915550505b6001600160a01b038416600090815260036020526040812080548492906109e99084906123b6565b90915550506001600160a01b03831660009081526003602052604081208054849290610a1690849061235d565b92505081905550826001600160a01b0316846001600160a01b031660008051602061248b83398151915284604051610a5091815260200190565b60405180910390a35060019392505050565b60095460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c59060440160206040518083038186803b158015610aab57600080fd5b505afa158015610abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae391906121c4565b610b275760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f7420417070726f7665642160581b6044820152606401610843565b60005b81811015610957576009546001600160a01b031663b88d4fde3330868686818110610b5757610b57612449565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152608060648201526000608482015260a401600060405180830381600087803b158015610bbc57600080fd5b505af1158015610bd0573d6000803e3d6000fd5b50505050610c07838383818110610be957610be9612449565b33600090815260066020908152604090912093910201359050611aa6565b50336000908152600760205260408120805460ff191660011790554290600890858585818110610c3957610c39612449565b905060200201358152602001908152602001600020819055508080610c5d90612402565b915050610b2a565b6005546001600160a01b03163314610c8f5760405162461bcd60e51b8152600401610843906122d3565b601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440155565b6005546001600160a01b03163314610cee5760405162461bcd60e51b8152600401610843906122d3565b610d0933610d0483670de0b6b3a7640000612397565b611ab2565b50565b610d093382611b2a565b6009546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a082319060240160206040518083038186803b158015610d6057600080fd5b505afa158015610d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9891906121ff565b905080610db5575050604080516000815260208101909152919050565b60008167ffffffffffffffff811115610dd057610dd061245f565b604051908082528060200260200182016040528015610df9578160200160208202803683370190505b50905060008060015b600960009054906101000a90046001600160a01b03166001600160a01b031663626be5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8891906121ff565b8111610fac576000915060005b601254811015610edb5760128181548110610eb257610eb2612449565b9060005260206000200154821415610ec957600192505b80610ed381612402565b915050610e95565b5081610f9a576009546040516331a9108f60e11b8152600481018390526001600160a01b03898116921690636352211e9060240160206040518083038186803b158015610f2757600080fd5b505afa158015610f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5f9190611f01565b6001600160a01b03161415610f9a5780848481518110610f8157610f81612449565b602090810291909101015282610f9681612402565b9350505b80610fa481612402565b915050610e02565b509195945050505050565b6000805b336000908152600660205260409020610fd390611b9c565b81101561104b57336000908152600660205260409020610ffc90610ff79083611ba6565b611bb2565b611006908361235d565b3360009081526006602052604081209193504291600891906110289085611ba6565b81526020810191909152604001600020558061104381612402565b915050610fbb565b50610d093382611ab2565b6005546001600160a01b031633146110805760405162461bcd60e51b8152600401610843906122d3565b60405133904780156108fc02916000818181858888f19350505050158015610d09573d6000803e3d6000fd5b6005546001600160a01b031633146110d65760405162461bcd60e51b8152600401610843906122d3565b6110e881670de0b6b3a7640000612397565b600a5550565b6005546001600160a01b031633146111185760405162461bcd60e51b8152600401610843906122d3565b6111226000611bcb565b565b6005546001600160a01b0316331461114e5760405162461bcd60e51b8152600401610843906122d3565b61116082670de0b6b3a7640000612397565b600c5561117581670de0b6b3a7640000612397565b600d555050565b6001600160a01b0382166000908152600460209081526040808320338452909152902054818110156112165760405162461bcd60e51b815260206004820152603860248201527f4552433230494275726e61626c653a204275726e20616d6f756e74207265717560448201527f6573746564206578636565647320616c6c6f77616e63652100000000000000006064820152608401610843565b6001600160a01b03831660009081526004602090815260408083203384529091529020546000191461127b576001600160a01b0383166000908152600460209081526040808320338452909152812080548492906112759084906123b6565b90915550505b6109578383611b2a565b81518351148015611297575080518351145b6112fa5760405162461bcd60e51b815260206004820152602e60248201527f4552433230493a2046726f6d2c20546f2c20616e6420416d6f756e7473206c6560448201526d6e677468204d69736d617463682160901b6064820152608401610843565b60005b835181101561136f5761135c84828151811061131b5761131b612449565b602002602001015184838151811061133557611335612449565b602002602001015184848151811061134f5761134f612449565b602002602001015161095c565b508061136781612402565b9150506112fd565b50505050565b60018110158015611387575060038111155b61139057600080fd5b80600114156113b457600d543410156113a857600080fd5b610d0933600c54611ab2565b80600214156113d857600f543410156113cc57600080fd5b610d0933600e54611ab2565b8060031415610d09576011543410156113f057600080fd5b610d0933601054611ab2565b6005546001600160a01b031633146114265760405162461bcd60e51b8152600401610843906122d3565b61143882670de0b6b3a7640000612397565b60105561144d81670de0b6b3a7640000612397565b6011555050565b33600090815260066020526040812061146d9083611c1d565b6114af5760405162461bcd60e51b8152602060048201526013602482015272151bdad95b881b9bdd0819195c1bdcda5d1959606a1b6044820152606401610843565b60008281526008602052604081205481906114ca90426123b6565b90506114d96201518082612375565b949350505050565b60018054610761906123cd565b3360009081526003602052604081208054839190839061150f9084906123b6565b90915550506001600160a01b0383166000908152600360205260408120805484929061153c90849061235d565b90915550506040518281526001600160a01b03841690339060008051602061248b8339815191529060200160405180910390a350600192915050565b600080805b33600090815260066020526040902061159590611b9c565b8110156115d7573360009081526006602052604090206115b990610ff79083611ba6565b6115c3908361235d565b9150806115cf81612402565b91505061157d565b50919050565b6005546001600160a01b031633146116075760405162461bcd60e51b8152600401610843906122d3565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146116535760405162461bcd60e51b8152600401610843906122d3565b600b55565b60095460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c59060440160206040518083038186803b1580156116a157600080fd5b505afa1580156116b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d991906121c4565b61171d5760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f7420417070726f7665642160581b6044820152606401610843565b306001600160a01b03166352143d4d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561175857600080fd5b505af115801561176c573d6000803e3d6000fd5b5050505060005b8181101561195b576117ae83838381811061179057611790612449565b33600090815260066020908152604090912093910201359050611c1d565b6117f05760405162461bcd60e51b8152602060048201526013602482015272151bdad95b881b9bdd0819195c1bdcda5d1959606a1b6044820152606401610843565b600b5461181484848481811061180857611808612449565b90506020020135611454565b10156118725760405162461bcd60e51b815260206004820152602760248201527f596f75206d757374206265207374616b656420666f72206174206c65617374206044820152663320646179732160c81b6064820152608401610843565b6118a583838381811061188757611887612449565b33600090815260066020908152604090912093910201359050611c35565b506009546001600160a01b031663b88d4fde30338686868181106118cb576118cb612449565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152608060648201526000608482015260a401600060405180830381600087803b15801561193057600080fd5b505af1158015611944573d6000803e3d6000fd5b50505050808061195390612402565b915050611773565b5033600090815260066020526040902060019061197790611b9c565b101561199557336000908152600760205260409020805460ff191690555b5050565b6005546001600160a01b031633146119c35760405162461bcd60e51b8152600401610843906122d3565b6001600160a01b038116611a285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610843565b610d0981611bcb565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60606000611a9f83611c41565b9392505050565b6000611a9f8383611c9d565b8060026000828254611ac4919061235d565b90915550506001600160a01b03821660009081526003602052604081208054839290611af190849061235d565b90915550506040518181526001600160a01b0383169060009060008051602061248b833981519152906020015b60405180910390a35050565b6001600160a01b03821660009081526003602052604081208054839290611b529084906123b6565b925050819055508060026000828254611b6b91906123b6565b90915550506040518181526000906001600160a01b0384169060008051602061248b83398151915290602001611b1e565b60006107f3825490565b6000611a9f8383611cec565b600080600a54611bc184611454565b611a9f9190612397565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008181526001830160205260408120541515611a9f565b6000611a9f8383611d16565b606081600001805480602002602001604051908101604052809291908181526020018280548015611c9157602002820191906000526020600020905b815481526020019060010190808311611c7d575b50505050509050919050565b6000818152600183016020526040812054611ce4575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556107f3565b5060006107f3565b6000826000018281548110611d0357611d03612449565b9060005260206000200154905092915050565b60008181526001830160205260408120548015611dff576000611d3a6001836123b6565b8554909150600090611d4e906001906123b6565b9050818114611db3576000866000018281548110611d6e57611d6e612449565b9060005260206000200154905080876000018481548110611d9157611d91612449565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611dc457611dc4612433565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506107f3565b60009150506107f3565b600082601f830112611e1a57600080fd5b81356020611e2f611e2a83612339565b612308565b80838252828201915082860187848660051b8901011115611e4f57600080fd5b60005b85811015611e77578135611e6581612475565b84529284019290840190600101611e52565b5090979650505050505050565b600082601f830112611e9557600080fd5b81356020611ea5611e2a83612339565b80838252828201915082860187848660051b8901011115611ec557600080fd5b60005b85811015611e7757813584529284019290840190600101611ec8565b600060208284031215611ef657600080fd5b8135611a9f81612475565b600060208284031215611f1357600080fd5b8151611a9f81612475565b60008060408385031215611f3157600080fd5b8235611f3c81612475565b91506020830135611f4c81612475565b809150509250929050565b600080600060608486031215611f6c57600080fd5b8335611f7781612475565b92506020840135611f8781612475565b929592945050506040919091013590565b600080600080600060808688031215611fb057600080fd5b8535611fbb81612475565b94506020860135611fcb81612475565b935060408601359250606086013567ffffffffffffffff80821115611fef57600080fd5b818801915088601f83011261200357600080fd5b81358181111561201257600080fd5b89602082850101111561202457600080fd5b9699959850939650602001949392505050565b6000806040838503121561204a57600080fd5b823561205581612475565b946020939093013593505050565b60008060006060848603121561207857600080fd5b833567ffffffffffffffff8082111561209057600080fd5b61209c87838801611e09565b945060208601359150808211156120b257600080fd5b6120be87838801611e09565b935060408601359150808211156120d457600080fd5b506120e186828701611e84565b9150509250925092565b600080604083850312156120fe57600080fd5b823567ffffffffffffffff8082111561211657600080fd5b61212286838701611e09565b9350602085013591508082111561213857600080fd5b5061214585828601611e84565b9150509250929050565b6000806020838503121561216257600080fd5b823567ffffffffffffffff8082111561217a57600080fd5b818501915085601f83011261218e57600080fd5b81358181111561219d57600080fd5b8660208260051b85010111156121b257600080fd5b60209290920196919550909350505050565b6000602082840312156121d657600080fd5b81518015158114611a9f57600080fd5b6000602082840312156121f857600080fd5b5035919050565b60006020828403121561221157600080fd5b5051919050565b6000806040838503121561222b57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b8181101561227257835183529284019291840191600101612256565b50909695505050505050565b600060208083528351808285015260005b818110156122ab5785810183015185820160400152820161228f565b818111156122bd576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156123315761233161245f565b604052919050565b600067ffffffffffffffff8211156123535761235361245f565b5060051b60200190565b600082198211156123705761237061241d565b500190565b60008261239257634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156123b1576123b161241d565b500290565b6000828210156123c8576123c861241d565b500390565b600181811c908216806123e157607f821691505b602082108114156115d757634e487b7160e01b600052602260045260246000fd5b60006000198214156124165761241661241d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610d0957600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220816d6c8aa17353914141bb5bc30775792f30e335f2b8c5c134178704d0c2efd764736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102305760003560e01c806370a082311161012e578063a9059cbb116100ab578063d7ca7cc51161006f578063d7ca7cc51461068c578063dd62ed3e146106ac578063e74d059f146106e4578063ec03cfdf14610714578063f2fde38b1461073457600080fd5b8063a9059cbb146105ea578063c9359d151461060a578063cc00967914610637578063ce3d179c1461064c578063d5e7be561461066c57600080fd5b80638313e905116100f25780638313e905146105505780638da5cb5b14610563578063906ca0231461059557806392e47417146105b557806395d89b41146105d557600080fd5b806370a08231146104ae578063715018a6146104db57806371ab145c146104f057806379cc6790146105105780637bde17a31461053057600080fd5b806323c8bcd5116101bc578063438b630011610180578063438b63001461044457806352143d4d146104645780635c77ddab14610479578063642f063b14610290578063671388c01461048e57600080fd5b806323c8bcd51461039d57806328b5ddc7146103bd578063313ce567146103dd578063375a069a1461040457806342966c681461042457600080fd5b8063150b7a0211610203578063150b7a02146102d457806318160ddd146103195780631c348dd31461033d5780631e89d5451461035d57806323b872dd1461037d57600080fd5b806306fdde0314610235578063095ea7b3146102605780630b65d1df1461029057806311d3ed36146102b2575b600080fd5b34801561024157600080fd5b5061024a610754565b604051610257919061227e565b60405180910390f35b34801561026c57600080fd5b5061028061027b366004612037565b6107e2565b6040519015158152602001610257565b34801561029c57600080fd5b506102a56107f9565b604051610257919061223a565b3480156102be57600080fd5b506102d26102cd366004612218565b610819565b005b3480156102e057600080fd5b506103006102ef366004611f98565b630a85bd0160e11b95945050505050565b6040516001600160e01b03199091168152602001610257565b34801561032557600080fd5b5061032f60025481565b604051908152602001610257565b34801561034957600080fd5b5061032f6103583660046121e6565b61087a565b34801561036957600080fd5b506102d26103783660046120eb565b61089b565b34801561038957600080fd5b50610280610398366004611f57565b61095c565b3480156103a957600080fd5b506102d26103b836600461214f565b610a62565b3480156103c957600080fd5b506102d26103d83660046121e6565b610c65565b3480156103e957600080fd5b506103f2601281565b60405160ff9091168152602001610257565b34801561041057600080fd5b506102d261041f3660046121e6565b610cc4565b34801561043057600080fd5b506102d261043f3660046121e6565b610d0c565b34801561045057600080fd5b506102a561045f366004611ee4565b610d16565b34801561047057600080fd5b506102d2610fb7565b34801561048557600080fd5b506102d2611056565b34801561049a57600080fd5b506102d26104a93660046121e6565b6110ac565b3480156104ba57600080fd5b5061032f6104c9366004611ee4565b60036020526000908152604090205481565b3480156104e757600080fd5b506102d26110ee565b3480156104fc57600080fd5b506102d261050b366004612218565b611124565b34801561051c57600080fd5b506102d261052b366004612037565b61117c565b34801561053c57600080fd5b506102d261054b366004612063565b611285565b6102d261055e3660046121e6565b611375565b34801561056f57600080fd5b506005546001600160a01b03165b6040516001600160a01b039091168152602001610257565b3480156105a157600080fd5b506102d26105b0366004612218565b6113fc565b3480156105c157600080fd5b5061032f6105d03660046121e6565b611454565b3480156105e157600080fd5b5061024a6114e1565b3480156105f657600080fd5b50610280610605366004612037565b6114ee565b34801561061657600080fd5b5061032f6106253660046121e6565b60086020526000908152604090205481565b34801561064357600080fd5b5061032f611578565b34801561065857600080fd5b506102d2610667366004611ee4565b6115dd565b34801561067857600080fd5b5060095461057d906001600160a01b031681565b34801561069857600080fd5b506102d26106a73660046121e6565b611629565b3480156106b857600080fd5b5061032f6106c7366004611f1e565b600460209081526000928352604080842090915290825290205481565b3480156106f057600080fd5b506102806106ff366004611ee4565b60076020526000908152604090205460ff1681565b34801561072057600080fd5b506102d261072f36600461214f565b611658565b34801561074057600080fd5b506102d261074f366004611ee4565b611999565b60008054610761906123cd565b80601f016020809104026020016040519081016040528092919081815260200182805461078d906123cd565b80156107da5780601f106107af576101008083540402835291602001916107da565b820191906000526020600020905b8154815290600101906020018083116107bd57829003601f168201915b505050505081565b60006107ef338484611a31565b5060015b92915050565b33600090815260066020526040902060609061081490611a92565b905090565b6005546001600160a01b0316331461084c5760405162461bcd60e51b8152600401610843906122d3565b60405180910390fd5b61085e82670de0b6b3a7640000612397565b600e5561087381670de0b6b3a7640000612397565b600f555050565b6012818154811061088a57600080fd5b600091825260209091200154905081565b80518251146108fc5760405162461bcd60e51b815260206004820152602760248201527f4552433230493a20546f20616e6420416d6f756e7473206c656e677468204d69604482015266736d617463682160c81b6064820152608401610843565b60005b82518110156109575761094483828151811061091d5761091d612449565b602002602001015183838151811061093757610937612449565b60200260200101516114ee565b508061094f81612402565b9150506108ff565b505050565b6001600160a01b0383166000908152600460209081526040808320338452909152812054600019146109c1576001600160a01b0384166000908152600460209081526040808320338452909152812080548492906109bb9084906123b6565b90915550505b6001600160a01b038416600090815260036020526040812080548492906109e99084906123b6565b90915550506001600160a01b03831660009081526003602052604081208054849290610a1690849061235d565b92505081905550826001600160a01b0316846001600160a01b031660008051602061248b83398151915284604051610a5091815260200190565b60405180910390a35060019392505050565b60095460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c59060440160206040518083038186803b158015610aab57600080fd5b505afa158015610abf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae391906121c4565b610b275760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f7420417070726f7665642160581b6044820152606401610843565b60005b81811015610957576009546001600160a01b031663b88d4fde3330868686818110610b5757610b57612449565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152608060648201526000608482015260a401600060405180830381600087803b158015610bbc57600080fd5b505af1158015610bd0573d6000803e3d6000fd5b50505050610c07838383818110610be957610be9612449565b33600090815260066020908152604090912093910201359050611aa6565b50336000908152600760205260408120805460ff191660011790554290600890858585818110610c3957610c39612449565b905060200201358152602001908152602001600020819055508080610c5d90612402565b915050610b2a565b6005546001600160a01b03163314610c8f5760405162461bcd60e51b8152600401610843906122d3565b601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440155565b6005546001600160a01b03163314610cee5760405162461bcd60e51b8152600401610843906122d3565b610d0933610d0483670de0b6b3a7640000612397565b611ab2565b50565b610d093382611b2a565b6009546040516370a0823160e01b81526001600160a01b0383811660048301526060926000929116906370a082319060240160206040518083038186803b158015610d6057600080fd5b505afa158015610d74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d9891906121ff565b905080610db5575050604080516000815260208101909152919050565b60008167ffffffffffffffff811115610dd057610dd061245f565b604051908082528060200260200182016040528015610df9578160200160208202803683370190505b50905060008060015b600960009054906101000a90046001600160a01b03166001600160a01b031663626be5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8891906121ff565b8111610fac576000915060005b601254811015610edb5760128181548110610eb257610eb2612449565b9060005260206000200154821415610ec957600192505b80610ed381612402565b915050610e95565b5081610f9a576009546040516331a9108f60e11b8152600481018390526001600160a01b03898116921690636352211e9060240160206040518083038186803b158015610f2757600080fd5b505afa158015610f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5f9190611f01565b6001600160a01b03161415610f9a5780848481518110610f8157610f81612449565b602090810291909101015282610f9681612402565b9350505b80610fa481612402565b915050610e02565b509195945050505050565b6000805b336000908152600660205260409020610fd390611b9c565b81101561104b57336000908152600660205260409020610ffc90610ff79083611ba6565b611bb2565b611006908361235d565b3360009081526006602052604081209193504291600891906110289085611ba6565b81526020810191909152604001600020558061104381612402565b915050610fbb565b50610d093382611ab2565b6005546001600160a01b031633146110805760405162461bcd60e51b8152600401610843906122d3565b60405133904780156108fc02916000818181858888f19350505050158015610d09573d6000803e3d6000fd5b6005546001600160a01b031633146110d65760405162461bcd60e51b8152600401610843906122d3565b6110e881670de0b6b3a7640000612397565b600a5550565b6005546001600160a01b031633146111185760405162461bcd60e51b8152600401610843906122d3565b6111226000611bcb565b565b6005546001600160a01b0316331461114e5760405162461bcd60e51b8152600401610843906122d3565b61116082670de0b6b3a7640000612397565b600c5561117581670de0b6b3a7640000612397565b600d555050565b6001600160a01b0382166000908152600460209081526040808320338452909152902054818110156112165760405162461bcd60e51b815260206004820152603860248201527f4552433230494275726e61626c653a204275726e20616d6f756e74207265717560448201527f6573746564206578636565647320616c6c6f77616e63652100000000000000006064820152608401610843565b6001600160a01b03831660009081526004602090815260408083203384529091529020546000191461127b576001600160a01b0383166000908152600460209081526040808320338452909152812080548492906112759084906123b6565b90915550505b6109578383611b2a565b81518351148015611297575080518351145b6112fa5760405162461bcd60e51b815260206004820152602e60248201527f4552433230493a2046726f6d2c20546f2c20616e6420416d6f756e7473206c6560448201526d6e677468204d69736d617463682160901b6064820152608401610843565b60005b835181101561136f5761135c84828151811061131b5761131b612449565b602002602001015184838151811061133557611335612449565b602002602001015184848151811061134f5761134f612449565b602002602001015161095c565b508061136781612402565b9150506112fd565b50505050565b60018110158015611387575060038111155b61139057600080fd5b80600114156113b457600d543410156113a857600080fd5b610d0933600c54611ab2565b80600214156113d857600f543410156113cc57600080fd5b610d0933600e54611ab2565b8060031415610d09576011543410156113f057600080fd5b610d0933601054611ab2565b6005546001600160a01b031633146114265760405162461bcd60e51b8152600401610843906122d3565b61143882670de0b6b3a7640000612397565b60105561144d81670de0b6b3a7640000612397565b6011555050565b33600090815260066020526040812061146d9083611c1d565b6114af5760405162461bcd60e51b8152602060048201526013602482015272151bdad95b881b9bdd0819195c1bdcda5d1959606a1b6044820152606401610843565b60008281526008602052604081205481906114ca90426123b6565b90506114d96201518082612375565b949350505050565b60018054610761906123cd565b3360009081526003602052604081208054839190839061150f9084906123b6565b90915550506001600160a01b0383166000908152600360205260408120805484929061153c90849061235d565b90915550506040518281526001600160a01b03841690339060008051602061248b8339815191529060200160405180910390a350600192915050565b600080805b33600090815260066020526040902061159590611b9c565b8110156115d7573360009081526006602052604090206115b990610ff79083611ba6565b6115c3908361235d565b9150806115cf81612402565b91505061157d565b50919050565b6005546001600160a01b031633146116075760405162461bcd60e51b8152600401610843906122d3565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146116535760405162461bcd60e51b8152600401610843906122d3565b600b55565b60095460405163e985e9c560e01b81523360048201523060248201526001600160a01b039091169063e985e9c59060440160206040518083038186803b1580156116a157600080fd5b505afa1580156116b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d991906121c4565b61171d5760405162461bcd60e51b8152602060048201526015602482015274596f7520617265206e6f7420417070726f7665642160581b6044820152606401610843565b306001600160a01b03166352143d4d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561175857600080fd5b505af115801561176c573d6000803e3d6000fd5b5050505060005b8181101561195b576117ae83838381811061179057611790612449565b33600090815260066020908152604090912093910201359050611c1d565b6117f05760405162461bcd60e51b8152602060048201526013602482015272151bdad95b881b9bdd0819195c1bdcda5d1959606a1b6044820152606401610843565b600b5461181484848481811061180857611808612449565b90506020020135611454565b10156118725760405162461bcd60e51b815260206004820152602760248201527f596f75206d757374206265207374616b656420666f72206174206c65617374206044820152663320646179732160c81b6064820152608401610843565b6118a583838381811061188757611887612449565b33600090815260066020908152604090912093910201359050611c35565b506009546001600160a01b031663b88d4fde30338686868181106118cb576118cb612449565b6040516001600160e01b031960e088901b1681526001600160a01b03958616600482015294909316602485015250602090910201356044820152608060648201526000608482015260a401600060405180830381600087803b15801561193057600080fd5b505af1158015611944573d6000803e3d6000fd5b50505050808061195390612402565b915050611773565b5033600090815260066020526040902060019061197790611b9c565b101561199557336000908152600760205260409020805460ff191690555b5050565b6005546001600160a01b031633146119c35760405162461bcd60e51b8152600401610843906122d3565b6001600160a01b038116611a285760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610843565b610d0981611bcb565b6001600160a01b0383811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60606000611a9f83611c41565b9392505050565b6000611a9f8383611c9d565b8060026000828254611ac4919061235d565b90915550506001600160a01b03821660009081526003602052604081208054839290611af190849061235d565b90915550506040518181526001600160a01b0383169060009060008051602061248b833981519152906020015b60405180910390a35050565b6001600160a01b03821660009081526003602052604081208054839290611b529084906123b6565b925050819055508060026000828254611b6b91906123b6565b90915550506040518181526000906001600160a01b0384169060008051602061248b83398151915290602001611b1e565b60006107f3825490565b6000611a9f8383611cec565b600080600a54611bc184611454565b611a9f9190612397565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008181526001830160205260408120541515611a9f565b6000611a9f8383611d16565b606081600001805480602002602001604051908101604052809291908181526020018280548015611c9157602002820191906000526020600020905b815481526020019060010190808311611c7d575b50505050509050919050565b6000818152600183016020526040812054611ce4575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556107f3565b5060006107f3565b6000826000018281548110611d0357611d03612449565b9060005260206000200154905092915050565b60008181526001830160205260408120548015611dff576000611d3a6001836123b6565b8554909150600090611d4e906001906123b6565b9050818114611db3576000866000018281548110611d6e57611d6e612449565b9060005260206000200154905080876000018481548110611d9157611d91612449565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611dc457611dc4612433565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506107f3565b60009150506107f3565b600082601f830112611e1a57600080fd5b81356020611e2f611e2a83612339565b612308565b80838252828201915082860187848660051b8901011115611e4f57600080fd5b60005b85811015611e77578135611e6581612475565b84529284019290840190600101611e52565b5090979650505050505050565b600082601f830112611e9557600080fd5b81356020611ea5611e2a83612339565b80838252828201915082860187848660051b8901011115611ec557600080fd5b60005b85811015611e7757813584529284019290840190600101611ec8565b600060208284031215611ef657600080fd5b8135611a9f81612475565b600060208284031215611f1357600080fd5b8151611a9f81612475565b60008060408385031215611f3157600080fd5b8235611f3c81612475565b91506020830135611f4c81612475565b809150509250929050565b600080600060608486031215611f6c57600080fd5b8335611f7781612475565b92506020840135611f8781612475565b929592945050506040919091013590565b600080600080600060808688031215611fb057600080fd5b8535611fbb81612475565b94506020860135611fcb81612475565b935060408601359250606086013567ffffffffffffffff80821115611fef57600080fd5b818801915088601f83011261200357600080fd5b81358181111561201257600080fd5b89602082850101111561202457600080fd5b9699959850939650602001949392505050565b6000806040838503121561204a57600080fd5b823561205581612475565b946020939093013593505050565b60008060006060848603121561207857600080fd5b833567ffffffffffffffff8082111561209057600080fd5b61209c87838801611e09565b945060208601359150808211156120b257600080fd5b6120be87838801611e09565b935060408601359150808211156120d457600080fd5b506120e186828701611e84565b9150509250925092565b600080604083850312156120fe57600080fd5b823567ffffffffffffffff8082111561211657600080fd5b61212286838701611e09565b9350602085013591508082111561213857600080fd5b5061214585828601611e84565b9150509250929050565b6000806020838503121561216257600080fd5b823567ffffffffffffffff8082111561217a57600080fd5b818501915085601f83011261218e57600080fd5b81358181111561219d57600080fd5b8660208260051b85010111156121b257600080fd5b60209290920196919550909350505050565b6000602082840312156121d657600080fd5b81518015158114611a9f57600080fd5b6000602082840312156121f857600080fd5b5035919050565b60006020828403121561221157600080fd5b5051919050565b6000806040838503121561222b57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b8181101561227257835183529284019291840191600101612256565b50909695505050505050565b600060208083528351808285015260005b818110156122ab5785810183015185820160400152820161228f565b818111156122bd576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156123315761233161245f565b604052919050565b600067ffffffffffffffff8211156123535761235361245f565b5060051b60200190565b600082198211156123705761237061241d565b500190565b60008261239257634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156123b1576123b161241d565b500290565b6000828210156123c8576123c861241d565b500390565b600181811c908216806123e157607f821691505b602082108114156115d757634e487b7160e01b600052602260045260246000fd5b60006000198214156124165761241661241d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610d0957600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220816d6c8aa17353914141bb5bc30775792f30e335f2b8c5c134178704d0c2efd764736f6c63430008070033

Deployed Bytecode Sourcemap

60900:6732:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57507:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58781:162;;;;;;;;;;-1:-1:-1;58781:162:0;;;;;:::i;:::-;;:::i;:::-;;;8902:14:1;;8895:22;8877:41;;8865:2;8850:18;58781:162:0;8737:187:1;64858:129:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61950:175::-;;;;;;;;;;-1:-1:-1;61950:175:0;;;;;:::i;:::-;;:::i;:::-;;67408:219;;;;;;;;;;-1:-1:-1;67408:219:0;;;;;:::i;:::-;-1:-1:-1;;;67408:219:0;;;;;;;;;;;-1:-1:-1;;;;;;9091:33:1;;;9073:52;;9061:2;9046:18;67408:219:0;8929:202:1;57757:26:0;;;;;;;;;;;;;;;;;;;13226:25:1;;;13214:2;13199:18;57757:26:0;13080:177:1;61612:29:0;;;;;;;;;;-1:-1:-1;61612:29:0;;;;;:::i;:::-;;:::i;59605:294::-;;;;;;;;;;-1:-1:-1;59605:294:0;;;;;:::i;:::-;;:::i;59192:368::-;;;;;;;;;;-1:-1:-1;59192:368:0;;;;;:::i;:::-;;:::i;63344:604::-;;;;;;;;;;-1:-1:-1;63344:604:0;;;;;:::i;:::-;;:::i;61650:109::-;;;;;;;;;;-1:-1:-1;61650:109:0;;;;;:::i;:::-;;:::i;57698:35::-;;;;;;;;;;;;57731:2;57698:35;;;;;13434:4:1;13422:17;;;13404:36;;13392:2;13377:18;57698:35:0;13262:184:1;62316:112:0;;;;;;;;;;-1:-1:-1;62316:112:0;;;;;:::i;:::-;;:::i;60339:93::-;;;;;;;;;;-1:-1:-1;60339:93:0;;;;;:::i;:::-;;:::i;66532:868::-;;;;;;;;;;-1:-1:-1;66532:868:0;;;;;:::i;:::-;;:::i;64995:353::-;;;;;;;;;;;;;:::i;66397:127::-;;;;;;;;;;;;;:::i;63105:113::-;;;;;;;;;;-1:-1:-1;63105:113:0;;;;;:::i;:::-;;:::i;57825:44::-;;;;;;;;;;-1:-1:-1;57825:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;19070:103;;;;;;;;;;;;;:::i;61767:175::-;;;;;;;;;;-1:-1:-1;61767:175:0;;;;;:::i;:::-;;:::i;60438:406::-;;;;;;;;;;-1:-1:-1;60438:406:0;;;;;:::i;:::-;;:::i;59905:377::-;;;;;;;;;;-1:-1:-1;59905:377:0;;;;;:::i;:::-;;:::i;62550:543::-;;;;;;:::i;:::-;;:::i;18419:87::-;;;;;;;;;;-1:-1:-1;18492:6:0;;-1:-1:-1;;;;;18492:6:0;18419:87;;;-1:-1:-1;;;;;7187:32:1;;;7169:51;;7157:2;7142:18;18419:87:0;7023:203:1;62133:175:0;;;;;;;;;;-1:-1:-1;62133:175:0;;;;;:::i;:::-;;:::i;65563:392::-;;;;;;;;;;-1:-1:-1;65563:392:0;;;;;:::i;:::-;;:::i;57532:20::-;;;;;;;;;;;;;:::i;58949:237::-;;;;;;;;;;-1:-1:-1;58949:237:0;;;;;:::i;:::-;;:::i;61186:46::-;;;;;;;;;;-1:-1:-1;61186:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;65963:295;;;;;;;;;;;;;:::i;62436:106::-;;;;;;;;;;-1:-1:-1;62436:106:0;;;;;:::i;:::-;;:::i;61241:69::-;;;;;;;;;;-1:-1:-1;61241:69:0;;;;-1:-1:-1;;;;;61241:69:0;;;63226:110;;;;;;;;;;-1:-1:-1;63226:110:0;;;;;:::i;:::-;;:::i;57876:64::-;;;;;;;;;;-1:-1:-1;57876:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;61134:45;;;;;;;;;;-1:-1:-1;61134:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63956:894;;;;;;;;;;-1:-1:-1;63956:894:0;;;;;:::i;:::-;;:::i;19328:201::-;;;;;;;;;;-1:-1:-1;19328:201:0;;;;;:::i;:::-;;:::i;57507:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58781:162::-;58857:4;58874:39;58883:10;58895:8;58905:7;58874:8;:39::i;:::-;-1:-1:-1;58931:4:0;58781:162;;;;;:::o;64858:129::-;64959:10;64949:21;;;;:9;:21;;;;;64908:16;;64949:30;;:28;:30::i;:::-;64942:37;;64858:129;:::o;61950:175::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;;;;;;;;;62053:20:::1;:9:::0;62065:8:::1;62053:20;:::i;:::-;62040:9;:34:::0;62098:18:::1;:7:::0;62108:8:::1;62098:18;:::i;:::-;62085:9;:32:::0;-1:-1:-1;;61950:175:0:o;61612:29::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61612:29:0;:::o;59605:294::-;59725:8;:15;59711:3;:10;:29;59703:81;;;;-1:-1:-1;;;59703:81:0;;10567:2:1;59703:81:0;;;10549:21:1;10606:2;10586:18;;;10579:30;10645:34;10625:18;;;10618:62;-1:-1:-1;;;10696:18:1;;;10689:37;10743:19;;59703:81:0;10365:403:1;59703:81:0;59800:9;59795:97;59819:3;:10;59815:1;:14;59795:97;;;59851:29;59860:3;59864:1;59860:6;;;;;;;;:::i;:::-;;;;;;;59868:8;59877:1;59868:11;;;;;;;;:::i;:::-;;;;;;;59851:8;:29::i;:::-;-1:-1:-1;59831:3:0;;;;:::i;:::-;;;;59795:97;;;;59605:294;;:::o;59192:368::-;-1:-1:-1;;;;;59304:16:0;;59283:4;59304:16;;;:9;:16;;;;;;;;59321:10;59304:28;;;;;;;;-1:-1:-1;;59304:49:0;59300:112;;-1:-1:-1;;;;;59370:16:0;;;;;;:9;:16;;;;;;;;59387:10;59370:28;;;;;;;:39;;59402:7;;59370:16;:39;;59402:7;;59370:39;:::i;:::-;;;;-1:-1:-1;;59300:112:0;-1:-1:-1;;;;;59422:16:0;;;;;;:9;:16;;;;;:27;;59442:7;;59422:16;:27;;59442:7;;59422:27;:::i;:::-;;;;-1:-1:-1;;;;;;;59460:14:0;;;;;;:9;:14;;;;;:25;;59478:7;;59460:14;:25;;59478:7;;59460:25;:::i;:::-;;;;;;;;59517:3;-1:-1:-1;;;;;59501:29:0;59510:5;-1:-1:-1;;;;;59501:29:0;-1:-1:-1;;;;;;;;;;;59522:7:0;59501:29;;;;13226:25:1;;13214:2;13199:18;;13080:177;59501:29:0;;;;;;;;-1:-1:-1;59548:4:0;59192:368;;;;;:::o;63344:604::-;63430:8;;:52;;-1:-1:-1;;;63430:52:0;;63456:10;63430:52;;;7443:34:1;63476:4:0;7493:18:1;;;7486:43;-1:-1:-1;;;;;63430:8:0;;;;:25;;7378:18:1;;63430:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63422:86;;;;-1:-1:-1;;;63422:86:0;;12092:2:1;63422:86:0;;;12074:21:1;12131:2;12111:18;;;12104:30;-1:-1:-1;;;12150:18:1;;;12143:51;12211:18;;63422:86:0;11890:345:1;63422:86:0;63544:9;63539:392;63555:19;;;63539:392;;;63596:8;;-1:-1:-1;;;;;63596:8:0;:25;63640:10;63677:4;63701:8;;63710:1;63701:11;;;;;;;:::i;:::-;63596:152;;-1:-1:-1;;;;;;63596:152:0;;;;;;;-1:-1:-1;;;;;7863:15:1;;;63596:152:0;;;7845:34:1;7915:15;;;;7895:18;;;7888:43;-1:-1:-1;63701:11:0;;;;;;7947:18:1;;;7940:34;8010:3;7990:18;;;7983:31;-1:-1:-1;8030:19:1;;;8023:30;8070:19;;63596:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63777:38;63803:8;;63812:1;63803:11;;;;;;;:::i;:::-;63787:10;63777:21;;;;:9;63803:11;63777:21;;;;;;;;63803:11;;;;;-1:-1:-1;63777:25:0;:38::i;:::-;-1:-1:-1;63844:10:0;63830:25;;;;:13;:25;;;;;:32;;-1:-1:-1;;63830:32:0;63858:4;63830:32;;;63904:15;;63877:11;;63889:8;;63898:1;63889:11;;;;;;;:::i;:::-;;;;;;;63877:24;;;;;;;;;;;:42;;;;63576:3;;;;;:::i;:::-;;;;63539:392;;61650:109;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;61725:12:::1;:26:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;61725:26:0;;;;;::::1;::::0;61650:109::o;62316:112::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;62382:38:::1;62388:10;62401:17;:6:::0;62410:8:::1;62401:17;:::i;:::-;62382:5;:38::i;:::-;62316:112:::0;:::o;60339:93::-;60398:26;60404:10;60416:7;60398:5;:26::i;66532:868::-;66642:8;;:28;;-1:-1:-1;;;66642:28:0;;-1:-1:-1;;;;;7187:32:1;;;66642:28:0;;;7169:51:1;66594:16:0;;66623;;66642:8;;;:18;;7142::1;;66642:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66623:47;-1:-1:-1;66685:13:0;66681:42;;-1:-1:-1;;66707:16:0;;;66721:1;66707:16;;;;;;;;;66700:23;-1:-1:-1;66532:868:0:o;66681:42::-;66736:24;66778:8;66763:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66763:24:0;-1:-1:-1;66736:51:0;-1:-1:-1;66798:14:0;;66890:1;66873:495;66898:8;;;;;;;;;-1:-1:-1;;;;;66898:8:0;-1:-1:-1;;;;;66898:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66893:1;:26;66873:495;;66950:5;66941:14;;66988:9;66984:189;67003:12;:19;67001:21;;66984:189;;;67068:12;67081:1;67068:15;;;;;;;;:::i;:::-;;;;;;;;;67063:1;:20;67060:98;;;67134:4;67125:13;;67060:98;67023:3;;;;:::i;:::-;;;;66984:189;;;;67191:6;67187:168;;67235:8;;:19;;-1:-1:-1;;;67235:19:0;;;;;13226:25:1;;;-1:-1:-1;;;;;67235:31:0;;;;:8;;:16;;13199:18:1;;67235:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;67235:31:0;;67231:109;;;67309:1;67291:7;67299:6;67291:15;;;;;;;;:::i;:::-;;;;;;;;;;:19;67312:8;;;;:::i;:::-;;;;67231:109;66921:3;;;;:::i;:::-;;;;66873:495;;;-1:-1:-1;67385:7:0;;66532:868;-1:-1:-1;;;;;66532:868:0:o;64995:353::-;65041:19;65079:9;65075:225;65108:10;65098:21;;;;:9;:21;;;;;:30;;:28;:30::i;:::-;65094:1;:34;65075:225;;;65197:10;65187:21;;;;:9;:21;;;;;65174:41;;65187:27;;65212:1;65187:24;:27::i;:::-;65174:12;:41::i;:::-;65159:56;;;;:::i;:::-;65252:10;65230:40;65242:21;;;:9;:21;;;;;65159:56;;-1:-1:-1;65273:15:0;;65230:11;;:40;65242:27;;65267:1;65242:24;:27::i;:::-;65230:40;;;;;;;;;;;-1:-1:-1;65230:40:0;:58;65130:3;;;;:::i;:::-;;;;65075:225;;;;65310:30;65316:10;65328:11;65310:5;:30::i;66397:127::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;66465:51:::1;::::0;66473:10:::1;::::0;66494:21:::1;66465:51:::0;::::1;;;::::0;::::1;::::0;;;66494:21;66473:10;66465:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;63105:113:::0;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;63193:16:::1;:5:::0;63201:8:::1;63193:16;:::i;:::-;63179:10;:31:::0;-1:-1:-1;63105:113:0:o;19070:103::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;19135:30:::1;19162:1;19135:18;:30::i;:::-;19070:103::o:0;61767:175::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;61870:20:::1;:9:::0;61882:8:::1;61870:20;:::i;:::-;61857:9;:34:::0;61915:18:::1;:7:::0;61925:8:::1;61915:18;:::i;:::-;61902:9;:32:::0;-1:-1:-1;;61767:175:0:o;60438:406::-;-1:-1:-1;;;;;60542:16:0;;60514:25;60542:16;;;:9;:16;;;;;;;;60559:10;60542:28;;;;;;;;60589;;;;60581:97;;;;-1:-1:-1;;;60581:97:0;;12857:2:1;60581:97:0;;;12839:21:1;12896:2;12876:18;;;12869:30;12935:34;12915:18;;;12908:62;13006:26;12986:18;;;12979:54;13050:19;;60581:97:0;12655:420:1;60581:97:0;-1:-1:-1;;;;;60695:16:0;;;;;;:9;:16;;;;;;;;60712:10;60695:28;;;;;;;;-1:-1:-1;;60695:49:0;60691:112;;-1:-1:-1;;;;;60761:16:0;;;;;;:9;:16;;;;;;;;60778:10;60761:28;;;;;;;:39;;60793:7;;60761:16;:39;;60793:7;;60761:39;:::i;:::-;;;;-1:-1:-1;;60691:112:0;60815:21;60821:5;60828:7;60815:5;:21::i;59905:377::-;60055:3;:10;60039:5;:12;:26;:61;;;;;60085:8;:15;60069:5;:12;:31;60039:61;60031:120;;;;-1:-1:-1;;;60031:120:0;;12442:2:1;60031:120:0;;;12424:21:1;12481:2;12461:18;;;12454:30;12520:34;12500:18;;;12493:62;-1:-1:-1;;;12571:18:1;;;12564:44;12625:19;;60031:120:0;12240:410:1;60031:120:0;60167:9;60162:113;60186:5;:12;60182:1;:16;60162:113;;;60220:43;60233:5;60239:1;60233:8;;;;;;;;:::i;:::-;;;;;;;60243:3;60247:1;60243:6;;;;;;;;:::i;:::-;;;;;;;60251:8;60260:1;60251:11;;;;;;;;:::i;:::-;;;;;;;60220:12;:43::i;:::-;-1:-1:-1;60200:3:0;;;;:::i;:::-;;;;60162:113;;;;59905:377;;;:::o;62550:543::-;62638:1;62625:9;:14;;:32;;;;;62656:1;62643:9;:14;;62625:32;62617:41;;;;;;62672:9;62685:1;62672:14;62669:417;;;62733:9;;62720;:22;;62712:31;;;;;;62758:28;62764:10;62776:9;;62758:5;:28::i;62669:417::-;62816:9;62829:1;62816:14;62813:273;;;62877:9;;62864;:22;;62856:31;;;;;;62902:28;62908:10;62920:9;;62902:5;:28::i;62813:273::-;62960:9;62973:1;62960:14;62957:129;;;63021:9;;63008;:22;;63000:31;;;;;;63046:28;63052:10;63064:9;;63046:5;:28::i;62133:175::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;62236:20:::1;:9:::0;62248:8:::1;62236:20;:::i;:::-;62223:9;:34:::0;62281:18:::1;:7:::0;62291:8:::1;62281:18;:::i;:::-;62268:9;:32:::0;-1:-1:-1;;62133:175:0:o;65563:392::-;65687:10;65620:7;65677:21;;;:9;:21;;;;;:39;;65708:7;65677:30;:39::i;:::-;65655:108;;;;-1:-1:-1;;;65655:108:0;;11383:2:1;65655:108:0;;;11365:21:1;11422:2;11402:18;;;11395:30;-1:-1:-1;;;11441:18:1;;;11434:49;11500:18;;65655:108:0;11181:343:1;65655:108:0;65784:18;65850:20;;;:11;:20;;;;;;65784:18;;65832:38;;:15;:38;:::i;:::-;65813:57;-1:-1:-1;65894:16:0;65905:5;65813:57;65894:16;:::i;:::-;65881:29;65563:392;-1:-1:-1;;;;65563:392:0:o;57532:20::-;;;;;;;:::i;58949:237::-;59048:10;59021:4;59038:21;;;:9;:21;;;;;:32;;59063:7;;59038:21;59021:4;;59038:32;;59063:7;;59038:32;:::i;:::-;;;;-1:-1:-1;;;;;;;59081:14:0;;;;;;:9;:14;;;;;:25;;59099:7;;59081:14;:25;;59099:7;;59081:25;:::i;:::-;;;;-1:-1:-1;;59122:34:0;;13226:25:1;;;-1:-1:-1;;;;;59122:34:0;;;59131:10;;-1:-1:-1;;;;;;;;;;;59122:34:0;13214:2:1;13199:18;59122:34:0;;;;;;;-1:-1:-1;59174:4:0;58949:237;;;;:::o;65963:295::-;66011:7;;;66070:152;66103:10;66093:21;;;;:9;:21;;;;;:30;;:28;:30::i;:::-;66089:1;:34;66070:152;;;66192:10;66182:21;;;;:9;:21;;;;;66169:41;;66182:27;;66207:1;66182:24;:27::i;66169:41::-;66154:56;;;;:::i;:::-;;-1:-1:-1;66125:3:0;;;;:::i;:::-;;;;66070:152;;;-1:-1:-1;66239:11:0;65963:295;-1:-1:-1;65963:295:0:o;62436:106::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;62510:8:::1;:24:::0;;-1:-1:-1;;;;;;62510:24:0::1;-1:-1:-1::0;;;;;62510:24:0;;;::::1;::::0;;;::::1;::::0;;62436:106::o;63226:110::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;63305:13:::1;:23:::0;63226:110::o;63956:894::-;64044:8;;:52;;-1:-1:-1;;;64044:52:0;;64070:10;64044:52;;;7443:34:1;64090:4:0;7493:18:1;;;7486:43;-1:-1:-1;;;;;64044:8:0;;;;:25;;7378:18:1;;64044:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64036:86;;;;-1:-1:-1;;;64036:86:0;;12092:2:1;64036:86:0;;;12074:21:1;12131:2;12111:18;;;12104:30;-1:-1:-1;;;12150:18:1;;;12143:51;12211:18;;64036:86:0;11890:345:1;64036:86:0;64143:4;-1:-1:-1;;;;;64143:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64177:9;64172:553;64188:19;;;64172:553;;;64255:43;64286:8;;64295:1;64286:11;;;;;;;:::i;:::-;64265:10;64255:21;;;;:9;64286:11;64255:21;;;;;;;;64286:11;;;;;-1:-1:-1;64255:30:0;:43::i;:::-;64229:124;;;;-1:-1:-1;;;64229:124:0;;11383:2:1;64229:124:0;;;11365:21:1;11422:2;11402:18;;;11395:30;-1:-1:-1;;;11441:18:1;;;11434:49;11500:18;;64229:124:0;11181:343:1;64229:124:0;64405:13;;64378:23;64389:8;;64398:1;64389:11;;;;;;;:::i;:::-;;;;;;;64378:10;:23::i;:::-;:40;;64370:92;;;;-1:-1:-1;;;64370:92:0;;10975:2:1;64370:92:0;;;10957:21:1;11014:2;10994:18;;;10987:30;11053:34;11033:18;;;11026:62;-1:-1:-1;;;11104:18:1;;;11097:37;11151:19;;64370:92:0;10773:403:1;64370:92:0;64491:41;64520:8;;64529:1;64520:11;;;;;;;:::i;:::-;64501:10;64491:21;;;;:9;64520:11;64491:21;;;;;;;;64520:11;;;;;-1:-1:-1;64491:28:0;:41::i;:::-;-1:-1:-1;64561:8:0;;-1:-1:-1;;;;;64561:8:0;:25;64613:4;64637:10;64666:8;;64675:1;64666:11;;;;;;;:::i;:::-;64561:152;;-1:-1:-1;;;;;;64561:152:0;;;;;;;-1:-1:-1;;;;;7863:15:1;;;64561:152:0;;;7845:34:1;7915:15;;;;7895:18;;;7888:43;-1:-1:-1;64666:11:0;;;;;;7947:18:1;;;7940:34;8010:3;7990:18;;;7983:31;-1:-1:-1;8030:19:1;;;8023:30;8070:19;;64561:152:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64209:3;;;;;:::i;:::-;;;;64172:553;;;-1:-1:-1;64748:10:0;64738:21;;;;:9;:21;;;;;64771:1;;64738:30;;:28;:30::i;:::-;:34;64735:108;;;64812:10;64826:5;64798:25;;;:13;:25;;;;;:33;;-1:-1:-1;;64798:33:0;;;64735:108;63956:894;;:::o;19328:201::-;18492:6;;-1:-1:-1;;;;;18492:6:0;17170:10;18639:23;18631:68;;;;-1:-1:-1;;;18631:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19417:22:0;::::1;19409:73;;;::::0;-1:-1:-1;;;19409:73:0;;10160:2:1;19409:73:0::1;::::0;::::1;10142:21:1::0;10199:2;10179:18;;;10172:30;10238:34;10218:18;;;10211:62;-1:-1:-1;;;10289:18:1;;;10282:36;10335:19;;19409:73:0::1;9958:402:1::0;19409:73:0::1;19493:28;19512:8;19493:18;:28::i;58555:193::-:0;-1:-1:-1;;;;;58652:17:0;;;;;;;:9;:17;;;;;;;;:27;;;;;;;;;;;;;:37;;;58705:35;;13226:25:1;;;58705:35:0;;13199:18:1;58705:35:0;;;;;;;58555:193;;;:::o;12393:263::-;12453:16;12482:22;12507:19;12515:3;12507:7;:19::i;:::-;12482:44;12393:263;-1:-1:-1;;;12393:263:0:o;10476:131::-;10543:4;10567:32;10572:3;10592:5;10567:4;:32::i;58155:191::-;58243:7;58228:11;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;58261:14:0;;;;;;:9;:14;;;;;:25;;58279:7;;58261:14;:25;;58279:7;;58261:25;:::i;:::-;;;;-1:-1:-1;;58302:36:0;;13226:25:1;;;-1:-1:-1;;;;;58302:36:0;;;58319:3;;-1:-1:-1;;;;;;;;;;;58302:36:0;13214:2:1;13199:18;58302:36:0;;;;;;;;58155:191;;:::o;58352:197::-;-1:-1:-1;;;;;58427:16:0;;;;;;:9;:16;;;;;:27;;58447:7;;58427:16;:27;;58447:7;;58427:27;:::i;:::-;;;;;;;;58480:7;58465:11;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;58503:38:0;;13226:25:1;;;58527:3:0;;-1:-1:-1;;;;;58503:38:0;;;-1:-1:-1;;;;;;;;;;;58503:38:0;13214:2:1;13199:18;58503:38:0;13080:177:1;11238:114:0;11298:7;11325:19;11333:3;4267:18;;4184:109;11706:137;11777:7;11812:22;11816:3;11828:5;11812:3;:22::i;65356:199::-;65417:7;65442:21;65488:10;;65466:19;65477:7;65466:10;:19::i;:::-;:32;;;;:::i;19689:191::-;19782:6;;;-1:-1:-1;;;;;19799:17:0;;;-1:-1:-1;;;;;;19799:17:0;;;;;;;19832:40;;19782:6;;;19799:17;19782:6;;19832:40;;19763:16;;19832:40;19752:128;19689:191;:::o;11006:146::-;11083:4;4066:19;;;:12;;;:19;;;;;;:24;;11107:37;3969:129;10783:137;10853:4;10877:35;10885:3;10905:5;10877:7;:35::i;5317:111::-;5373:16;5409:3;:11;;5402:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5317:111;;;:::o;1873:414::-;1936:4;4066:19;;;:12;;;:19;;;;;;1953:327;;-1:-1:-1;1996:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;2179:18;;2157:19;;;:12;;;:19;;;;;;:40;;;;2212:11;;1953:327;-1:-1:-1;2263:5:0;2256:12;;4647:120;4714:7;4741:3;:11;;4753:5;4741:18;;;;;;;;:::i;:::-;;;;;;;;;4734:25;;4647:120;;;;:::o;2463:1420::-;2529:4;2668:19;;;:12;;;:19;;;;;;2704:15;;2700:1176;;3079:21;3103:14;3116:1;3103:10;:14;:::i;:::-;3152:18;;3079:38;;-1:-1:-1;3132:17:0;;3152:22;;3173:1;;3152:22;:::i;:::-;3132:42;;3208:13;3195:9;:26;3191:405;;3242:17;3262:3;:11;;3274:9;3262:22;;;;;;;;:::i;:::-;;;;;;;;;3242:42;;3416:9;3387:3;:11;;3399:13;3387:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;3501:23;;;:12;;;:23;;;;;:36;;;3191:405;3677:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;3772:3;:12;;:19;3785:5;3772:19;;;;;;;;;;;3765:26;;;3815:4;3808:11;;;;;;;2700:1176;3859:5;3852:12;;;;;14:748:1;68:5;121:3;114:4;106:6;102:17;98:27;88:55;;139:1;136;129:12;88:55;175:6;162:20;201:4;225:60;241:43;281:2;241:43;:::i;:::-;225:60;:::i;:::-;307:3;331:2;326:3;319:15;359:2;354:3;350:12;343:19;;394:2;386:6;382:15;446:3;441:2;435;432:1;428:10;420:6;416:23;412:32;409:41;406:61;;;463:1;460;453:12;406:61;485:1;495:238;509:2;506:1;503:9;495:238;;;580:3;567:17;597:31;622:5;597:31;:::i;:::-;641:18;;679:12;;;;711;;;;527:1;520:9;495:238;;;-1:-1:-1;751:5:1;;14:748;-1:-1:-1;;;;;;;14:748:1:o;767:673::-;821:5;874:3;867:4;859:6;855:17;851:27;841:55;;892:1;889;882:12;841:55;928:6;915:20;954:4;978:60;994:43;1034:2;994:43;:::i;978:60::-;1060:3;1084:2;1079:3;1072:15;1112:2;1107:3;1103:12;1096:19;;1147:2;1139:6;1135:15;1199:3;1194:2;1188;1185:1;1181:10;1173:6;1169:23;1165:32;1162:41;1159:61;;;1216:1;1213;1206:12;1159:61;1238:1;1248:163;1262:2;1259:1;1256:9;1248:163;;;1319:17;;1307:30;;1357:12;;;;1389;;;;1280:1;1273:9;1248:163;;1445:247;1504:6;1557:2;1545:9;1536:7;1532:23;1528:32;1525:52;;;1573:1;1570;1563:12;1525:52;1612:9;1599:23;1631:31;1656:5;1631:31;:::i;1697:251::-;1767:6;1820:2;1808:9;1799:7;1795:23;1791:32;1788:52;;;1836:1;1833;1826:12;1788:52;1868:9;1862:16;1887:31;1912:5;1887:31;:::i;1953:388::-;2021:6;2029;2082:2;2070:9;2061:7;2057:23;2053:32;2050:52;;;2098:1;2095;2088:12;2050:52;2137:9;2124:23;2156:31;2181:5;2156:31;:::i;:::-;2206:5;-1:-1:-1;2263:2:1;2248:18;;2235:32;2276:33;2235:32;2276:33;:::i;:::-;2328:7;2318:17;;;1953:388;;;;;:::o;2346:456::-;2423:6;2431;2439;2492:2;2480:9;2471:7;2467:23;2463:32;2460:52;;;2508:1;2505;2498:12;2460:52;2547:9;2534:23;2566:31;2591:5;2566:31;:::i;:::-;2616:5;-1:-1:-1;2673:2:1;2658:18;;2645:32;2686:33;2645:32;2686:33;:::i;:::-;2346:456;;2738:7;;-1:-1:-1;;;2792:2:1;2777:18;;;;2764:32;;2346:456::o;2807:936::-;2904:6;2912;2920;2928;2936;2989:3;2977:9;2968:7;2964:23;2960:33;2957:53;;;3006:1;3003;2996:12;2957:53;3045:9;3032:23;3064:31;3089:5;3064:31;:::i;:::-;3114:5;-1:-1:-1;3171:2:1;3156:18;;3143:32;3184:33;3143:32;3184:33;:::i;:::-;3236:7;-1:-1:-1;3290:2:1;3275:18;;3262:32;;-1:-1:-1;3345:2:1;3330:18;;3317:32;3368:18;3398:14;;;3395:34;;;3425:1;3422;3415:12;3395:34;3463:6;3452:9;3448:22;3438:32;;3508:7;3501:4;3497:2;3493:13;3489:27;3479:55;;3530:1;3527;3520:12;3479:55;3570:2;3557:16;3596:2;3588:6;3585:14;3582:34;;;3612:1;3609;3602:12;3582:34;3657:7;3652:2;3643:6;3639:2;3635:15;3631:24;3628:37;3625:57;;;3678:1;3675;3668:12;3625:57;2807:936;;;;-1:-1:-1;2807:936:1;;-1:-1:-1;3709:2:1;3701:11;;3731:6;2807:936;-1:-1:-1;;;2807:936:1:o;3748:315::-;3816:6;3824;3877:2;3865:9;3856:7;3852:23;3848:32;3845:52;;;3893:1;3890;3883:12;3845:52;3932:9;3919:23;3951:31;3976:5;3951:31;:::i;:::-;4001:5;4053:2;4038:18;;;;4025:32;;-1:-1:-1;;;3748:315:1:o;4068:821::-;4220:6;4228;4236;4289:2;4277:9;4268:7;4264:23;4260:32;4257:52;;;4305:1;4302;4295:12;4257:52;4345:9;4332:23;4374:18;4415:2;4407:6;4404:14;4401:34;;;4431:1;4428;4421:12;4401:34;4454:61;4507:7;4498:6;4487:9;4483:22;4454:61;:::i;:::-;4444:71;;4568:2;4557:9;4553:18;4540:32;4524:48;;4597:2;4587:8;4584:16;4581:36;;;4613:1;4610;4603:12;4581:36;4636:63;4691:7;4680:8;4669:9;4665:24;4636:63;:::i;:::-;4626:73;;4752:2;4741:9;4737:18;4724:32;4708:48;;4781:2;4771:8;4768:16;4765:36;;;4797:1;4794;4787:12;4765:36;;4820:63;4875:7;4864:8;4853:9;4849:24;4820:63;:::i;:::-;4810:73;;;4068:821;;;;;:::o;4894:595::-;5012:6;5020;5073:2;5061:9;5052:7;5048:23;5044:32;5041:52;;;5089:1;5086;5079:12;5041:52;5129:9;5116:23;5158:18;5199:2;5191:6;5188:14;5185:34;;;5215:1;5212;5205:12;5185:34;5238:61;5291:7;5282:6;5271:9;5267:22;5238:61;:::i;:::-;5228:71;;5352:2;5341:9;5337:18;5324:32;5308:48;;5381:2;5371:8;5368:16;5365:36;;;5397:1;5394;5387:12;5365:36;;5420:63;5475:7;5464:8;5453:9;5449:24;5420:63;:::i;:::-;5410:73;;;4894:595;;;;;:::o;5494:615::-;5580:6;5588;5641:2;5629:9;5620:7;5616:23;5612:32;5609:52;;;5657:1;5654;5647:12;5609:52;5697:9;5684:23;5726:18;5767:2;5759:6;5756:14;5753:34;;;5783:1;5780;5773:12;5753:34;5821:6;5810:9;5806:22;5796:32;;5866:7;5859:4;5855:2;5851:13;5847:27;5837:55;;5888:1;5885;5878:12;5837:55;5928:2;5915:16;5954:2;5946:6;5943:14;5940:34;;;5970:1;5967;5960:12;5940:34;6023:7;6018:2;6008:6;6005:1;6001:14;5997:2;5993:23;5989:32;5986:45;5983:65;;;6044:1;6041;6034:12;5983:65;6075:2;6067:11;;;;;6097:6;;-1:-1:-1;5494:615:1;;-1:-1:-1;;;;5494:615:1:o;6114:277::-;6181:6;6234:2;6222:9;6213:7;6209:23;6205:32;6202:52;;;6250:1;6247;6240:12;6202:52;6282:9;6276:16;6335:5;6328:13;6321:21;6314:5;6311:32;6301:60;;6357:1;6354;6347:12;6396:180;6455:6;6508:2;6496:9;6487:7;6483:23;6479:32;6476:52;;;6524:1;6521;6514:12;6476:52;-1:-1:-1;6547:23:1;;6396:180;-1:-1:-1;6396:180:1:o;6581:184::-;6651:6;6704:2;6692:9;6683:7;6679:23;6675:32;6672:52;;;6720:1;6717;6710:12;6672:52;-1:-1:-1;6743:16:1;;6581:184;-1:-1:-1;6581:184:1:o;6770:248::-;6838:6;6846;6899:2;6887:9;6878:7;6874:23;6870:32;6867:52;;;6915:1;6912;6905:12;6867:52;-1:-1:-1;;6938:23:1;;;7008:2;6993:18;;;6980:32;;-1:-1:-1;6770:248:1:o;8100:632::-;8271:2;8323:21;;;8393:13;;8296:18;;;8415:22;;;8242:4;;8271:2;8494:15;;;;8468:2;8453:18;;;8242:4;8537:169;8551:6;8548:1;8545:13;8537:169;;;8612:13;;8600:26;;8681:15;;;;8646:12;;;;8573:1;8566:9;8537:169;;;-1:-1:-1;8723:3:1;;8100:632;-1:-1:-1;;;;;;8100:632:1:o;9356:597::-;9468:4;9497:2;9526;9515:9;9508:21;9558:6;9552:13;9601:6;9596:2;9585:9;9581:18;9574:34;9626:1;9636:140;9650:6;9647:1;9644:13;9636:140;;;9745:14;;;9741:23;;9735:30;9711:17;;;9730:2;9707:26;9700:66;9665:10;;9636:140;;;9794:6;9791:1;9788:13;9785:91;;;9864:1;9859:2;9850:6;9839:9;9835:22;9831:31;9824:42;9785:91;-1:-1:-1;9937:2:1;9916:15;-1:-1:-1;;9912:29:1;9897:45;;;;9944:2;9893:54;;9356:597;-1:-1:-1;;;9356:597:1:o;11529:356::-;11731:2;11713:21;;;11750:18;;;11743:30;11809:34;11804:2;11789:18;;11782:62;11876:2;11861:18;;11529:356::o;13451:275::-;13522:2;13516:9;13587:2;13568:13;;-1:-1:-1;;13564:27:1;13552:40;;13622:18;13607:34;;13643:22;;;13604:62;13601:88;;;13669:18;;:::i;:::-;13705:2;13698:22;13451:275;;-1:-1:-1;13451:275:1:o;13731:183::-;13791:4;13824:18;13816:6;13813:30;13810:56;;;13846:18;;:::i;:::-;-1:-1:-1;13891:1:1;13887:14;13903:4;13883:25;;13731:183::o;13919:128::-;13959:3;13990:1;13986:6;13983:1;13980:13;13977:39;;;13996:18;;:::i;:::-;-1:-1:-1;14032:9:1;;13919:128::o;14052:217::-;14092:1;14118;14108:132;;14162:10;14157:3;14153:20;14150:1;14143:31;14197:4;14194:1;14187:15;14225:4;14222:1;14215:15;14108:132;-1:-1:-1;14254:9:1;;14052:217::o;14274:168::-;14314:7;14380:1;14376;14372:6;14368:14;14365:1;14362:21;14357:1;14350:9;14343:17;14339:45;14336:71;;;14387:18;;:::i;:::-;-1:-1:-1;14427:9:1;;14274:168::o;14447:125::-;14487:4;14515:1;14512;14509:8;14506:34;;;14520:18;;:::i;:::-;-1:-1:-1;14557:9:1;;14447:125::o;14577:380::-;14656:1;14652:12;;;;14699;;;14720:61;;14774:4;14766:6;14762:17;14752:27;;14720:61;14827:2;14819:6;14816:14;14796:18;14793:38;14790:161;;;14873:10;14868:3;14864:20;14861:1;14854:31;14908:4;14905:1;14898:15;14936:4;14933:1;14926:15;14962:135;15001:3;-1:-1:-1;;15022:17:1;;15019:43;;;15042:18;;:::i;:::-;-1:-1:-1;15089:1:1;15078:13;;14962:135::o;15102:127::-;15163:10;15158:3;15154:20;15151:1;15144:31;15194:4;15191:1;15184:15;15218:4;15215:1;15208:15;15234:127;15295:10;15290:3;15286:20;15283:1;15276:31;15326:4;15323:1;15316:15;15350:4;15347:1;15340:15;15366:127;15427:10;15422:3;15418:20;15415:1;15408:31;15458:4;15455:1;15448:15;15482:4;15479:1;15472:15;15498:127;15559:10;15554:3;15550:20;15547:1;15540:31;15590:4;15587:1;15580:15;15614:4;15611:1;15604:15;15630:131;-1:-1:-1;;;;;15705:31:1;;15695:42;;15685:70;;15751:1;15748;15741:12

Swarm Source

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