ETH Price: $3,440.41 (-0.73%)
Gas: 5 Gwei

Token

Ticket to Zero-G (TTZG)
 

Overview

Max Total Supply

0 TTZG

Holders

19

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TTZG
0x87678f9229910d5462ee26df6f7b4cf41888638c
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:
vMooneySweeptstakes

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-30
*/

// File: @chainlink/contracts/src/v0.8/VRFConsumerBaseV2.sol


pragma solidity ^0.8.4;

/** ****************************************************************************
 * @notice Interface for contracts using VRF randomness
 * *****************************************************************************
 * @dev PURPOSE
 *
 * @dev Reggie the Random Oracle (not his real job) wants to provide randomness
 * @dev to Vera the verifier in such a way that Vera can be sure he's not
 * @dev making his output up to suit himself. Reggie provides Vera a public key
 * @dev to which he knows the secret key. Each time Vera provides a seed to
 * @dev Reggie, he gives back a value which is computed completely
 * @dev deterministically from the seed and the secret key.
 *
 * @dev Reggie provides a proof by which Vera can verify that the output was
 * @dev correctly computed once Reggie tells it to her, but without that proof,
 * @dev the output is indistinguishable to her from a uniform random sample
 * @dev from the output space.
 *
 * @dev The purpose of this contract is to make it easy for unrelated contracts
 * @dev to talk to Vera the verifier about the work Reggie is doing, to provide
 * @dev simple access to a verifiable source of randomness. It ensures 2 things:
 * @dev 1. The fulfillment came from the VRFCoordinator
 * @dev 2. The consumer contract implements fulfillRandomWords.
 * *****************************************************************************
 * @dev USAGE
 *
 * @dev Calling contracts must inherit from VRFConsumerBase, and can
 * @dev initialize VRFConsumerBase's attributes in their constructor as
 * @dev shown:
 *
 * @dev   contract VRFConsumer {
 * @dev     constructor(<other arguments>, address _vrfCoordinator, address _link)
 * @dev       VRFConsumerBase(_vrfCoordinator) public {
 * @dev         <initialization with other arguments goes here>
 * @dev       }
 * @dev   }
 *
 * @dev The oracle will have given you an ID for the VRF keypair they have
 * @dev committed to (let's call it keyHash). Create subscription, fund it
 * @dev and your consumer contract as a consumer of it (see VRFCoordinatorInterface
 * @dev subscription management functions).
 * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations,
 * @dev callbackGasLimit, numWords),
 * @dev see (VRFCoordinatorInterface for a description of the arguments).
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomWords method.
 *
 * @dev The randomness argument to fulfillRandomWords is a set of random words
 * @dev generated from your requestId and the blockHash of the request.
 *
 * @dev If your contract could have concurrent requests open, you can use the
 * @dev requestId returned from requestRandomWords to track which response is associated
 * @dev with which randomness request.
 * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind,
 * @dev if your contract could have multiple requests in flight simultaneously.
 *
 * @dev Colliding `requestId`s are cryptographically impossible as long as seeds
 * @dev differ.
 *
 * *****************************************************************************
 * @dev SECURITY CONSIDERATIONS
 *
 * @dev A method with the ability to call your fulfillRandomness method directly
 * @dev could spoof a VRF response with any random value, so it's critical that
 * @dev it cannot be directly called by anything other than this base contract
 * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method).
 *
 * @dev For your users to trust that your contract's random behavior is free
 * @dev from malicious interference, it's best if you can write it so that all
 * @dev behaviors implied by a VRF response are executed *during* your
 * @dev fulfillRandomness method. If your contract must store the response (or
 * @dev anything derived from it) and use it later, you must ensure that any
 * @dev user-significant behavior which depends on that stored value cannot be
 * @dev manipulated by a subsequent VRF request.
 *
 * @dev Similarly, both miners and the VRF oracle itself have some influence
 * @dev over the order in which VRF responses appear on the blockchain, so if
 * @dev your contract could have multiple VRF requests in flight simultaneously,
 * @dev you must ensure that the order in which the VRF responses arrive cannot
 * @dev be used to manipulate your contract's user-significant behavior.
 *
 * @dev Since the block hash of the block which contains the requestRandomness
 * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful
 * @dev miner could, in principle, fork the blockchain to evict the block
 * @dev containing the request, forcing the request to be included in a
 * @dev different block with a different hash, and therefore a different input
 * @dev to the VRF. However, such an attack would incur a substantial economic
 * @dev cost. This cost scales with the number of blocks the VRF oracle waits
 * @dev until it calls responds to a request. It is for this reason that
 * @dev that you can signal to an oracle you'd like them to wait longer before
 * @dev responding to the request (however this is not enforced in the contract
 * @dev and so remains effective only in the case of unmodified oracle software).
 */
abstract contract VRFConsumerBaseV2 {
  error OnlyCoordinatorCanFulfill(address have, address want);
  address private immutable vrfCoordinator;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   */
  constructor(address _vrfCoordinator) {
    vrfCoordinator = _vrfCoordinator;
  }

  /**
   * @notice fulfillRandomness handles the VRF response. Your contract must
   * @notice implement it. See "SECURITY CONSIDERATIONS" above for important
   * @notice principles to keep in mind when implementing your fulfillRandomness
   * @notice method.
   *
   * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this
   * @dev signature, and will call it once it has verified the proof
   * @dev associated with the randomness. (It is triggered via a call to
   * @dev rawFulfillRandomness, below.)
   *
   * @param requestId The Id initially returned by requestRandomness
   * @param randomWords the VRF output expanded to the requested number of words
   */
  function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual;

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external {
    if (msg.sender != vrfCoordinator) {
      revert OnlyCoordinatorCanFulfill(msg.sender, vrfCoordinator);
    }
    fulfillRandomWords(requestId, randomWords);
  }
}

// File: @chainlink/contracts/src/v0.8/interfaces/VRFCoordinatorV2Interface.sol


pragma solidity ^0.8.0;

interface VRFCoordinatorV2Interface {
  /**
   * @notice Get configuration relevant for making requests
   * @return minimumRequestConfirmations global min for request confirmations
   * @return maxGasLimit global max for request gas limit
   * @return s_provingKeyHashes list of registered key hashes
   */
  function getRequestConfig()
    external
    view
    returns (
      uint16,
      uint32,
      bytes32[] memory
    );

  /**
   * @notice Request a set of random words.
   * @param keyHash - Corresponds to a particular oracle job which uses
   * that key for generating the VRF proof. Different keyHash's have different gas price
   * ceilings, so you can select a specific one to bound your maximum per request cost.
   * @param subId  - The ID of the VRF subscription. Must be funded
   * with the minimum subscription balance required for the selected keyHash.
   * @param minimumRequestConfirmations - How many blocks you'd like the
   * oracle to wait before responding to the request. See SECURITY CONSIDERATIONS
   * for why you may want to request more. The acceptable range is
   * [minimumRequestBlockConfirmations, 200].
   * @param callbackGasLimit - How much gas you'd like to receive in your
   * fulfillRandomWords callback. Note that gasleft() inside fulfillRandomWords
   * may be slightly less than this amount because of gas used calling the function
   * (argument decoding etc.), so you may need to request slightly more than you expect
   * to have inside fulfillRandomWords. The acceptable range is
   * [0, maxGasLimit]
   * @param numWords - The number of uint256 random values you'd like to receive
   * in your fulfillRandomWords callback. Note these numbers are expanded in a
   * secure way by the VRFCoordinator from a single random value supplied by the oracle.
   * @return requestId - A unique identifier of the request. Can be used to match
   * a request to a response in fulfillRandomWords.
   */
  function requestRandomWords(
    bytes32 keyHash,
    uint64 subId,
    uint16 minimumRequestConfirmations,
    uint32 callbackGasLimit,
    uint32 numWords
  ) external returns (uint256 requestId);

  /**
   * @notice Create a VRF subscription.
   * @return subId - A unique subscription id.
   * @dev You can manage the consumer set dynamically with addConsumer/removeConsumer.
   * @dev Note to fund the subscription, use transferAndCall. For example
   * @dev  LINKTOKEN.transferAndCall(
   * @dev    address(COORDINATOR),
   * @dev    amount,
   * @dev    abi.encode(subId));
   */
  function createSubscription() external returns (uint64 subId);

  /**
   * @notice Get a VRF subscription.
   * @param subId - ID of the subscription
   * @return balance - LINK balance of the subscription in juels.
   * @return reqCount - number of requests for this subscription, determines fee tier.
   * @return owner - owner of the subscription.
   * @return consumers - list of consumer address which are able to use this subscription.
   */
  function getSubscription(uint64 subId)
    external
    view
    returns (
      uint96 balance,
      uint64 reqCount,
      address owner,
      address[] memory consumers
    );

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @param newOwner - proposed new owner of the subscription
   */
  function requestSubscriptionOwnerTransfer(uint64 subId, address newOwner) external;

  /**
   * @notice Request subscription owner transfer.
   * @param subId - ID of the subscription
   * @dev will revert if original owner of subId has
   * not requested that msg.sender become the new owner.
   */
  function acceptSubscriptionOwnerTransfer(uint64 subId) external;

  /**
   * @notice Add a consumer to a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - New consumer which can use the subscription
   */
  function addConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Remove a consumer from a VRF subscription.
   * @param subId - ID of the subscription
   * @param consumer - Consumer to remove from the subscription
   */
  function removeConsumer(uint64 subId, address consumer) external;

  /**
   * @notice Cancel a subscription
   * @param subId - ID of the subscription
   * @param to - Where to send the remaining LINK to
   */
  function cancelSubscription(uint64 subId, address to) external;

  /*
   * @notice Check to see if there exists a request commitment consumers
   * for all consumers and keyhashes for a given sub.
   * @param subId - ID of the subscription
   * @return true if there exists at least one unfulfilled request for the subscription, false
   * otherwise.
   */
  function pendingRequestExists(uint64 subId) external view returns (bool);
}

// File: @chainlink/contracts/src/v0.8/interfaces/LinkTokenInterface.sol


pragma solidity ^0.8.0;

interface LinkTokenInterface {
  function allowance(address owner, address spender) external view returns (uint256 remaining);

  function approve(address spender, uint256 value) external returns (bool success);

  function balanceOf(address owner) external view returns (uint256 balance);

  function decimals() external view returns (uint8 decimalPlaces);

  function decreaseApproval(address spender, uint256 addedValue) external returns (bool success);

  function increaseApproval(address spender, uint256 subtractedValue) external;

  function name() external view returns (string memory tokenName);

  function symbol() external view returns (string memory tokenSymbol);

  function totalSupply() external view returns (uint256 totalTokensIssued);

  function transfer(address to, uint256 value) external returns (bool success);

  function transferAndCall(
    address to,
    uint256 value,
    bytes calldata data
  ) external returns (bool success);

  function transferFrom(
    address from,
    address to,
    uint256 value
  ) external returns (bool success);
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


// OpenZeppelin Contracts (last updated v4.8.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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // 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
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.6.0) (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: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.8.0) (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`.
     *
     * 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;

    /**
     * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.8.2) (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: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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) {
        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, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

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

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

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
     * that `ownerOf(tokenId)` is `a`.
     */
    // solhint-disable-next-line func-name-mixedcase
    function __unsafe_increaseBalance(address account, uint256 amount) internal {
        _balances[account] += amount;
    }
}

// File: contracts/vMooneySweepstakes-Mainnet.sol

/*
    NAME: TICKET-TO-ZERO-G 
    CHAIN: MAINNET
*/


pragma solidity ^0.8.9;








contract vMooneySweeptstakes is ERC721, Ownable, Pausable, VRFConsumerBaseV2 {
    VRFCoordinatorV2Interface COORDINATOR;
    LinkTokenInterface LINKTOKEN =
        LinkTokenInterface(0x514910771AF9Ca656af840dff83E8264EcF986CA); //https://vrf.chain.link/mainnet
    bytes32 keyHash =
        0x8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef; //200gwei mainnet
    address vrfCoordinator_ = 0x271682DEB8C4E0901D1a1550aD2e64D568E69909;

   struct RequestStatus {
        bool paid; // paid?
        bool fulfilled; // whether the request has been successfully fulfilled
        uint256[] randomWords;
    }
    
    mapping(uint256 => RequestStatus)
        public s_requests; /* requestId --> requestStatus */

    address public winner;

    //VRF subscription ID.
    uint64 s_subscriptionId;

    uint256[] public requestIds;
    uint256 public lastRequestId;

    uint16 requestConfirmations = 6;
    uint32 numWords = 1;
    uint256 public maxTokens = 162; //gravitational pull of the moon (1.62 m/s^2)  
    bool public ticketTransfer = false;

    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdCounter;

    address public vMooneyAddress = 0xCc71C80d803381FD6Ee984FAff408f8501DB1740; //mainnet

    bool internal locked; //re-entry lock

    //EVENTS
    event RequestSent(uint256 requestId, uint32 numWords);
    event RequestFulfilled(uint256 requestId, uint256[] randomWords);

    constructor() VRFConsumerBaseV2(0x271682DEB8C4E0901D1a1550aD2e64D568E69909) ERC721("Ticket to Zero-G", "TTZG") {
          COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator_);
    }

    //MODIFIERS
    modifier reEntrancyGuard(){ 
        require(!locked, "No re-entrancy");
        locked = true;
        _;
        locked = false;
    }

    //FUNCTIONS
    function setSubscript(uint64 subscriptionId_) external onlyOwner {
        s_subscriptionId = subscriptionId_;
    }

    function setTicketTransfer(bool ticketTransfer_) external onlyOwner {
        ticketTransfer = ticketTransfer_;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory){
        require(_exists(tokenId), "URI query for nonexistent token");
        return "ipfs://Qmam45Dh4XqswCdubhfXqzDKuHnaFMwJ59M41sTZqRvdJa"; //ticket metadata
    }

    function pause() public onlyOwner {
        _pause();
    }

    function unpause() public onlyOwner {
        _unpause();
    }

    function safeMint() public reEntrancyGuard {
        (bool success, bytes memory result) = vMooneyAddress.call(abi.encodeWithSignature("locked__end(address)", msg.sender));
        require(abi.decode(result, (uint256)) > block.timestamp, "Wallet doesn't have vMooney");
        require(this.balanceOf(msg.sender) < 1, "Wallet already owns a ticket");
        uint256 tokenId = _tokenIdCounter.current();
        require(tokenId < maxTokens, "Tickets are sold out");
        _tokenIdCounter.increment();
        _safeMint(msg.sender, tokenId);
    }

    function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint256 batchSize)
        internal
        whenNotPaused
        override
    {
        super._beforeTokenTransfer(from, to, tokenId, batchSize);
        //non-transferable after mint until ticketTransfer = true
        if(from != address(0x0000000000000000000000000000000000000000) && !ticketTransfer) revert("Cannot transfer tickets until the winner is chosen");
    }

    function chooseWinner() external onlyOwner returns(uint256 requestId) {
        uint32 callbackGasLimit = 300000;
        requestId = COORDINATOR.requestRandomWords(
            keyHash,
            s_subscriptionId,
            requestConfirmations,
            callbackGasLimit,
            numWords
        );
        s_requests[requestId] = RequestStatus({
            randomWords: new uint256[](0),
            paid: true,
            fulfilled: false
        });
        requestIds.push(requestId);
        lastRequestId = requestId;
        emit RequestSent(requestId, numWords);
        return requestId;
    }

     function fulfillRandomWords(uint256 _requestId, uint256[] memory _randomWords)
        internal
        override
    {
        require(s_requests[_requestId].paid, "request not found");
        s_requests[_requestId].fulfilled = true;
        s_requests[_requestId].randomWords = _randomWords;
        winner = this.ownerOf(_randomWords[0] % _tokenIdCounter.current());
        emit RequestFulfilled(_requestId, _randomWords);
    }

     function getRequestStatus(
        uint256 _requestId
    )
        external
        view
        returns (bool paid, bool fulfilled, uint256[] memory randomWords)
    {
        RequestStatus memory request = s_requests[_requestId];
        return (request.paid, request.fulfilled, request.randomWords);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"RequestFulfilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"requestId","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"numWords","type":"uint32"}],"name":"RequestSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chooseWinner","outputs":[{"internalType":"uint256","name":"requestId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"getRequestStatus","outputs":[{"internalType":"bool","name":"paid","type":"bool"},{"internalType":"bool","name":"fulfilled","type":"bool"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRequestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"requestIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"s_requests","outputs":[{"internalType":"bool","name":"paid","type":"bool"},{"internalType":"bool","name":"fulfilled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"subscriptionId_","type":"uint64"}],"name":"setSubscript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"ticketTransfer_","type":"bool"}],"name":"setTicketTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ticketTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vMooneyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"winner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a060405273514910771af9ca656af840dff83e8264ecf986ca600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f8af398995b04c28e9951adb9721ef74c74f93e6a478f39e7e0777be13527e7ef60001b60095573271682deb8c4e0901d1a1550ad2e64d568e69909600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506006600f60006101000a81548161ffff021916908361ffff1602179055506001600f60026101000a81548163ffffffff021916908363ffffffff16021790555060a26010556000601160006101000a81548160ff02191690831515021790555073cc71c80d803381fd6ee984faff408f8501db1740601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200019757600080fd5b5073271682deb8c4e0901d1a1550ad2e64d568e699096040518060400160405280601081526020017f5469636b657420746f205a65726f2d47000000000000000000000000000000008152506040518060400160405280600481526020017f54545a470000000000000000000000000000000000000000000000000000000081525081600090816200022a919062000660565b5080600190816200023c919062000660565b5050506200025f620002536200031860201b60201c565b6200032060201b60201c565b6000600660146101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000747565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200046857607f821691505b6020821081036200047e576200047d62000420565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004e87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004a9565b620004f48683620004a9565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005416200053b62000535846200050c565b62000516565b6200050c565b9050919050565b6000819050919050565b6200055d8362000520565b620005756200056c8262000548565b848454620004b6565b825550505050565b600090565b6200058c6200057d565b6200059981848462000552565b505050565b5b81811015620005c157620005b560008262000582565b6001810190506200059f565b5050565b601f8211156200061057620005da8162000484565b620005e58462000499565b81016020851015620005f5578190505b6200060d620006048562000499565b8301826200059e565b50505b505050565b600082821c905092915050565b6000620006356000198460080262000615565b1980831691505092915050565b600062000650838362000622565b9150826002028217905092915050565b6200066b82620003e6565b67ffffffffffffffff811115620006875762000686620003f1565b5b6200069382546200044f565b620006a0828285620005c5565b600060209050601f831160018114620006d85760008415620006c3578287015190505b620006cf858262000642565b8655506200073f565b601f198416620006e88662000484565b60005b828110156200071257848901518255600182019150602085019450602081019050620006eb565b868310156200073257848901516200072e601f89168262000622565b8355505b6001600288020188555050505b505050505050565b608051613e826200076a600039600081816108cb015261091f0152613e826000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638456cb591161010f578063c87b56dd116100a2578063e831574211610071578063e831574214610570578063e985e9c51461058e578063f2fde38b146105be578063fc2a88c3146105da576101f0565b8063c87b56dd146104d2578063cd38aa8714610502578063d8a4676f14610520578063dfbf53ae14610552576101f0565b806395d89b41116100de57806395d89b411461044b578063a168fa8914610469578063a22cb4651461049a578063b88d4fde146104b6576101f0565b80638456cb59146103d75780638796ba8c146103e15780638da5cb5b146104115780639277f5e81461042f576101f0565b8063543e617f1161018757806370a082311161015657806370a0823114610363578063715018a614610393578063809b33401461039d5780638217a607146103bb576101f0565b8063543e617f146102ed5780635c975abb1461030b5780636352211e146103295780636871ee4014610359576101f0565b80631fe543e3116101c35780631fe543e31461028f57806323b872dd146102ab5780633f4ba83a146102c757806342842e0e146102d1576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190612766565b6105f8565b60405161021c91906127ae565b60405180910390f35b61022d6106da565b60405161023a9190612859565b60405180910390f35b61025d600480360381019061025891906128b1565b61076c565b60405161026a919061291f565b60405180910390f35b61028d60048036038101906102889190612966565b6107b2565b005b6102a960048036038101906102a49190612aee565b6108c9565b005b6102c560048036038101906102c09190612b4a565b610989565b005b6102cf6109e9565b005b6102eb60048036038101906102e69190612b4a565b6109fb565b005b6102f5610a1b565b604051610302919061291f565b60405180910390f35b610313610a41565b60405161032091906127ae565b60405180910390f35b610343600480360381019061033e91906128b1565b610a58565b604051610350919061291f565b60405180910390f35b610361610ade565b005b61037d60048036038101906103789190612b9d565b610dfe565b60405161038a9190612bd9565b60405180910390f35b61039b610eb5565b005b6103a5610ec9565b6040516103b291906127ae565b60405180910390f35b6103d560048036038101906103d09190612c20565b610edc565b005b6103df610f01565b005b6103fb60048036038101906103f691906128b1565b610f13565b6040516104089190612bd9565b60405180910390f35b610419610f37565b604051610426919061291f565b60405180910390f35b61044960048036038101906104449190612c8d565b610f61565b005b610453610f95565b6040516104609190612859565b60405180910390f35b610483600480360381019061047e91906128b1565b611027565b604051610491929190612cba565b60405180910390f35b6104b460048036038101906104af9190612ce3565b611065565b005b6104d060048036038101906104cb9190612dd8565b61107b565b005b6104ec60048036038101906104e791906128b1565b6110dd565b6040516104f99190612859565b60405180910390f35b61050a611147565b6040516105179190612bd9565b60405180910390f35b61053a600480360381019061053591906128b1565b611397565b60405161054993929190612f19565b60405180910390f35b61055a611469565b604051610567919061291f565b60405180910390f35b61057861148f565b6040516105859190612bd9565b60405180910390f35b6105a860048036038101906105a39190612f57565b611495565b6040516105b591906127ae565b60405180910390f35b6105d860048036038101906105d39190612b9d565b611529565b005b6105e26115ac565b6040516105ef9190612bd9565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106d357506106d2826115b2565b5b9050919050565b6060600080546106e990612fc6565b80601f016020809104026020016040519081016040528092919081815260200182805461071590612fc6565b80156107625780601f1061073757610100808354040283529160200191610762565b820191906000526020600020905b81548152906001019060200180831161074557829003601f168201915b5050505050905090565b60006107778261161c565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107bd82610a58565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082490613069565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661084c611667565b73ffffffffffffffffffffffffffffffffffffffff16148061087b575061087a81610875611667565b611495565b5b6108ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b1906130fb565b60405180910390fd5b6108c4838361166f565b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461097b57337f00000000000000000000000000000000000000000000000000000000000000006040517f1cf993f400000000000000000000000000000000000000000000000000000000815260040161097292919061311b565b60405180910390fd5b6109858282611728565b5050565b61099a610994611667565b8261190b565b6109d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d0906131b6565b60405180910390fd5b6109e48383836119a0565b505050565b6109f1611c99565b6109f9611d17565b565b610a168383836040518060200160405280600081525061107b565b505050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660149054906101000a900460ff16905090565b600080610a6483611d7a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acc90613222565b60405180910390fd5b80915050919050565b601360149054906101000a900460ff1615610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b259061328e565b60405180910390fd5b6001601360146101000a81548160ff021916908315150217905550600080601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1633604051602401610b96919061291f565b6040516020818303038152906040527fadc63589000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610c2091906132f5565b6000604051808303816000865af19150503d8060008114610c5d576040519150601f19603f3d011682016040523d82523d6000602084013e610c62565b606091505b50915091504281806020019051810190610c7c9190613321565b11610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb39061339a565b60405180910390fd5b60013073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610cf7919061291f565b602060405180830381865afa158015610d14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d389190613321565b10610d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6f90613406565b60405180910390fd5b6000610d846012611db7565b90506010548110610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc190613472565b60405180910390fd5b610dd46012611dc5565b610dde3382611ddb565b5050506000601360146101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6590613504565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ebd611c99565b610ec76000611df9565b565b601160009054906101000a900460ff1681565b610ee4611c99565b80601160006101000a81548160ff02191690831515021790555050565b610f09611c99565b610f11611ebf565b565b600d8181548110610f2357600080fd5b906000526020600020016000915090505481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f69611c99565b80600c60146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b606060018054610fa490612fc6565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd090612fc6565b801561101d5780601f10610ff25761010080835404028352916020019161101d565b820191906000526020600020905b81548152906001019060200180831161100057829003601f168201915b5050505050905090565b600b6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16905082565b611077611070611667565b8383611f22565b5050565b61108c611086611667565b8361190b565b6110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c2906131b6565b60405180910390fd5b6110d78484848461208e565b50505050565b60606110e8826120ea565b611127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111e90613570565b60405180910390fd5b604051806060016040528060358152602001613e18603591399050919050565b6000611151611c99565b6000620493e09050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600954600c60149054906101000a900467ffffffffffffffff16600f60009054906101000a900461ffff1685600f60029054906101000a900463ffffffff166040518663ffffffff1660e01b81526004016111f69594939291906135f4565b6020604051808303816000875af1158015611215573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112399190613321565b91506040518060600160405280600115158152602001600015158152602001600067ffffffffffffffff811115611273576112726129ab565b5b6040519080825280602002602001820160405280156112a15781602001602082028036833780820191505090505b50815250600b600084815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff0219169083151502179055506040820151816001019080519060200190611314929190612690565b50905050600d82908060018154018082558091505060019003906000526020600020016000909190919091505581600e819055507fcc58b13ad3eab50626c6a6300b1d139cd6ebb1688a7cced9461c2f7e762665ee82600f60029054906101000a900463ffffffff1660405161138b929190613647565b60405180910390a15090565b60008060606000600b60008681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900460ff161515151581526020016001820180548060200260200160405190810160405280929190818152602001828054801561144157602002820191906000526020600020905b81548152602001906001019080831161142d575b5050505050815250509050806000015181602001518260400151935093509350509193909250565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611531611c99565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611597906136e2565b60405180910390fd5b6115a981611df9565b50565b600e5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611625816120ea565b611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90613222565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116e283610a58565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600b600083815260200190815260200160002060000160009054906101000a900460ff1661178b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117829061374e565b60405180910390fd5b6001600b600084815260200190815260200160002060000160016101000a81548160ff02191690831515021790555080600b600084815260200190815260200160002060010190805190602001906117e4929190612690565b503073ffffffffffffffffffffffffffffffffffffffff16636352211e61180b6012611db7565b8360008151811061181f5761181e61376e565b5b602002602001015161183191906137cc565b6040518263ffffffff1660e01b815260040161184d9190612bd9565b602060405180830381865afa15801561186a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188e9190613812565b600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ffe2e2d779dba245964d4e3ef9b994be63856fd568bf7d3ca9e224755cb1bd54d82826040516118ff92919061383f565b60405180910390a15050565b60008061191783610a58565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061195957506119588185611495565b5b8061199757508373ffffffffffffffffffffffffffffffffffffffff1661197f8461076c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119c082610a58565b73ffffffffffffffffffffffffffffffffffffffff1614611a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0d906138e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c90613973565b60405180910390fd5b611a92838383600161212b565b8273ffffffffffffffffffffffffffffffffffffffff16611ab282610a58565b73ffffffffffffffffffffffffffffffffffffffff1614611b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aff906138e1565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c9483838360016121cf565b505050565b611ca1611667565b73ffffffffffffffffffffffffffffffffffffffff16611cbf610f37565b73ffffffffffffffffffffffffffffffffffffffff1614611d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0c906139df565b60405180910390fd5b565b611d1f6121d5565b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611d63611667565b604051611d70919061291f565b60405180910390a1565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b611df582826040518060200160405280600081525061221e565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ec7612279565b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f0b611667565b604051611f18919061291f565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8790613a4b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161208191906127ae565b60405180910390a3505050565b6120998484846119a0565b6120a5848484846122c3565b6120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120db90613add565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661210c83611d7a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612133612279565b61213f8484848461244a565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156121895750601160009054906101000a900460ff16155b156121c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c090613b6f565b60405180910390fd5b50505050565b50505050565b6121dd610a41565b61221c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221390613bdb565b60405180910390fd5b565b6122288383612450565b61223560008484846122c3565b612274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226b90613add565b60405180910390fd5b505050565b612281610a41565b156122c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b890613c47565b60405180910390fd5b565b60006122e48473ffffffffffffffffffffffffffffffffffffffff1661266d565b1561243d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261230d611667565b8786866040518563ffffffff1660e01b815260040161232f9493929190613cb1565b6020604051808303816000875af192505050801561236b57506040513d601f19601f820116820180604052508101906123689190613d12565b60015b6123ed573d806000811461239b576040519150601f19603f3d011682016040523d82523d6000602084013e6123a0565b606091505b5060008151036123e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123dc90613add565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612442565b600190505b949350505050565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b690613d8b565b60405180910390fd5b6124c8816120ea565b15612508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ff90613df7565b60405180910390fd5b61251660008383600161212b565b61251f816120ea565b1561255f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255690613df7565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126696000838360016121cf565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280548282559060005260206000209081019282156126cc579160200282015b828111156126cb5782518255916020019190600101906126b0565b5b5090506126d991906126dd565b5090565b5b808211156126f65760008160009055506001016126de565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127438161270e565b811461274e57600080fd5b50565b6000813590506127608161273a565b92915050565b60006020828403121561277c5761277b612704565b5b600061278a84828501612751565b91505092915050565b60008115159050919050565b6127a881612793565b82525050565b60006020820190506127c3600083018461279f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128035780820151818401526020810190506127e8565b60008484015250505050565b6000601f19601f8301169050919050565b600061282b826127c9565b61283581856127d4565b93506128458185602086016127e5565b61284e8161280f565b840191505092915050565b600060208201905081810360008301526128738184612820565b905092915050565b6000819050919050565b61288e8161287b565b811461289957600080fd5b50565b6000813590506128ab81612885565b92915050565b6000602082840312156128c7576128c6612704565b5b60006128d58482850161289c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612909826128de565b9050919050565b612919816128fe565b82525050565b60006020820190506129346000830184612910565b92915050565b612943816128fe565b811461294e57600080fd5b50565b6000813590506129608161293a565b92915050565b6000806040838503121561297d5761297c612704565b5b600061298b85828601612951565b925050602061299c8582860161289c565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6129e38261280f565b810181811067ffffffffffffffff82111715612a0257612a016129ab565b5b80604052505050565b6000612a156126fa565b9050612a2182826129da565b919050565b600067ffffffffffffffff821115612a4157612a406129ab565b5b602082029050602081019050919050565b600080fd5b6000612a6a612a6584612a26565b612a0b565b90508083825260208201905060208402830185811115612a8d57612a8c612a52565b5b835b81811015612ab65780612aa2888261289c565b845260208401935050602081019050612a8f565b5050509392505050565b600082601f830112612ad557612ad46129a6565b5b8135612ae5848260208601612a57565b91505092915050565b60008060408385031215612b0557612b04612704565b5b6000612b138582860161289c565b925050602083013567ffffffffffffffff811115612b3457612b33612709565b5b612b4085828601612ac0565b9150509250929050565b600080600060608486031215612b6357612b62612704565b5b6000612b7186828701612951565b9350506020612b8286828701612951565b9250506040612b938682870161289c565b9150509250925092565b600060208284031215612bb357612bb2612704565b5b6000612bc184828501612951565b91505092915050565b612bd38161287b565b82525050565b6000602082019050612bee6000830184612bca565b92915050565b612bfd81612793565b8114612c0857600080fd5b50565b600081359050612c1a81612bf4565b92915050565b600060208284031215612c3657612c35612704565b5b6000612c4484828501612c0b565b91505092915050565b600067ffffffffffffffff82169050919050565b612c6a81612c4d565b8114612c7557600080fd5b50565b600081359050612c8781612c61565b92915050565b600060208284031215612ca357612ca2612704565b5b6000612cb184828501612c78565b91505092915050565b6000604082019050612ccf600083018561279f565b612cdc602083018461279f565b9392505050565b60008060408385031215612cfa57612cf9612704565b5b6000612d0885828601612951565b9250506020612d1985828601612c0b565b9150509250929050565b600080fd5b600067ffffffffffffffff821115612d4357612d426129ab565b5b612d4c8261280f565b9050602081019050919050565b82818337600083830152505050565b6000612d7b612d7684612d28565b612a0b565b905082815260208101848484011115612d9757612d96612d23565b5b612da2848285612d59565b509392505050565b600082601f830112612dbf57612dbe6129a6565b5b8135612dcf848260208601612d68565b91505092915050565b60008060008060808587031215612df257612df1612704565b5b6000612e0087828801612951565b9450506020612e1187828801612951565b9350506040612e228782880161289c565b925050606085013567ffffffffffffffff811115612e4357612e42612709565b5b612e4f87828801612daa565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e908161287b565b82525050565b6000612ea28383612e87565b60208301905092915050565b6000602082019050919050565b6000612ec682612e5b565b612ed08185612e66565b9350612edb83612e77565b8060005b83811015612f0c578151612ef38882612e96565b9750612efe83612eae565b925050600181019050612edf565b5085935050505092915050565b6000606082019050612f2e600083018661279f565b612f3b602083018561279f565b8181036040830152612f4d8184612ebb565b9050949350505050565b60008060408385031215612f6e57612f6d612704565b5b6000612f7c85828601612951565b9250506020612f8d85828601612951565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612fde57607f821691505b602082108103612ff157612ff0612f97565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006130536021836127d4565b915061305e82612ff7565b604082019050919050565b6000602082019050818103600083015261308281613046565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006130e5603d836127d4565b91506130f082613089565b604082019050919050565b60006020820190508181036000830152613114816130d8565b9050919050565b60006040820190506131306000830185612910565b61313d6020830184612910565b9392505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006131a0602d836127d4565b91506131ab82613144565b604082019050919050565b600060208201905081810360008301526131cf81613193565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061320c6018836127d4565b9150613217826131d6565b602082019050919050565b6000602082019050818103600083015261323b816131ff565b9050919050565b7f4e6f2072652d656e7472616e6379000000000000000000000000000000000000600082015250565b6000613278600e836127d4565b915061328382613242565b602082019050919050565b600060208201905081810360008301526132a78161326b565b9050919050565b600081519050919050565b600081905092915050565b60006132cf826132ae565b6132d981856132b9565b93506132e98185602086016127e5565b80840191505092915050565b600061330182846132c4565b915081905092915050565b60008151905061331b81612885565b92915050565b60006020828403121561333757613336612704565b5b60006133458482850161330c565b91505092915050565b7f57616c6c657420646f65736e2774206861766520764d6f6f6e65790000000000600082015250565b6000613384601b836127d4565b915061338f8261334e565b602082019050919050565b600060208201905081810360008301526133b381613377565b9050919050565b7f57616c6c657420616c7265616479206f776e732061207469636b657400000000600082015250565b60006133f0601c836127d4565b91506133fb826133ba565b602082019050919050565b6000602082019050818103600083015261341f816133e3565b9050919050565b7f5469636b6574732061726520736f6c64206f7574000000000000000000000000600082015250565b600061345c6014836127d4565b915061346782613426565b602082019050919050565b6000602082019050818103600083015261348b8161344f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006134ee6029836127d4565b91506134f982613492565b604082019050919050565b6000602082019050818103600083015261351d816134e1565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b600061355a601f836127d4565b915061356582613524565b602082019050919050565b600060208201905081810360008301526135898161354d565b9050919050565b6000819050919050565b6135a381613590565b82525050565b6135b281612c4d565b82525050565b600061ffff82169050919050565b6135cf816135b8565b82525050565b600063ffffffff82169050919050565b6135ee816135d5565b82525050565b600060a082019050613609600083018861359a565b61361660208301876135a9565b61362360408301866135c6565b61363060608301856135e5565b61363d60808301846135e5565b9695505050505050565b600060408201905061365c6000830185612bca565b61366960208301846135e5565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006136cc6026836127d4565b91506136d782613670565b604082019050919050565b600060208201905081810360008301526136fb816136bf565b9050919050565b7f72657175657374206e6f7420666f756e64000000000000000000000000000000600082015250565b60006137386011836127d4565b915061374382613702565b602082019050919050565b600060208201905081810360008301526137678161372b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006137d78261287b565b91506137e28361287b565b9250826137f2576137f161379d565b5b828206905092915050565b60008151905061380c8161293a565b92915050565b60006020828403121561382857613827612704565b5b6000613836848285016137fd565b91505092915050565b60006040820190506138546000830185612bca565b81810360208301526138668184612ebb565b90509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006138cb6025836127d4565b91506138d68261386f565b604082019050919050565b600060208201905081810360008301526138fa816138be565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061395d6024836127d4565b915061396882613901565b604082019050919050565b6000602082019050818103600083015261398c81613950565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139c96020836127d4565b91506139d482613993565b602082019050919050565b600060208201905081810360008301526139f8816139bc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613a356019836127d4565b9150613a40826139ff565b602082019050919050565b60006020820190508181036000830152613a6481613a28565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613ac76032836127d4565b9150613ad282613a6b565b604082019050919050565b60006020820190508181036000830152613af681613aba565b9050919050565b7f43616e6e6f74207472616e73666572207469636b65747320756e74696c20746860008201527f652077696e6e65722069732063686f73656e0000000000000000000000000000602082015250565b6000613b596032836127d4565b9150613b6482613afd565b604082019050919050565b60006020820190508181036000830152613b8881613b4c565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613bc56014836127d4565b9150613bd082613b8f565b602082019050919050565b60006020820190508181036000830152613bf481613bb8565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613c316010836127d4565b9150613c3c82613bfb565b602082019050919050565b60006020820190508181036000830152613c6081613c24565b9050919050565b600082825260208201905092915050565b6000613c83826132ae565b613c8d8185613c67565b9350613c9d8185602086016127e5565b613ca68161280f565b840191505092915050565b6000608082019050613cc66000830187612910565b613cd36020830186612910565b613ce06040830185612bca565b8181036060830152613cf28184613c78565b905095945050505050565b600081519050613d0c8161273a565b92915050565b600060208284031215613d2857613d27612704565b5b6000613d3684828501613cfd565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613d756020836127d4565b9150613d8082613d3f565b602082019050919050565b60006020820190508181036000830152613da481613d68565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613de1601c836127d4565b9150613dec82613dab565b602082019050919050565b60006020820190508181036000830152613e1081613dd4565b905091905056fe697066733a2f2f516d616d34354468345871737743647562686658717a444b75486e61464d774a35394d343173545a715276644a61a26469706673582212202f296101d9716e484a23016ea54509fe65ec92a6d1ed71a4c6ecc1831450230764736f6c63430008120033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80638456cb591161010f578063c87b56dd116100a2578063e831574211610071578063e831574214610570578063e985e9c51461058e578063f2fde38b146105be578063fc2a88c3146105da576101f0565b8063c87b56dd146104d2578063cd38aa8714610502578063d8a4676f14610520578063dfbf53ae14610552576101f0565b806395d89b41116100de57806395d89b411461044b578063a168fa8914610469578063a22cb4651461049a578063b88d4fde146104b6576101f0565b80638456cb59146103d75780638796ba8c146103e15780638da5cb5b146104115780639277f5e81461042f576101f0565b8063543e617f1161018757806370a082311161015657806370a0823114610363578063715018a614610393578063809b33401461039d5780638217a607146103bb576101f0565b8063543e617f146102ed5780635c975abb1461030b5780636352211e146103295780636871ee4014610359576101f0565b80631fe543e3116101c35780631fe543e31461028f57806323b872dd146102ab5780633f4ba83a146102c757806342842e0e146102d1576101f0565b806301ffc9a7146101f557806306fdde0314610225578063081812fc14610243578063095ea7b314610273575b600080fd5b61020f600480360381019061020a9190612766565b6105f8565b60405161021c91906127ae565b60405180910390f35b61022d6106da565b60405161023a9190612859565b60405180910390f35b61025d600480360381019061025891906128b1565b61076c565b60405161026a919061291f565b60405180910390f35b61028d60048036038101906102889190612966565b6107b2565b005b6102a960048036038101906102a49190612aee565b6108c9565b005b6102c560048036038101906102c09190612b4a565b610989565b005b6102cf6109e9565b005b6102eb60048036038101906102e69190612b4a565b6109fb565b005b6102f5610a1b565b604051610302919061291f565b60405180910390f35b610313610a41565b60405161032091906127ae565b60405180910390f35b610343600480360381019061033e91906128b1565b610a58565b604051610350919061291f565b60405180910390f35b610361610ade565b005b61037d60048036038101906103789190612b9d565b610dfe565b60405161038a9190612bd9565b60405180910390f35b61039b610eb5565b005b6103a5610ec9565b6040516103b291906127ae565b60405180910390f35b6103d560048036038101906103d09190612c20565b610edc565b005b6103df610f01565b005b6103fb60048036038101906103f691906128b1565b610f13565b6040516104089190612bd9565b60405180910390f35b610419610f37565b604051610426919061291f565b60405180910390f35b61044960048036038101906104449190612c8d565b610f61565b005b610453610f95565b6040516104609190612859565b60405180910390f35b610483600480360381019061047e91906128b1565b611027565b604051610491929190612cba565b60405180910390f35b6104b460048036038101906104af9190612ce3565b611065565b005b6104d060048036038101906104cb9190612dd8565b61107b565b005b6104ec60048036038101906104e791906128b1565b6110dd565b6040516104f99190612859565b60405180910390f35b61050a611147565b6040516105179190612bd9565b60405180910390f35b61053a600480360381019061053591906128b1565b611397565b60405161054993929190612f19565b60405180910390f35b61055a611469565b604051610567919061291f565b60405180910390f35b61057861148f565b6040516105859190612bd9565b60405180910390f35b6105a860048036038101906105a39190612f57565b611495565b6040516105b591906127ae565b60405180910390f35b6105d860048036038101906105d39190612b9d565b611529565b005b6105e26115ac565b6040516105ef9190612bd9565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106d357506106d2826115b2565b5b9050919050565b6060600080546106e990612fc6565b80601f016020809104026020016040519081016040528092919081815260200182805461071590612fc6565b80156107625780601f1061073757610100808354040283529160200191610762565b820191906000526020600020905b81548152906001019060200180831161074557829003601f168201915b5050505050905090565b60006107778261161c565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107bd82610a58565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361082d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082490613069565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661084c611667565b73ffffffffffffffffffffffffffffffffffffffff16148061087b575061087a81610875611667565b611495565b5b6108ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b1906130fb565b60405180910390fd5b6108c4838361166f565b505050565b7f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e6990973ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461097b57337f000000000000000000000000271682deb8c4e0901d1a1550ad2e64d568e699096040517f1cf993f400000000000000000000000000000000000000000000000000000000815260040161097292919061311b565b60405180910390fd5b6109858282611728565b5050565b61099a610994611667565b8261190b565b6109d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109d0906131b6565b60405180910390fd5b6109e48383836119a0565b505050565b6109f1611c99565b6109f9611d17565b565b610a168383836040518060200160405280600081525061107b565b505050565b601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600660149054906101000a900460ff16905090565b600080610a6483611d7a565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acc90613222565b60405180910390fd5b80915050919050565b601360149054906101000a900460ff1615610b2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b259061328e565b60405180910390fd5b6001601360146101000a81548160ff021916908315150217905550600080601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1633604051602401610b96919061291f565b6040516020818303038152906040527fadc63589000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610c2091906132f5565b6000604051808303816000865af19150503d8060008114610c5d576040519150601f19603f3d011682016040523d82523d6000602084013e610c62565b606091505b50915091504281806020019051810190610c7c9190613321565b11610cbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb39061339a565b60405180910390fd5b60013073ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610cf7919061291f565b602060405180830381865afa158015610d14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d389190613321565b10610d78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6f90613406565b60405180910390fd5b6000610d846012611db7565b90506010548110610dca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc190613472565b60405180910390fd5b610dd46012611dc5565b610dde3382611ddb565b5050506000601360146101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6590613504565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ebd611c99565b610ec76000611df9565b565b601160009054906101000a900460ff1681565b610ee4611c99565b80601160006101000a81548160ff02191690831515021790555050565b610f09611c99565b610f11611ebf565b565b600d8181548110610f2357600080fd5b906000526020600020016000915090505481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610f69611c99565b80600c60146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b606060018054610fa490612fc6565b80601f0160208091040260200160405190810160405280929190818152602001828054610fd090612fc6565b801561101d5780601f10610ff25761010080835404028352916020019161101d565b820191906000526020600020905b81548152906001019060200180831161100057829003601f168201915b5050505050905090565b600b6020528060005260406000206000915090508060000160009054906101000a900460ff16908060000160019054906101000a900460ff16905082565b611077611070611667565b8383611f22565b5050565b61108c611086611667565b8361190b565b6110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c2906131b6565b60405180910390fd5b6110d78484848461208e565b50505050565b60606110e8826120ea565b611127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111e90613570565b60405180910390fd5b604051806060016040528060358152602001613e18603591399050919050565b6000611151611c99565b6000620493e09050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600954600c60149054906101000a900467ffffffffffffffff16600f60009054906101000a900461ffff1685600f60029054906101000a900463ffffffff166040518663ffffffff1660e01b81526004016111f69594939291906135f4565b6020604051808303816000875af1158015611215573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112399190613321565b91506040518060600160405280600115158152602001600015158152602001600067ffffffffffffffff811115611273576112726129ab565b5b6040519080825280602002602001820160405280156112a15781602001602082028036833780820191505090505b50815250600b600084815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548160ff0219169083151502179055506040820151816001019080519060200190611314929190612690565b50905050600d82908060018154018082558091505060019003906000526020600020016000909190919091505581600e819055507fcc58b13ad3eab50626c6a6300b1d139cd6ebb1688a7cced9461c2f7e762665ee82600f60029054906101000a900463ffffffff1660405161138b929190613647565b60405180910390a15090565b60008060606000600b60008681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900460ff161515151581526020016001820180548060200260200160405190810160405280929190818152602001828054801561144157602002820191906000526020600020905b81548152602001906001019080831161142d575b5050505050815250509050806000015181602001518260400151935093509350509193909250565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60105481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611531611c99565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115a0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611597906136e2565b60405180910390fd5b6115a981611df9565b50565b600e5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611625816120ea565b611664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165b90613222565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166116e283610a58565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600b600083815260200190815260200160002060000160009054906101000a900460ff1661178b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117829061374e565b60405180910390fd5b6001600b600084815260200190815260200160002060000160016101000a81548160ff02191690831515021790555080600b600084815260200190815260200160002060010190805190602001906117e4929190612690565b503073ffffffffffffffffffffffffffffffffffffffff16636352211e61180b6012611db7565b8360008151811061181f5761181e61376e565b5b602002602001015161183191906137cc565b6040518263ffffffff1660e01b815260040161184d9190612bd9565b602060405180830381865afa15801561186a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188e9190613812565b600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ffe2e2d779dba245964d4e3ef9b994be63856fd568bf7d3ca9e224755cb1bd54d82826040516118ff92919061383f565b60405180910390a15050565b60008061191783610a58565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061195957506119588185611495565b5b8061199757508373ffffffffffffffffffffffffffffffffffffffff1661197f8461076c565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166119c082610a58565b73ffffffffffffffffffffffffffffffffffffffff1614611a16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0d906138e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7c90613973565b60405180910390fd5b611a92838383600161212b565b8273ffffffffffffffffffffffffffffffffffffffff16611ab282610a58565b73ffffffffffffffffffffffffffffffffffffffff1614611b08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aff906138e1565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c9483838360016121cf565b505050565b611ca1611667565b73ffffffffffffffffffffffffffffffffffffffff16611cbf610f37565b73ffffffffffffffffffffffffffffffffffffffff1614611d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0c906139df565b60405180910390fd5b565b611d1f6121d5565b6000600660146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611d63611667565b604051611d70919061291f565b60405180910390a1565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600081600001549050919050565b6001816000016000828254019250508190555050565b611df582826040518060200160405280600081525061221e565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611ec7612279565b6001600660146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f0b611667565b604051611f18919061291f565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8790613a4b565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161208191906127ae565b60405180910390a3505050565b6120998484846119a0565b6120a5848484846122c3565b6120e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120db90613add565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff1661210c83611d7a565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612133612279565b61213f8484848461244a565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156121895750601160009054906101000a900460ff16155b156121c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c090613b6f565b60405180910390fd5b50505050565b50505050565b6121dd610a41565b61221c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221390613bdb565b60405180910390fd5b565b6122288383612450565b61223560008484846122c3565b612274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226b90613add565b60405180910390fd5b505050565b612281610a41565b156122c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b890613c47565b60405180910390fd5b565b60006122e48473ffffffffffffffffffffffffffffffffffffffff1661266d565b1561243d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261230d611667565b8786866040518563ffffffff1660e01b815260040161232f9493929190613cb1565b6020604051808303816000875af192505050801561236b57506040513d601f19601f820116820180604052508101906123689190613d12565b60015b6123ed573d806000811461239b576040519150601f19603f3d011682016040523d82523d6000602084013e6123a0565b606091505b5060008151036123e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123dc90613add565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612442565b600190505b949350505050565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036124bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b690613d8b565b60405180910390fd5b6124c8816120ea565b15612508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ff90613df7565b60405180910390fd5b61251660008383600161212b565b61251f816120ea565b1561255f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255690613df7565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126696000838360016121cf565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280548282559060005260206000209081019282156126cc579160200282015b828111156126cb5782518255916020019190600101906126b0565b5b5090506126d991906126dd565b5090565b5b808211156126f65760008160009055506001016126de565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6127438161270e565b811461274e57600080fd5b50565b6000813590506127608161273a565b92915050565b60006020828403121561277c5761277b612704565b5b600061278a84828501612751565b91505092915050565b60008115159050919050565b6127a881612793565b82525050565b60006020820190506127c3600083018461279f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156128035780820151818401526020810190506127e8565b60008484015250505050565b6000601f19601f8301169050919050565b600061282b826127c9565b61283581856127d4565b93506128458185602086016127e5565b61284e8161280f565b840191505092915050565b600060208201905081810360008301526128738184612820565b905092915050565b6000819050919050565b61288e8161287b565b811461289957600080fd5b50565b6000813590506128ab81612885565b92915050565b6000602082840312156128c7576128c6612704565b5b60006128d58482850161289c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612909826128de565b9050919050565b612919816128fe565b82525050565b60006020820190506129346000830184612910565b92915050565b612943816128fe565b811461294e57600080fd5b50565b6000813590506129608161293a565b92915050565b6000806040838503121561297d5761297c612704565b5b600061298b85828601612951565b925050602061299c8582860161289c565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6129e38261280f565b810181811067ffffffffffffffff82111715612a0257612a016129ab565b5b80604052505050565b6000612a156126fa565b9050612a2182826129da565b919050565b600067ffffffffffffffff821115612a4157612a406129ab565b5b602082029050602081019050919050565b600080fd5b6000612a6a612a6584612a26565b612a0b565b90508083825260208201905060208402830185811115612a8d57612a8c612a52565b5b835b81811015612ab65780612aa2888261289c565b845260208401935050602081019050612a8f565b5050509392505050565b600082601f830112612ad557612ad46129a6565b5b8135612ae5848260208601612a57565b91505092915050565b60008060408385031215612b0557612b04612704565b5b6000612b138582860161289c565b925050602083013567ffffffffffffffff811115612b3457612b33612709565b5b612b4085828601612ac0565b9150509250929050565b600080600060608486031215612b6357612b62612704565b5b6000612b7186828701612951565b9350506020612b8286828701612951565b9250506040612b938682870161289c565b9150509250925092565b600060208284031215612bb357612bb2612704565b5b6000612bc184828501612951565b91505092915050565b612bd38161287b565b82525050565b6000602082019050612bee6000830184612bca565b92915050565b612bfd81612793565b8114612c0857600080fd5b50565b600081359050612c1a81612bf4565b92915050565b600060208284031215612c3657612c35612704565b5b6000612c4484828501612c0b565b91505092915050565b600067ffffffffffffffff82169050919050565b612c6a81612c4d565b8114612c7557600080fd5b50565b600081359050612c8781612c61565b92915050565b600060208284031215612ca357612ca2612704565b5b6000612cb184828501612c78565b91505092915050565b6000604082019050612ccf600083018561279f565b612cdc602083018461279f565b9392505050565b60008060408385031215612cfa57612cf9612704565b5b6000612d0885828601612951565b9250506020612d1985828601612c0b565b9150509250929050565b600080fd5b600067ffffffffffffffff821115612d4357612d426129ab565b5b612d4c8261280f565b9050602081019050919050565b82818337600083830152505050565b6000612d7b612d7684612d28565b612a0b565b905082815260208101848484011115612d9757612d96612d23565b5b612da2848285612d59565b509392505050565b600082601f830112612dbf57612dbe6129a6565b5b8135612dcf848260208601612d68565b91505092915050565b60008060008060808587031215612df257612df1612704565b5b6000612e0087828801612951565b9450506020612e1187828801612951565b9350506040612e228782880161289c565b925050606085013567ffffffffffffffff811115612e4357612e42612709565b5b612e4f87828801612daa565b91505092959194509250565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e908161287b565b82525050565b6000612ea28383612e87565b60208301905092915050565b6000602082019050919050565b6000612ec682612e5b565b612ed08185612e66565b9350612edb83612e77565b8060005b83811015612f0c578151612ef38882612e96565b9750612efe83612eae565b925050600181019050612edf565b5085935050505092915050565b6000606082019050612f2e600083018661279f565b612f3b602083018561279f565b8181036040830152612f4d8184612ebb565b9050949350505050565b60008060408385031215612f6e57612f6d612704565b5b6000612f7c85828601612951565b9250506020612f8d85828601612951565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612fde57607f821691505b602082108103612ff157612ff0612f97565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006130536021836127d4565b915061305e82612ff7565b604082019050919050565b6000602082019050818103600083015261308281613046565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b60006130e5603d836127d4565b91506130f082613089565b604082019050919050565b60006020820190508181036000830152613114816130d8565b9050919050565b60006040820190506131306000830185612910565b61313d6020830184612910565b9392505050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b60006131a0602d836127d4565b91506131ab82613144565b604082019050919050565b600060208201905081810360008301526131cf81613193565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061320c6018836127d4565b9150613217826131d6565b602082019050919050565b6000602082019050818103600083015261323b816131ff565b9050919050565b7f4e6f2072652d656e7472616e6379000000000000000000000000000000000000600082015250565b6000613278600e836127d4565b915061328382613242565b602082019050919050565b600060208201905081810360008301526132a78161326b565b9050919050565b600081519050919050565b600081905092915050565b60006132cf826132ae565b6132d981856132b9565b93506132e98185602086016127e5565b80840191505092915050565b600061330182846132c4565b915081905092915050565b60008151905061331b81612885565b92915050565b60006020828403121561333757613336612704565b5b60006133458482850161330c565b91505092915050565b7f57616c6c657420646f65736e2774206861766520764d6f6f6e65790000000000600082015250565b6000613384601b836127d4565b915061338f8261334e565b602082019050919050565b600060208201905081810360008301526133b381613377565b9050919050565b7f57616c6c657420616c7265616479206f776e732061207469636b657400000000600082015250565b60006133f0601c836127d4565b91506133fb826133ba565b602082019050919050565b6000602082019050818103600083015261341f816133e3565b9050919050565b7f5469636b6574732061726520736f6c64206f7574000000000000000000000000600082015250565b600061345c6014836127d4565b915061346782613426565b602082019050919050565b6000602082019050818103600083015261348b8161344f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006134ee6029836127d4565b91506134f982613492565b604082019050919050565b6000602082019050818103600083015261351d816134e1565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b600061355a601f836127d4565b915061356582613524565b602082019050919050565b600060208201905081810360008301526135898161354d565b9050919050565b6000819050919050565b6135a381613590565b82525050565b6135b281612c4d565b82525050565b600061ffff82169050919050565b6135cf816135b8565b82525050565b600063ffffffff82169050919050565b6135ee816135d5565b82525050565b600060a082019050613609600083018861359a565b61361660208301876135a9565b61362360408301866135c6565b61363060608301856135e5565b61363d60808301846135e5565b9695505050505050565b600060408201905061365c6000830185612bca565b61366960208301846135e5565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006136cc6026836127d4565b91506136d782613670565b604082019050919050565b600060208201905081810360008301526136fb816136bf565b9050919050565b7f72657175657374206e6f7420666f756e64000000000000000000000000000000600082015250565b60006137386011836127d4565b915061374382613702565b602082019050919050565b600060208201905081810360008301526137678161372b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006137d78261287b565b91506137e28361287b565b9250826137f2576137f161379d565b5b828206905092915050565b60008151905061380c8161293a565b92915050565b60006020828403121561382857613827612704565b5b6000613836848285016137fd565b91505092915050565b60006040820190506138546000830185612bca565b81810360208301526138668184612ebb565b90509392505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006138cb6025836127d4565b91506138d68261386f565b604082019050919050565b600060208201905081810360008301526138fa816138be565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061395d6024836127d4565b915061396882613901565b604082019050919050565b6000602082019050818103600083015261398c81613950565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139c96020836127d4565b91506139d482613993565b602082019050919050565b600060208201905081810360008301526139f8816139bc565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613a356019836127d4565b9150613a40826139ff565b602082019050919050565b60006020820190508181036000830152613a6481613a28565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613ac76032836127d4565b9150613ad282613a6b565b604082019050919050565b60006020820190508181036000830152613af681613aba565b9050919050565b7f43616e6e6f74207472616e73666572207469636b65747320756e74696c20746860008201527f652077696e6e65722069732063686f73656e0000000000000000000000000000602082015250565b6000613b596032836127d4565b9150613b6482613afd565b604082019050919050565b60006020820190508181036000830152613b8881613b4c565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613bc56014836127d4565b9150613bd082613b8f565b602082019050919050565b60006020820190508181036000830152613bf481613bb8565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000613c316010836127d4565b9150613c3c82613bfb565b602082019050919050565b60006020820190508181036000830152613c6081613c24565b9050919050565b600082825260208201905092915050565b6000613c83826132ae565b613c8d8185613c67565b9350613c9d8185602086016127e5565b613ca68161280f565b840191505092915050565b6000608082019050613cc66000830187612910565b613cd36020830186612910565b613ce06040830185612bca565b8181036060830152613cf28184613c78565b905095945050505050565b600081519050613d0c8161273a565b92915050565b600060208284031215613d2857613d27612704565b5b6000613d3684828501613cfd565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613d756020836127d4565b9150613d8082613d3f565b602082019050919050565b60006020820190508181036000830152613da481613d68565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613de1601c836127d4565b9150613dec82613dab565b602082019050919050565b60006020820190508181036000830152613e1081613dd4565b905091905056fe697066733a2f2f516d616d34354468345871737743647562686658717a444b75486e61464d774a35394d343173545a715276644a61a26469706673582212202f296101d9716e484a23016ea54509fe65ec92a6d1ed71a4c6ecc1831450230764736f6c63430008120033

Deployed Bytecode Sourcemap

72283:4957:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55933:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56861:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58373:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57891:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6777:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59073:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74727:65;;;:::i;:::-;;59479:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73476:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32499:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56571:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74800:556;;;:::i;:::-;;56302:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35364:103;;;:::i;:::-;;73342:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74266:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74658:61;;;:::i;:::-;;73122:27;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34716:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74140:118;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57030:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72929:60;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;58616:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59735:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74393:257;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75824:636;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76919:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;73032:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73257:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58842:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35622:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73156:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55933:305;56035:4;56087:25;56072:40;;;:11;:40;;;;:105;;;;56144:33;56129:48;;;:11;:48;;;;56072:105;:158;;;;56194:36;56218:11;56194:23;:36::i;:::-;56072:158;56052:178;;55933:305;;;:::o;56861:100::-;56915:13;56948:5;56941:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56861:100;:::o;58373:171::-;58449:7;58469:23;58484:7;58469:14;:23::i;:::-;58512:15;:24;58528:7;58512:24;;;;;;;;;;;;;;;;;;;;;58505:31;;58373:171;;;:::o;57891:416::-;57972:13;57988:23;58003:7;57988:14;:23::i;:::-;57972:39;;58036:5;58030:11;;:2;:11;;;58022:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;58130:5;58114:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;58139:37;58156:5;58163:12;:10;:12::i;:::-;58139:16;:37::i;:::-;58114:62;58092:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;58278:21;58287:2;58291:7;58278:8;:21::i;:::-;57961:346;57891:416;;:::o;6777:261::-;6891:14;6877:28;;:10;:28;;;6873:111;;6949:10;6961:14;6923:53;;;;;;;;;;;;:::i;:::-;;;;;;;;6873:111;6990:42;7009:9;7020:11;6990:18;:42::i;:::-;6777:261;;:::o;59073:335::-;59268:41;59287:12;:10;:12::i;:::-;59301:7;59268:18;:41::i;:::-;59260:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;59372:28;59382:4;59388:2;59392:7;59372:9;:28::i;:::-;59073:335;;;:::o;74727:65::-;34602:13;:11;:13::i;:::-;74774:10:::1;:8;:10::i;:::-;74727:65::o:0;59479:185::-;59617:39;59634:4;59640:2;59644:7;59617:39;;;;;;;;;;;;:16;:39::i;:::-;59479:185;;;:::o;73476:74::-;;;;;;;;;;;;;:::o;32499:86::-;32546:4;32570:7;;;;;;;;;;;32563:14;;32499:86;:::o;56571:223::-;56643:7;56663:13;56679:17;56688:7;56679:8;:17::i;:::-;56663:33;;56732:1;56715:19;;:5;:19;;;56707:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;56781:5;56774:12;;;56571:223;;;:::o;74800:556::-;74021:6;;;;;;;;;;;74020:7;74012:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;74066:4;74057:6;;:13;;;;;;;;;;;;;;;;;;74855:12:::1;74869:19:::0;74892:14:::1;;;;;;;;;;;:19;;74960:10;74912:59;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74892:80;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74854:118;;;;75023:15;75002:6;74991:29;;;;;;;;;;;;:::i;:::-;:47;74983:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;75118:1;75089:4;:14;;;75104:10;75089:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30;75081:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;75163:15;75181:25;:15;:23;:25::i;:::-;75163:43;;75235:9;;75225:7;:19;75217:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;75280:27;:15;:25;:27::i;:::-;75318:30;75328:10;75340:7;75318:9;:30::i;:::-;74843:513;;;74102:5:::0;74093:6;;:14;;;;;;;;;;;;;;;;;;74800:556::o;56302:207::-;56374:7;56419:1;56402:19;;:5;:19;;;56394:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56485:9;:16;56495:5;56485:16;;;;;;;;;;;;;;;;56478:23;;56302:207;;;:::o;35364:103::-;34602:13;:11;:13::i;:::-;35429:30:::1;35456:1;35429:18;:30::i;:::-;35364:103::o:0;73342:34::-;;;;;;;;;;;;;:::o;74266:119::-;34602:13;:11;:13::i;:::-;74362:15:::1;74345:14;;:32;;;;;;;;;;;;;;;;;;74266:119:::0;:::o;74658:61::-;34602:13;:11;:13::i;:::-;74703:8:::1;:6;:8::i;:::-;74658:61::o:0;73122:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34716:87::-;34762:7;34789:6;;;;;;;;;;;34782:13;;34716:87;:::o;74140:118::-;34602:13;:11;:13::i;:::-;74235:15:::1;74216:16;;:34;;;;;;;;;;;;;;;;;;74140:118:::0;:::o;57030:104::-;57086:13;57119:7;57112:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57030:104;:::o;72929:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58616:155::-;58711:52;58730:12;:10;:12::i;:::-;58744:8;58754;58711:18;:52::i;:::-;58616:155;;:::o;59735:322::-;59909:41;59928:12;:10;:12::i;:::-;59942:7;59909:18;:41::i;:::-;59901:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;60011:38;60025:4;60031:2;60035:7;60044:4;60011:13;:38::i;:::-;59735:322;;;;:::o;74393:257::-;74466:13;74499:16;74507:7;74499;:16::i;:::-;74491:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;74562:62;;;;;;;;;;;;;;;;;;;74393:257;;;:::o;75824:636::-;75875:17;34602:13;:11;:13::i;:::-;75905:23:::1;75931:6;75905:32;;75960:11;;;;;;;;;;;:30;;;76005:7;;76027:16;;;;;;;;;;;76058:20;;;;;;;;;;;76093:16;76124:8;;;;;;;;;;;75960:183;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;75948:195;;76178:126;;;;;;;;76257:4;76178:126;;;;;;76287:5;76178:126;;;;;;76234:1;76220:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76178:126;;::::0;76154:10:::1;:21;76165:9;76154:21;;;;;;;;;;;:150;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;76315:10;76331:9;76315:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76368:9;76352:13;:25;;;;76393:32;76405:9;76416:8;;;;;;;;;;;76393:32;;;;;;;:::i;:::-;;;;;;;;76436:16;75824:636:::0;:::o;76919:318::-;77031:9;77042:14;77058:28;77104;77135:10;:22;77146:10;77135:22;;;;;;;;;;;77104:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77176:7;:12;;;77190:7;:17;;;77209:7;:19;;;77168:61;;;;;;;76919:318;;;;;:::o;73032:21::-;;;;;;;;;;;;;:::o;73257:30::-;;;;:::o;58842:164::-;58939:4;58963:18;:25;58982:5;58963:25;;;;;;;;;;;;;;;:35;58989:8;58963:35;;;;;;;;;;;;;;;;;;;;;;;;;58956:42;;58842:164;;;;:::o;35622:201::-;34602:13;:11;:13::i;:::-;35731:1:::1;35711:22;;:8;:22;;::::0;35703:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;35787:28;35806:8;35787:18;:28::i;:::-;35622:201:::0;:::o;73156:28::-;;;;:::o;48445:157::-;48530:4;48569:25;48554:40;;;:11;:40;;;;48547:47;;48445:157;;;:::o;68192:135::-;68274:16;68282:7;68274;:16::i;:::-;68266:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;68192:135;:::o;30612:98::-;30665:7;30692:10;30685:17;;30612:98;:::o;67471:174::-;67573:2;67546:15;:24;67562:7;67546:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;67629:7;67625:2;67591:46;;67600:23;67615:7;67600:14;:23::i;:::-;67591:46;;;;;;;;;;;;67471:174;;:::o;76469:441::-;76608:10;:22;76619:10;76608:22;;;;;;;;;;;:27;;;;;;;;;;;;76600:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;76703:4;76668:10;:22;76679:10;76668:22;;;;;;;;;;;:32;;;:39;;;;;;;;;;;;;;;;;;76755:12;76718:10;:22;76729:10;76718:22;;;;;;;;;;;:34;;:49;;;;;;;;;;;;:::i;:::-;;76787:4;:12;;;76818:25;:15;:23;:25::i;:::-;76800:12;76813:1;76800:15;;;;;;;;:::i;:::-;;;;;;;;:43;;;;:::i;:::-;76787:57;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;76778:6;;:66;;;;;;;;;;;;;;;;;;76860:42;76877:10;76889:12;76860:42;;;;;;;:::i;:::-;;;;;;;;76469:441;;:::o;62090:264::-;62183:4;62200:13;62216:23;62231:7;62216:14;:23::i;:::-;62200:39;;62269:5;62258:16;;:7;:16;;;:52;;;;62278:32;62295:5;62302:7;62278:16;:32::i;:::-;62258:52;:87;;;;62338:7;62314:31;;:20;62326:7;62314:11;:20::i;:::-;:31;;;62258:87;62250:96;;;62090:264;;;;:::o;66089:1263::-;66248:4;66221:31;;:23;66236:7;66221:14;:23::i;:::-;:31;;;66213:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;66327:1;66313:16;;:2;:16;;;66305:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;66383:42;66404:4;66410:2;66414:7;66423:1;66383:20;:42::i;:::-;66555:4;66528:31;;:23;66543:7;66528:14;:23::i;:::-;:31;;;66520:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;66673:15;:24;66689:7;66673:24;;;;;;;;;;;;66666:31;;;;;;;;;;;67168:1;67149:9;:15;67159:4;67149:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;67201:1;67184:9;:13;67194:2;67184:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;67243:2;67224:7;:16;67232:7;67224:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;67282:7;67278:2;67263:27;;67272:4;67263:27;;;;;;;;;;;;67303:41;67323:4;67329:2;67333:7;67342:1;67303:19;:41::i;:::-;66089:1263;;;:::o;34881:132::-;34956:12;:10;:12::i;:::-;34945:23;;:7;:5;:7::i;:::-;:23;;;34937:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34881:132::o;33354:120::-;32363:16;:14;:16::i;:::-;33423:5:::1;33413:7;;:15;;;;;;;;;;;;;;;;;;33444:22;33453:12;:10;:12::i;:::-;33444:22;;;;;;:::i;:::-;;;;;;;;33354:120::o:0;61365:117::-;61431:7;61458;:16;61466:7;61458:16;;;;;;;;;;;;;;;;;;;;;61451:23;;61365:117;;;:::o;14141:114::-;14206:7;14233;:14;;;14226:21;;14141:114;;;:::o;14263:127::-;14370:1;14352:7;:14;;;:19;;;;;;;;;;;14263:127;:::o;62696:110::-;62772:26;62782:2;62786:7;62772:26;;;;;;;;;;;;:9;:26::i;:::-;62696:110;;:::o;35983:191::-;36057:16;36076:6;;;;;;;;;;;36057:25;;36102:8;36093:6;;:17;;;;;;;;;;;;;;;;;;36157:8;36126:40;;36147:8;36126:40;;;;;;;;;;;;36046:128;35983:191;:::o;33095:118::-;32104:19;:17;:19::i;:::-;33165:4:::1;33155:7;;:14;;;;;;;;;;;;;;;;;;33185:20;33192:12;:10;:12::i;:::-;33185:20;;;;;;:::i;:::-;;;;;;;;33095:118::o:0;67788:315::-;67943:8;67934:17;;:5;:17;;;67926:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;68030:8;67992:18;:25;68011:5;67992:25;;;;;;;;;;;;;;;:35;68018:8;67992:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;68076:8;68054:41;;68069:5;68054:41;;;68086:8;68054:41;;;;;;:::i;:::-;;;;;;;;67788:315;;;:::o;60938:313::-;61094:28;61104:4;61110:2;61114:7;61094:9;:28::i;:::-;61141:47;61164:4;61170:2;61174:7;61183:4;61141:22;:47::i;:::-;61133:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;60938:313;;;;:::o;61795:128::-;61860:4;61913:1;61884:31;;:17;61893:7;61884:8;:17::i;:::-;:31;;;;61877:38;;61795:128;;;:::o;75364:452::-;32104:19;:17;:19::i;:::-;75531:56:::1;75558:4;75564:2;75568:7;75577:9;75531:26;:56::i;:::-;75684:42;75668:59;;:4;:59;;;;:78;;;;;75732:14;;;;;;;;;;;75731:15;75668:78;75665:143;;;75748:60;;;;;;;;;;:::i;:::-;;;;;;;;75665:143;75364:452:::0;;;;:::o;71357:158::-;;;;;:::o;32843:108::-;32910:8;:6;:8::i;:::-;32902:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;32843:108::o;63033:319::-;63162:18;63168:2;63172:7;63162:5;:18::i;:::-;63213:53;63244:1;63248:2;63252:7;63261:4;63213:22;:53::i;:::-;63191:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;63033:319;;;:::o;32658:108::-;32729:8;:6;:8::i;:::-;32728:9;32720:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;32658:108::o;68891:853::-;69045:4;69066:15;:2;:13;;;:15::i;:::-;69062:675;;;69118:2;69102:36;;;69139:12;:10;:12::i;:::-;69153:4;69159:7;69168:4;69102:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;69098:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69360:1;69343:6;:13;:18;69339:328;;69386:60;;;;;;;;;;:::i;:::-;;;;;;;;69339:328;69617:6;69611:13;69602:6;69598:2;69594:15;69587:38;69098:584;69234:41;;;69224:51;;;:6;:51;;;;69217:58;;;;;69062:675;69721:4;69714:11;;68891:853;;;;;;;:::o;70476:159::-;;;;;:::o;63688:942::-;63782:1;63768:16;;:2;:16;;;63760:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;63841:16;63849:7;63841;:16::i;:::-;63840:17;63832:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;63903:48;63932:1;63936:2;63940:7;63949:1;63903:20;:48::i;:::-;64050:16;64058:7;64050;:16::i;:::-;64049:17;64041:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;64465:1;64448:9;:13;64458:2;64448:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;64509:2;64490:7;:16;64498:7;64490:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;64554:7;64550:2;64529:33;;64546:1;64529:33;;;;;;;;;;;;64575:47;64603:1;64607:2;64611:7;64620:1;64575:19;:47::i;:::-;63688:942;;:::o;37414:326::-;37474:4;37731:1;37709:7;:19;;;:23;37702:30;;37414:326;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:180;5061:77;5058:1;5051:88;5158:4;5155:1;5148:15;5182:4;5179:1;5172:15;5199:281;5282:27;5304:4;5282:27;:::i;:::-;5274:6;5270:40;5412:6;5400:10;5397:22;5376:18;5364:10;5361:34;5358:62;5355:88;;;5423:18;;:::i;:::-;5355:88;5463:10;5459:2;5452:22;5242:238;5199:281;;:::o;5486:129::-;5520:6;5547:20;;:::i;:::-;5537:30;;5576:33;5604:4;5596:6;5576:33;:::i;:::-;5486:129;;;:::o;5621:311::-;5698:4;5788:18;5780:6;5777:30;5774:56;;;5810:18;;:::i;:::-;5774:56;5860:4;5852:6;5848:17;5840:25;;5920:4;5914;5910:15;5902:23;;5621:311;;;:::o;5938:117::-;6047:1;6044;6037:12;6078:710;6174:5;6199:81;6215:64;6272:6;6215:64;:::i;:::-;6199:81;:::i;:::-;6190:90;;6300:5;6329:6;6322:5;6315:21;6363:4;6356:5;6352:16;6345:23;;6416:4;6408:6;6404:17;6396:6;6392:30;6445:3;6437:6;6434:15;6431:122;;;6464:79;;:::i;:::-;6431:122;6579:6;6562:220;6596:6;6591:3;6588:15;6562:220;;;6671:3;6700:37;6733:3;6721:10;6700:37;:::i;:::-;6695:3;6688:50;6767:4;6762:3;6758:14;6751:21;;6638:144;6622:4;6617:3;6613:14;6606:21;;6562:220;;;6566:21;6180:608;;6078:710;;;;;:::o;6811:370::-;6882:5;6931:3;6924:4;6916:6;6912:17;6908:27;6898:122;;6939:79;;:::i;:::-;6898:122;7056:6;7043:20;7081:94;7171:3;7163:6;7156:4;7148:6;7144:17;7081:94;:::i;:::-;7072:103;;6888:293;6811:370;;;;:::o;7187:684::-;7280:6;7288;7337:2;7325:9;7316:7;7312:23;7308:32;7305:119;;;7343:79;;:::i;:::-;7305:119;7463:1;7488:53;7533:7;7524:6;7513:9;7509:22;7488:53;:::i;:::-;7478:63;;7434:117;7618:2;7607:9;7603:18;7590:32;7649:18;7641:6;7638:30;7635:117;;;7671:79;;:::i;:::-;7635:117;7776:78;7846:7;7837:6;7826:9;7822:22;7776:78;:::i;:::-;7766:88;;7561:303;7187:684;;;;;:::o;7877:619::-;7954:6;7962;7970;8019:2;8007:9;7998:7;7994:23;7990:32;7987:119;;;8025:79;;:::i;:::-;7987:119;8145:1;8170:53;8215:7;8206:6;8195:9;8191:22;8170:53;:::i;:::-;8160:63;;8116:117;8272:2;8298:53;8343:7;8334:6;8323:9;8319:22;8298:53;:::i;:::-;8288:63;;8243:118;8400:2;8426:53;8471:7;8462:6;8451:9;8447:22;8426:53;:::i;:::-;8416:63;;8371:118;7877:619;;;;;:::o;8502:329::-;8561:6;8610:2;8598:9;8589:7;8585:23;8581:32;8578:119;;;8616:79;;:::i;:::-;8578:119;8736:1;8761:53;8806:7;8797:6;8786:9;8782:22;8761:53;:::i;:::-;8751:63;;8707:117;8502:329;;;;:::o;8837:118::-;8924:24;8942:5;8924:24;:::i;:::-;8919:3;8912:37;8837:118;;:::o;8961:222::-;9054:4;9092:2;9081:9;9077:18;9069:26;;9105:71;9173:1;9162:9;9158:17;9149:6;9105:71;:::i;:::-;8961:222;;;;:::o;9189:116::-;9259:21;9274:5;9259:21;:::i;:::-;9252:5;9249:32;9239:60;;9295:1;9292;9285:12;9239:60;9189:116;:::o;9311:133::-;9354:5;9392:6;9379:20;9370:29;;9408:30;9432:5;9408:30;:::i;:::-;9311:133;;;;:::o;9450:323::-;9506:6;9555:2;9543:9;9534:7;9530:23;9526:32;9523:119;;;9561:79;;:::i;:::-;9523:119;9681:1;9706:50;9748:7;9739:6;9728:9;9724:22;9706:50;:::i;:::-;9696:60;;9652:114;9450:323;;;;:::o;9779:101::-;9815:7;9855:18;9848:5;9844:30;9833:41;;9779:101;;;:::o;9886:120::-;9958:23;9975:5;9958:23;:::i;:::-;9951:5;9948:34;9938:62;;9996:1;9993;9986:12;9938:62;9886:120;:::o;10012:137::-;10057:5;10095:6;10082:20;10073:29;;10111:32;10137:5;10111:32;:::i;:::-;10012:137;;;;:::o;10155:327::-;10213:6;10262:2;10250:9;10241:7;10237:23;10233:32;10230:119;;;10268:79;;:::i;:::-;10230:119;10388:1;10413:52;10457:7;10448:6;10437:9;10433:22;10413:52;:::i;:::-;10403:62;;10359:116;10155:327;;;;:::o;10488:308::-;10597:4;10635:2;10624:9;10620:18;10612:26;;10648:65;10710:1;10699:9;10695:17;10686:6;10648:65;:::i;:::-;10723:66;10785:2;10774:9;10770:18;10761:6;10723:66;:::i;:::-;10488:308;;;;;:::o;10802:468::-;10867:6;10875;10924:2;10912:9;10903:7;10899:23;10895:32;10892:119;;;10930:79;;:::i;:::-;10892:119;11050:1;11075:53;11120:7;11111:6;11100:9;11096:22;11075:53;:::i;:::-;11065:63;;11021:117;11177:2;11203:50;11245:7;11236:6;11225:9;11221:22;11203:50;:::i;:::-;11193:60;;11148:115;10802:468;;;;;:::o;11276:117::-;11385:1;11382;11375:12;11399:307;11460:4;11550:18;11542:6;11539:30;11536:56;;;11572:18;;:::i;:::-;11536:56;11610:29;11632:6;11610:29;:::i;:::-;11602:37;;11694:4;11688;11684:15;11676:23;;11399:307;;;:::o;11712:146::-;11809:6;11804:3;11799;11786:30;11850:1;11841:6;11836:3;11832:16;11825:27;11712:146;;;:::o;11864:423::-;11941:5;11966:65;11982:48;12023:6;11982:48;:::i;:::-;11966:65;:::i;:::-;11957:74;;12054:6;12047:5;12040:21;12092:4;12085:5;12081:16;12130:3;12121:6;12116:3;12112:16;12109:25;12106:112;;;12137:79;;:::i;:::-;12106:112;12227:54;12274:6;12269:3;12264;12227:54;:::i;:::-;11947:340;11864:423;;;;;:::o;12306:338::-;12361:5;12410:3;12403:4;12395:6;12391:17;12387:27;12377:122;;12418:79;;:::i;:::-;12377:122;12535:6;12522:20;12560:78;12634:3;12626:6;12619:4;12611:6;12607:17;12560:78;:::i;:::-;12551:87;;12367:277;12306:338;;;;:::o;12650:943::-;12745:6;12753;12761;12769;12818:3;12806:9;12797:7;12793:23;12789:33;12786:120;;;12825:79;;:::i;:::-;12786:120;12945:1;12970:53;13015:7;13006:6;12995:9;12991:22;12970:53;:::i;:::-;12960:63;;12916:117;13072:2;13098:53;13143:7;13134:6;13123:9;13119:22;13098:53;:::i;:::-;13088:63;;13043:118;13200:2;13226:53;13271:7;13262:6;13251:9;13247:22;13226:53;:::i;:::-;13216:63;;13171:118;13356:2;13345:9;13341:18;13328:32;13387:18;13379:6;13376:30;13373:117;;;13409:79;;:::i;:::-;13373:117;13514:62;13568:7;13559:6;13548:9;13544:22;13514:62;:::i;:::-;13504:72;;13299:287;12650:943;;;;;;;:::o;13599:114::-;13666:6;13700:5;13694:12;13684:22;;13599:114;;;:::o;13719:184::-;13818:11;13852:6;13847:3;13840:19;13892:4;13887:3;13883:14;13868:29;;13719:184;;;;:::o;13909:132::-;13976:4;13999:3;13991:11;;14029:4;14024:3;14020:14;14012:22;;13909:132;;;:::o;14047:108::-;14124:24;14142:5;14124:24;:::i;:::-;14119:3;14112:37;14047:108;;:::o;14161:179::-;14230:10;14251:46;14293:3;14285:6;14251:46;:::i;:::-;14329:4;14324:3;14320:14;14306:28;;14161:179;;;;:::o;14346:113::-;14416:4;14448;14443:3;14439:14;14431:22;;14346:113;;;:::o;14495:732::-;14614:3;14643:54;14691:5;14643:54;:::i;:::-;14713:86;14792:6;14787:3;14713:86;:::i;:::-;14706:93;;14823:56;14873:5;14823:56;:::i;:::-;14902:7;14933:1;14918:284;14943:6;14940:1;14937:13;14918:284;;;15019:6;15013:13;15046:63;15105:3;15090:13;15046:63;:::i;:::-;15039:70;;15132:60;15185:6;15132:60;:::i;:::-;15122:70;;14978:224;14965:1;14962;14958:9;14953:14;;14918:284;;;14922:14;15218:3;15211:10;;14619:608;;;14495:732;;;;:::o;15233:569::-;15420:4;15458:2;15447:9;15443:18;15435:26;;15471:65;15533:1;15522:9;15518:17;15509:6;15471:65;:::i;:::-;15546:66;15608:2;15597:9;15593:18;15584:6;15546:66;:::i;:::-;15659:9;15653:4;15649:20;15644:2;15633:9;15629:18;15622:48;15687:108;15790:4;15781:6;15687:108;:::i;:::-;15679:116;;15233:569;;;;;;:::o;15808:474::-;15876:6;15884;15933:2;15921:9;15912:7;15908:23;15904:32;15901:119;;;15939:79;;:::i;:::-;15901:119;16059:1;16084:53;16129:7;16120:6;16109:9;16105:22;16084:53;:::i;:::-;16074:63;;16030:117;16186:2;16212:53;16257:7;16248:6;16237:9;16233:22;16212:53;:::i;:::-;16202:63;;16157:118;15808:474;;;;;:::o;16288:180::-;16336:77;16333:1;16326:88;16433:4;16430:1;16423:15;16457:4;16454:1;16447:15;16474:320;16518:6;16555:1;16549:4;16545:12;16535:22;;16602:1;16596:4;16592:12;16623:18;16613:81;;16679:4;16671:6;16667:17;16657:27;;16613:81;16741:2;16733:6;16730:14;16710:18;16707:38;16704:84;;16760:18;;:::i;:::-;16704:84;16525:269;16474:320;;;:::o;16800:220::-;16940:34;16936:1;16928:6;16924:14;16917:58;17009:3;17004:2;16996:6;16992:15;16985:28;16800:220;:::o;17026:366::-;17168:3;17189:67;17253:2;17248:3;17189:67;:::i;:::-;17182:74;;17265:93;17354:3;17265:93;:::i;:::-;17383:2;17378:3;17374:12;17367:19;;17026:366;;;:::o;17398:419::-;17564:4;17602:2;17591:9;17587:18;17579:26;;17651:9;17645:4;17641:20;17637:1;17626:9;17622:17;17615:47;17679:131;17805:4;17679:131;:::i;:::-;17671:139;;17398:419;;;:::o;17823:248::-;17963:34;17959:1;17951:6;17947:14;17940:58;18032:31;18027:2;18019:6;18015:15;18008:56;17823:248;:::o;18077:366::-;18219:3;18240:67;18304:2;18299:3;18240:67;:::i;:::-;18233:74;;18316:93;18405:3;18316:93;:::i;:::-;18434:2;18429:3;18425:12;18418:19;;18077:366;;;:::o;18449:419::-;18615:4;18653:2;18642:9;18638:18;18630:26;;18702:9;18696:4;18692:20;18688:1;18677:9;18673:17;18666:47;18730:131;18856:4;18730:131;:::i;:::-;18722:139;;18449:419;;;:::o;18874:332::-;18995:4;19033:2;19022:9;19018:18;19010:26;;19046:71;19114:1;19103:9;19099:17;19090:6;19046:71;:::i;:::-;19127:72;19195:2;19184:9;19180:18;19171:6;19127:72;:::i;:::-;18874:332;;;;;:::o;19212:232::-;19352:34;19348:1;19340:6;19336:14;19329:58;19421:15;19416:2;19408:6;19404:15;19397:40;19212:232;:::o;19450:366::-;19592:3;19613:67;19677:2;19672:3;19613:67;:::i;:::-;19606:74;;19689:93;19778:3;19689:93;:::i;:::-;19807:2;19802:3;19798:12;19791:19;;19450:366;;;:::o;19822:419::-;19988:4;20026:2;20015:9;20011:18;20003:26;;20075:9;20069:4;20065:20;20061:1;20050:9;20046:17;20039:47;20103:131;20229:4;20103:131;:::i;:::-;20095:139;;19822:419;;;:::o;20247:174::-;20387:26;20383:1;20375:6;20371:14;20364:50;20247:174;:::o;20427:366::-;20569:3;20590:67;20654:2;20649:3;20590:67;:::i;:::-;20583:74;;20666:93;20755:3;20666:93;:::i;:::-;20784:2;20779:3;20775:12;20768:19;;20427:366;;;:::o;20799:419::-;20965:4;21003:2;20992:9;20988:18;20980:26;;21052:9;21046:4;21042:20;21038:1;21027:9;21023:17;21016:47;21080:131;21206:4;21080:131;:::i;:::-;21072:139;;20799:419;;;:::o;21224:164::-;21364:16;21360:1;21352:6;21348:14;21341:40;21224:164;:::o;21394:366::-;21536:3;21557:67;21621:2;21616:3;21557:67;:::i;:::-;21550:74;;21633:93;21722:3;21633:93;:::i;:::-;21751:2;21746:3;21742:12;21735:19;;21394:366;;;:::o;21766:419::-;21932:4;21970:2;21959:9;21955:18;21947:26;;22019:9;22013:4;22009:20;22005:1;21994:9;21990:17;21983:47;22047:131;22173:4;22047:131;:::i;:::-;22039:139;;21766:419;;;:::o;22191:98::-;22242:6;22276:5;22270:12;22260:22;;22191:98;;;:::o;22295:147::-;22396:11;22433:3;22418:18;;22295:147;;;;:::o;22448:386::-;22552:3;22580:38;22612:5;22580:38;:::i;:::-;22634:88;22715:6;22710:3;22634:88;:::i;:::-;22627:95;;22731:65;22789:6;22784:3;22777:4;22770:5;22766:16;22731:65;:::i;:::-;22821:6;22816:3;22812:16;22805:23;;22556:278;22448:386;;;;:::o;22840:271::-;22970:3;22992:93;23081:3;23072:6;22992:93;:::i;:::-;22985:100;;23102:3;23095:10;;22840:271;;;;:::o;23117:143::-;23174:5;23205:6;23199:13;23190:22;;23221:33;23248:5;23221:33;:::i;:::-;23117:143;;;;:::o;23266:351::-;23336:6;23385:2;23373:9;23364:7;23360:23;23356:32;23353:119;;;23391:79;;:::i;:::-;23353:119;23511:1;23536:64;23592:7;23583:6;23572:9;23568:22;23536:64;:::i;:::-;23526:74;;23482:128;23266:351;;;;:::o;23623:177::-;23763:29;23759:1;23751:6;23747:14;23740:53;23623:177;:::o;23806:366::-;23948:3;23969:67;24033:2;24028:3;23969:67;:::i;:::-;23962:74;;24045:93;24134:3;24045:93;:::i;:::-;24163:2;24158:3;24154:12;24147:19;;23806:366;;;:::o;24178:419::-;24344:4;24382:2;24371:9;24367:18;24359:26;;24431:9;24425:4;24421:20;24417:1;24406:9;24402:17;24395:47;24459:131;24585:4;24459:131;:::i;:::-;24451:139;;24178:419;;;:::o;24603:178::-;24743:30;24739:1;24731:6;24727:14;24720:54;24603:178;:::o;24787:366::-;24929:3;24950:67;25014:2;25009:3;24950:67;:::i;:::-;24943:74;;25026:93;25115:3;25026:93;:::i;:::-;25144:2;25139:3;25135:12;25128:19;;24787:366;;;:::o;25159:419::-;25325:4;25363:2;25352:9;25348:18;25340:26;;25412:9;25406:4;25402:20;25398:1;25387:9;25383:17;25376:47;25440:131;25566:4;25440:131;:::i;:::-;25432:139;;25159:419;;;:::o;25584:170::-;25724:22;25720:1;25712:6;25708:14;25701:46;25584:170;:::o;25760:366::-;25902:3;25923:67;25987:2;25982:3;25923:67;:::i;:::-;25916:74;;25999:93;26088:3;25999:93;:::i;:::-;26117:2;26112:3;26108:12;26101:19;;25760:366;;;:::o;26132:419::-;26298:4;26336:2;26325:9;26321:18;26313:26;;26385:9;26379:4;26375:20;26371:1;26360:9;26356:17;26349:47;26413:131;26539:4;26413:131;:::i;:::-;26405:139;;26132:419;;;:::o;26557:228::-;26697:34;26693:1;26685:6;26681:14;26674:58;26766:11;26761:2;26753:6;26749:15;26742:36;26557:228;:::o;26791:366::-;26933:3;26954:67;27018:2;27013:3;26954:67;:::i;:::-;26947:74;;27030:93;27119:3;27030:93;:::i;:::-;27148:2;27143:3;27139:12;27132:19;;26791:366;;;:::o;27163:419::-;27329:4;27367:2;27356:9;27352:18;27344:26;;27416:9;27410:4;27406:20;27402:1;27391:9;27387:17;27380:47;27444:131;27570:4;27444:131;:::i;:::-;27436:139;;27163:419;;;:::o;27588:181::-;27728:33;27724:1;27716:6;27712:14;27705:57;27588:181;:::o;27775:366::-;27917:3;27938:67;28002:2;27997:3;27938:67;:::i;:::-;27931:74;;28014:93;28103:3;28014:93;:::i;:::-;28132:2;28127:3;28123:12;28116:19;;27775:366;;;:::o;28147:419::-;28313:4;28351:2;28340:9;28336:18;28328:26;;28400:9;28394:4;28390:20;28386:1;28375:9;28371:17;28364:47;28428:131;28554:4;28428:131;:::i;:::-;28420:139;;28147:419;;;:::o;28572:77::-;28609:7;28638:5;28627:16;;28572:77;;;:::o;28655:118::-;28742:24;28760:5;28742:24;:::i;:::-;28737:3;28730:37;28655:118;;:::o;28779:115::-;28864:23;28881:5;28864:23;:::i;:::-;28859:3;28852:36;28779:115;;:::o;28900:89::-;28936:7;28976:6;28969:5;28965:18;28954:29;;28900:89;;;:::o;28995:115::-;29080:23;29097:5;29080:23;:::i;:::-;29075:3;29068:36;28995:115;;:::o;29116:93::-;29152:7;29192:10;29185:5;29181:22;29170:33;;29116:93;;;:::o;29215:115::-;29300:23;29317:5;29300:23;:::i;:::-;29295:3;29288:36;29215:115;;:::o;29336:648::-;29533:4;29571:3;29560:9;29556:19;29548:27;;29585:71;29653:1;29642:9;29638:17;29629:6;29585:71;:::i;:::-;29666:70;29732:2;29721:9;29717:18;29708:6;29666:70;:::i;:::-;29746;29812:2;29801:9;29797:18;29788:6;29746:70;:::i;:::-;29826;29892:2;29881:9;29877:18;29868:6;29826:70;:::i;:::-;29906:71;29972:3;29961:9;29957:19;29948:6;29906:71;:::i;:::-;29336:648;;;;;;;;:::o;29990:328::-;30109:4;30147:2;30136:9;30132:18;30124:26;;30160:71;30228:1;30217:9;30213:17;30204:6;30160:71;:::i;:::-;30241:70;30307:2;30296:9;30292:18;30283:6;30241:70;:::i;:::-;29990:328;;;;;:::o;30324:225::-;30464:34;30460:1;30452:6;30448:14;30441:58;30533:8;30528:2;30520:6;30516:15;30509:33;30324:225;:::o;30555:366::-;30697:3;30718:67;30782:2;30777:3;30718:67;:::i;:::-;30711:74;;30794:93;30883:3;30794:93;:::i;:::-;30912:2;30907:3;30903:12;30896:19;;30555:366;;;:::o;30927:419::-;31093:4;31131:2;31120:9;31116:18;31108:26;;31180:9;31174:4;31170:20;31166:1;31155:9;31151:17;31144:47;31208:131;31334:4;31208:131;:::i;:::-;31200:139;;30927:419;;;:::o;31352:167::-;31492:19;31488:1;31480:6;31476:14;31469:43;31352:167;:::o;31525:366::-;31667:3;31688:67;31752:2;31747:3;31688:67;:::i;:::-;31681:74;;31764:93;31853:3;31764:93;:::i;:::-;31882:2;31877:3;31873:12;31866:19;;31525:366;;;:::o;31897:419::-;32063:4;32101:2;32090:9;32086:18;32078:26;;32150:9;32144:4;32140:20;32136:1;32125:9;32121:17;32114:47;32178:131;32304:4;32178:131;:::i;:::-;32170:139;;31897:419;;;:::o;32322:180::-;32370:77;32367:1;32360:88;32467:4;32464:1;32457:15;32491:4;32488:1;32481:15;32508:180;32556:77;32553:1;32546:88;32653:4;32650:1;32643:15;32677:4;32674:1;32667:15;32694:176;32726:1;32743:20;32761:1;32743:20;:::i;:::-;32738:25;;32777:20;32795:1;32777:20;:::i;:::-;32772:25;;32816:1;32806:35;;32821:18;;:::i;:::-;32806:35;32862:1;32859;32855:9;32850:14;;32694:176;;;;:::o;32876:143::-;32933:5;32964:6;32958:13;32949:22;;32980:33;33007:5;32980:33;:::i;:::-;32876:143;;;;:::o;33025:351::-;33095:6;33144:2;33132:9;33123:7;33119:23;33115:32;33112:119;;;33150:79;;:::i;:::-;33112:119;33270:1;33295:64;33351:7;33342:6;33331:9;33327:22;33295:64;:::i;:::-;33285:74;;33241:128;33025:351;;;;:::o;33382:483::-;33553:4;33591:2;33580:9;33576:18;33568:26;;33604:71;33672:1;33661:9;33657:17;33648:6;33604:71;:::i;:::-;33722:9;33716:4;33712:20;33707:2;33696:9;33692:18;33685:48;33750:108;33853:4;33844:6;33750:108;:::i;:::-;33742:116;;33382:483;;;;;:::o;33871:224::-;34011:34;34007:1;33999:6;33995:14;33988:58;34080:7;34075:2;34067:6;34063:15;34056:32;33871:224;:::o;34101:366::-;34243:3;34264:67;34328:2;34323:3;34264:67;:::i;:::-;34257:74;;34340:93;34429:3;34340:93;:::i;:::-;34458:2;34453:3;34449:12;34442:19;;34101:366;;;:::o;34473:419::-;34639:4;34677:2;34666:9;34662:18;34654:26;;34726:9;34720:4;34716:20;34712:1;34701:9;34697:17;34690:47;34754:131;34880:4;34754:131;:::i;:::-;34746:139;;34473:419;;;:::o;34898:223::-;35038:34;35034:1;35026:6;35022:14;35015:58;35107:6;35102:2;35094:6;35090:15;35083:31;34898:223;:::o;35127:366::-;35269:3;35290:67;35354:2;35349:3;35290:67;:::i;:::-;35283:74;;35366:93;35455:3;35366:93;:::i;:::-;35484:2;35479:3;35475:12;35468:19;;35127:366;;;:::o;35499:419::-;35665:4;35703:2;35692:9;35688:18;35680:26;;35752:9;35746:4;35742:20;35738:1;35727:9;35723:17;35716:47;35780:131;35906:4;35780:131;:::i;:::-;35772:139;;35499:419;;;:::o;35924:182::-;36064:34;36060:1;36052:6;36048:14;36041:58;35924:182;:::o;36112:366::-;36254:3;36275:67;36339:2;36334:3;36275:67;:::i;:::-;36268:74;;36351:93;36440:3;36351:93;:::i;:::-;36469:2;36464:3;36460:12;36453:19;;36112:366;;;:::o;36484:419::-;36650:4;36688:2;36677:9;36673:18;36665:26;;36737:9;36731:4;36727:20;36723:1;36712:9;36708:17;36701:47;36765:131;36891:4;36765:131;:::i;:::-;36757:139;;36484:419;;;:::o;36909:175::-;37049:27;37045:1;37037:6;37033:14;37026:51;36909:175;:::o;37090:366::-;37232:3;37253:67;37317:2;37312:3;37253:67;:::i;:::-;37246:74;;37329:93;37418:3;37329:93;:::i;:::-;37447:2;37442:3;37438:12;37431:19;;37090:366;;;:::o;37462:419::-;37628:4;37666:2;37655:9;37651:18;37643:26;;37715:9;37709:4;37705:20;37701:1;37690:9;37686:17;37679:47;37743:131;37869:4;37743:131;:::i;:::-;37735:139;;37462:419;;;:::o;37887:237::-;38027:34;38023:1;38015:6;38011:14;38004:58;38096:20;38091:2;38083:6;38079:15;38072:45;37887:237;:::o;38130:366::-;38272:3;38293:67;38357:2;38352:3;38293:67;:::i;:::-;38286:74;;38369:93;38458:3;38369:93;:::i;:::-;38487:2;38482:3;38478:12;38471:19;;38130:366;;;:::o;38502:419::-;38668:4;38706:2;38695:9;38691:18;38683:26;;38755:9;38749:4;38745:20;38741:1;38730:9;38726:17;38719:47;38783:131;38909:4;38783:131;:::i;:::-;38775:139;;38502:419;;;:::o;38927:237::-;39067:34;39063:1;39055:6;39051:14;39044:58;39136:20;39131:2;39123:6;39119:15;39112:45;38927:237;:::o;39170:366::-;39312:3;39333:67;39397:2;39392:3;39333:67;:::i;:::-;39326:74;;39409:93;39498:3;39409:93;:::i;:::-;39527:2;39522:3;39518:12;39511:19;;39170:366;;;:::o;39542:419::-;39708:4;39746:2;39735:9;39731:18;39723:26;;39795:9;39789:4;39785:20;39781:1;39770:9;39766:17;39759:47;39823:131;39949:4;39823:131;:::i;:::-;39815:139;;39542:419;;;:::o;39967:170::-;40107:22;40103:1;40095:6;40091:14;40084:46;39967:170;:::o;40143:366::-;40285:3;40306:67;40370:2;40365:3;40306:67;:::i;:::-;40299:74;;40382:93;40471:3;40382:93;:::i;:::-;40500:2;40495:3;40491:12;40484:19;;40143:366;;;:::o;40515:419::-;40681:4;40719:2;40708:9;40704:18;40696:26;;40768:9;40762:4;40758:20;40754:1;40743:9;40739:17;40732:47;40796:131;40922:4;40796:131;:::i;:::-;40788:139;;40515:419;;;:::o;40940:166::-;41080:18;41076:1;41068:6;41064:14;41057:42;40940:166;:::o;41112:366::-;41254:3;41275:67;41339:2;41334:3;41275:67;:::i;:::-;41268:74;;41351:93;41440:3;41351:93;:::i;:::-;41469:2;41464:3;41460:12;41453:19;;41112:366;;;:::o;41484:419::-;41650:4;41688:2;41677:9;41673:18;41665:26;;41737:9;41731:4;41727:20;41723:1;41712:9;41708:17;41701:47;41765:131;41891:4;41765:131;:::i;:::-;41757:139;;41484:419;;;:::o;41909:168::-;41992:11;42026:6;42021:3;42014:19;42066:4;42061:3;42057:14;42042:29;;41909:168;;;;:::o;42083:373::-;42169:3;42197:38;42229:5;42197:38;:::i;:::-;42251:70;42314:6;42309:3;42251:70;:::i;:::-;42244:77;;42330:65;42388:6;42383:3;42376:4;42369:5;42365:16;42330:65;:::i;:::-;42420:29;42442:6;42420:29;:::i;:::-;42415:3;42411:39;42404:46;;42173:283;42083:373;;;;:::o;42462:640::-;42657:4;42695:3;42684:9;42680:19;42672:27;;42709:71;42777:1;42766:9;42762:17;42753:6;42709:71;:::i;:::-;42790:72;42858:2;42847:9;42843:18;42834:6;42790:72;:::i;:::-;42872;42940:2;42929:9;42925:18;42916:6;42872:72;:::i;:::-;42991:9;42985:4;42981:20;42976:2;42965:9;42961:18;42954:48;43019:76;43090:4;43081:6;43019:76;:::i;:::-;43011:84;;42462:640;;;;;;;:::o;43108:141::-;43164:5;43195:6;43189:13;43180:22;;43211:32;43237:5;43211:32;:::i;:::-;43108:141;;;;:::o;43255:349::-;43324:6;43373:2;43361:9;43352:7;43348:23;43344:32;43341:119;;;43379:79;;:::i;:::-;43341:119;43499:1;43524:63;43579:7;43570:6;43559:9;43555:22;43524:63;:::i;:::-;43514:73;;43470:127;43255:349;;;;:::o;43610:182::-;43750:34;43746:1;43738:6;43734:14;43727:58;43610:182;:::o;43798:366::-;43940:3;43961:67;44025:2;44020:3;43961:67;:::i;:::-;43954:74;;44037:93;44126:3;44037:93;:::i;:::-;44155:2;44150:3;44146:12;44139:19;;43798:366;;;:::o;44170:419::-;44336:4;44374:2;44363:9;44359:18;44351:26;;44423:9;44417:4;44413:20;44409:1;44398:9;44394:17;44387:47;44451:131;44577:4;44451:131;:::i;:::-;44443:139;;44170:419;;;:::o;44595:178::-;44735:30;44731:1;44723:6;44719:14;44712:54;44595:178;:::o;44779:366::-;44921:3;44942:67;45006:2;45001:3;44942:67;:::i;:::-;44935:74;;45018:93;45107:3;45018:93;:::i;:::-;45136:2;45131:3;45127:12;45120:19;;44779:366;;;:::o;45151:419::-;45317:4;45355:2;45344:9;45340:18;45332:26;;45404:9;45398:4;45394:20;45390:1;45379:9;45375:17;45368:47;45432:131;45558:4;45432:131;:::i;:::-;45424:139;;45151:419;;;:::o

Swarm Source

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