ETH Price: $3,355.77 (+0.28%)
 

Overview

Max Total Supply

23 Lemon

Holders

22

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Lemon
0xcaba18ae3ed72886b64bfc24e79cd7a98137e536
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:
LemonadeStand

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-17
*/

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


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

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


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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

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


pragma solidity ^0.8.0;

contract VRFRequestIDBase {
  /**
   * @notice returns the seed which is actually input to the VRF coordinator
   *
   * @dev To prevent repetition of VRF output due to repetition of the
   * @dev user-supplied seed, that seed is combined in a hash with the
   * @dev user-specific nonce, and the address of the consuming contract. The
   * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in
   * @dev the final seed, but the nonce does protect against repetition in
   * @dev requests which are included in a single block.
   *
   * @param _userSeed VRF seed input provided by user
   * @param _requester Address of the requesting contract
   * @param _nonce User-specific nonce at the time of the request
   */
  function makeVRFInputSeed(
    bytes32 _keyHash,
    uint256 _userSeed,
    address _requester,
    uint256 _nonce
  ) internal pure returns (uint256) {
    return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce)));
  }

  /**
   * @notice Returns the id for this request
   * @param _keyHash The serviceAgreement ID to be used for this request
   * @param _vRFInputSeed The seed to be passed directly to the VRF
   * @return The id for this request
   *
   * @dev Note that _vRFInputSeed is not the seed passed by the consuming
   * @dev contract, but the one generated by makeVRFInputSeed
   */
  function makeRequestId(bytes32 _keyHash, uint256 _vRFInputSeed) internal pure returns (bytes32) {
    return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed));
  }
}

// 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: @chainlink/contracts/src/v0.8/VRFConsumerBase.sol


pragma solidity ^0.8.0;



/** ****************************************************************************
 * @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.
 * *****************************************************************************
 * @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, _link) 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), and have told you the minimum LINK
 * @dev price for VRF service. Make sure your contract has sufficient LINK, and
 * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you
 * @dev want to generate randomness from.
 *
 * @dev Once the VRFCoordinator has received and validated the oracle's response
 * @dev to your request, it will call your contract's fulfillRandomness method.
 *
 * @dev The randomness argument to fulfillRandomness is the actual random value
 * @dev generated from your seed.
 *
 * @dev The requestId argument is generated from the keyHash and the seed by
 * @dev makeRequestId(keyHash, seed). If your contract could have concurrent
 * @dev requests open, you can use the requestId to track which seed is
 * @dev associated with which randomness. See VRFRequestIDBase.sol for more
 * @dev details. (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. (Which is critical to making unpredictable randomness! See the
 * @dev next section.)
 *
 * *****************************************************************************
 * @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 ultimate input to the VRF is mixed with the block hash of the
 * @dev block in which the request is made, user-provided seeds have no impact
 * @dev on its economic security properties. They are only included for API
 * @dev compatability with previous versions of this contract.
 *
 * @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.
 */
abstract contract VRFConsumerBase is VRFRequestIDBase {
  /**
   * @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 VRFConsumerBase 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 randomness the VRF output
   */
  function fulfillRandomness(bytes32 requestId, uint256 randomness) internal virtual;

  /**
   * @dev In order to keep backwards compatibility we have kept the user
   * seed field around. We remove the use of it because given that the blockhash
   * enters later, it overrides whatever randomness the used seed provides.
   * Given that it adds no security, and can easily lead to misunderstandings,
   * we have removed it from usage and can now provide a simpler API.
   */
  uint256 private constant USER_SEED_PLACEHOLDER = 0;

  /**
   * @notice requestRandomness initiates a request for VRF output given _seed
   *
   * @dev The fulfillRandomness method receives the output, once it's provided
   * @dev by the Oracle, and verified by the vrfCoordinator.
   *
   * @dev The _keyHash must already be registered with the VRFCoordinator, and
   * @dev the _fee must exceed the fee specified during registration of the
   * @dev _keyHash.
   *
   * @dev The _seed parameter is vestigial, and is kept only for API
   * @dev compatibility with older versions. It can't *hurt* to mix in some of
   * @dev your own randomness, here, but it's not necessary because the VRF
   * @dev oracle will mix the hash of the block containing your request into the
   * @dev VRF seed it ultimately uses.
   *
   * @param _keyHash ID of public key against which randomness is generated
   * @param _fee The amount of LINK to send with the request
   *
   * @return requestId unique ID for this request
   *
   * @dev The returned requestId can be used to distinguish responses to
   * @dev concurrent requests. It is passed as the first argument to
   * @dev fulfillRandomness.
   */
  function requestRandomness(bytes32 _keyHash, uint256 _fee) internal returns (bytes32 requestId) {
    LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER));
    // This is the seed passed to VRFCoordinator. The oracle will mix this with
    // the hash of the block containing this request to obtain the seed/input
    // which is finally passed to the VRF cryptographic machinery.
    uint256 vRFSeed = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]);
    // nonces[_keyHash] must stay in sync with
    // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above
    // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest).
    // This provides protection against the user repeating their input seed,
    // which would result in a predictable/duplicate output, if multiple such
    // requests appeared in the same block.
    nonces[_keyHash] = nonces[_keyHash] + 1;
    return makeRequestId(_keyHash, vRFSeed);
  }

  LinkTokenInterface internal immutable LINK;
  address private immutable vrfCoordinator;

  // Nonces for each VRF key from which randomness has been requested.
  //
  // Must stay in sync with VRFCoordinator[_keyHash][this]
  mapping(bytes32 => uint256) /* keyHash */ /* nonce */
    private nonces;

  /**
   * @param _vrfCoordinator address of VRFCoordinator contract
   * @param _link address of LINK token contract
   *
   * @dev https://docs.chain.link/docs/link-token-contracts
   */
  constructor(address _vrfCoordinator, address _link) {
    vrfCoordinator = _vrfCoordinator;
    LINK = LinkTokenInterface(_link);
  }

  // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF
  // proof. rawFulfillRandomness then calls fulfillRandomness, after validating
  // the origin of the call
  function rawFulfillRandomness(bytes32 requestId, uint256 randomness) external {
    require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill");
    fulfillRandomness(requestId, randomness);
  }
}

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_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) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

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

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

    /**
     * @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/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/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    function safePermit(
        IERC20Permit token,
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal {
        uint256 nonceBefore = token.nonces(owner);
        token.permit(owner, spender, value, deadline, v, r, s);
        uint256 nonceAfter = token.nonces(owner);
        require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: default_workspace/UniRouterData.sol


pragma solidity >=0.8.7 <0.9.0;
/*
  _______                   ____  _____  
 |__   __|                 |___ \|  __ \ 
    | | ___  __ _ _ __ ___   __) | |  | |
    | |/ _ \/ _` | '_ ` _ \ |__ <| |  | |
    | |  __/ (_| | | | | | |___) | |__| | 
    |_|\___|\__,_|_| |_| |_|____/|_____/ 
*/

/**
 * @author Team3d.R&D
 */






interface IUniswapV2Factory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

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

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Router02 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

contract UniRouterData{

    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    IUniswapV2Router02 public immutable uniswapV2Router;

    address public immutable primaryToken;
    address public immutable vault;
    constructor(address primary, address reserves, address uniRouter){
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(uniRouter);//0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        uniswapV2Router = _uniswapV2Router;
        primaryToken = primary; //address(0x3D3D35bb9bEC23b06Ca00fe472b50E7A4c692C30);
        vault = reserves; //address(0xe4684AFE69bA238E3de17bbd0B1a64Ce7077da42);
    }

    function _buytoken(uint256 _value)internal returns(uint256){

        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = primaryToken;
        uint256 initBalance = IERC20(primaryToken).balanceOf(address(this));
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value:_value}(0, path, address(this), block.timestamp);
        uint256 boughtAmount = (IERC20(primaryToken).balanceOf(address(this)) - initBalance)/9;
        
        IERC20(primaryToken).safeTransfer(vault, boughtAmount);
        return boughtAmount*8;
    }

    receive() external payable {}

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

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

    /**
     * @dev 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/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// 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.7.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: 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 = _owners[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 nor 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 nor approved");

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits 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.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

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

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


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: default_workspace/LemonStand.sol


pragma solidity ^0.8.0;







contract LemonadeStand is ERC721Enumerable, VRFConsumerBase, ReentrancyGuard, UniRouterData{
    using SafeERC20 for IERC20;
    
    uint256 tokenIds;

    // 0, eth to winner, 1 token for losers, 2 tokenId of start, 3 number of raffle tickets
    mapping(uint256 => uint256[4]) public raffleData;
    mapping(uint256 => uint256) public winningToken;
    mapping(uint256 => uint256) public tokenToGameIndex;

    uint256 public raffleIndex;
    uint256 public constant hardCap = 125 ether;
    uint256 public nextPoolsPot;
    uint256 public constant timer = 30 days;
    
    uint256[] public endTimes;
    bool public drawing;
    
    // ChainLink Variables
    bytes32 private keyHash;
    uint256 private fee;
    mapping(bytes32=> uint256) requestIdToGameIndex;
    bytes32 currentRequestId;

    /// @notice Event emitted when randomNumber arrived.
    event requestMade(bytes32 indexed requestId, uint256 NumberOfTickets);
    event Winner(address indexed winner, uint256 indexed ticket);
    event ClaimedToken(address indexed user, uint256 amount, string indexed token);
    
    /**
     * Constructor inherits VRFConsumerBase
     *
     * Network: ETH  
     * Chainlink VRF Coordinator address: 0xf0d54349aDdcf704F77AE15b96510dEA15cb7952
     * LINK token address:                0x514910771AF9Ca656af840dff83E8264EcF986CA
     * Key Hash:                          0xAA77729D3466CA35AE8D28B3BBAC7CC36A5031EFDC430821C02BC31A238AF445
     * Fee :                              2 LINK (2000000000000000000 in wei)
     */

    constructor (
        ) UniRouterData(address(0x3D3D35bb9bEC23b06Ca00fe472b50E7A4c692C30), address(0xe4684AFE69bA238E3de17bbd0B1a64Ce7077da42), address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D)) 
        VRFConsumerBase(0xf0d54349aDdcf704F77AE15b96510dEA15cb7952, 0x514910771AF9Ca656af840dff83E8264EcF986CA) 
        ERC721("LemonadeStand", "Lemon") {
        endTimes.push(block.timestamp + timer);
        tokenIds = 1;
        keyHash = 0xAA77729D3466CA35AE8D28B3BBAC7CC36A5031EFDC430821C02BC31A238AF445;
        fee = 2 ether;
    }

    modifier playable() {
        require(!drawing, "Awaiting random selection.");
        _;
    }

    /**
     * @dev Public function to mint lemons.
     * @dev Anyone can mint as many lemons as they want. Lemons cost 0.1 eth each.
     * @dev Must not have hit hard cap of 125 eth.
     * @return tokenId
     */
    function mintLemon(uint8 buyAmount) external payable nonReentrant playable returns (uint256[] memory) {
        require(buyAmount > 0 && buyAmount < 11, "You can buy between 1-10 Lemons at a time.");
        // Allows tickets to be bought for the next game while awaiting for current game to finish
        require(msg.value == buyAmount * 0.1 ether, "Lemons go for 0.1 ETH each.");
        require(raffleData[raffleIndex][0] < hardCap, "Lemons have sold out.");
        uint value =  msg.value / 20;
        raffleData[raffleIndex][0] += (value * 10); // 50% to current raffle
        tokenToGameIndex[tokenIds] = raffleIndex;
        uint256 amount = _buytoken(value * 9);// 40% to buy a token for losers with 5% going to a seperate address
        raffleData[raffleIndex][1] += amount;
        nextPoolsPot += value; // 5% to next raffle

        uint256[] memory ret = new uint256[](buyAmount);
        for(uint8 i = 0; i < buyAmount; i++) {
            _mint(msg.sender, tokenIds);
            raffleData[raffleIndex][3]++;
            tokenToGameIndex[tokenIds] = raffleIndex;
            ret[i] = tokenIds;
            tokenIds++;
        }
        if(canRoll()) {_rollDice();}
        return ret;
    }

    function canRoll() public view returns (bool) {
        // At least 10 tickets need to be bought prior to roll and the hardcap or the timer has ended
        return (((raffleData[raffleIndex][0] >= hardCap || endTimes[raffleIndex] <= block.timestamp) && raffleData[raffleIndex][3] >= 20) && LINK.balanceOf(address(this)) >= fee);
    }

    function _rollDice() internal returns (bytes32) {
        currentRequestId = requestRandomness(keyHash, fee); 
        drawing = true;
        raffleData[raffleIndex+1][2] = tokenIds - 1;
        raffleData[raffleIndex+1][0] = nextPoolsPot;
        nextPoolsPot = 0;
        requestIdToGameIndex[currentRequestId] = raffleIndex;
        emit requestMade(currentRequestId, raffleData[raffleIndex][3]);
        return currentRequestId;
    }

    function rollDice() external playable nonReentrant returns (bytes32) {
        if(canRoll()) {return _rollDice();}
        else {revert();}
    }
    /**
     * @dev Callback function used by VRF Coordinator. This function sets new random number with unique request Id.
     * @param _requestId Request Id of randomness.
     * @param _randomness Random Number
     */
    function fulfillRandomness(bytes32 _requestId, uint256 _randomness) internal override {
        require(requestIdToGameIndex[_requestId] == raffleIndex, "Request Id is not correct.");
        uint256 winningTicket = 1 + raffleData[raffleIndex][2] + ( _randomness % raffleData[raffleIndex][3]);
        winningToken[raffleIndex] = winningTicket;
        finalize(ownerOf(winningTicket), winningTicket);
    }

    function finalize(address winner, uint256 ticketNumber) internal {
        endTimes.push(block.timestamp + timer);
        raffleIndex++;
        drawing = false;
        emit Winner(winner, ticketNumber);
    }

    function unlocked(uint256 tokenId) public view returns (bool) {
        bool unlock = tokenToGameIndex[tokenId] == raffleIndex || endTimes[tokenToGameIndex[tokenId]] + (2 * timer) <= block.timestamp;
        unlock = unlock && !drawing;
        return unlock;
    }

    function _transfer(address from, address to, uint256 tokenId) internal override(ERC721) {
        require(unlocked(tokenId), "Lemon is Locked!");
        super._transfer(from, to, tokenId);
    }

    /**
     * @dev Override function of the standard ERC721 implementation. This function returns the same JSON URI for all existing tokens.
     * @param tokenId The token Id requested. 
     */
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        if(!_exists(tokenId)){
            return "No lemon for you.";
        }
        uint256 index = tokenToGameIndex[tokenId];
        if(index == raffleIndex){return "https://w3.lol/img/lemon.json";}
        else{
            if(winningToken[index]==tokenId){return "https://w3.lol/img/lemonade.json";}
            else{return "https://w3.lol/img/rottenlemon.json";}
        }
    } 

    function rewardAmount(uint256 tokenId) public view returns (uint256, bool) {
        uint256 index = tokenToGameIndex[tokenId];
        bool truth = winningToken[index] == tokenId;
        if(!_exists(tokenId)|| index == raffleIndex){return (0, false);}
        if(truth){return (raffleData[index][0], truth);
        }else{return ((raffleData[index][1] / (raffleData[index][3] - 1)), truth);}
    }

    function claimPrize(uint256 tokenId) external nonReentrant returns(uint256) {
        address user = ownerOf(tokenId);
        uint256 index = tokenToGameIndex[tokenId];
        require(user == msg.sender && _exists(tokenId), "Does not own the Lemon");
        require(index != raffleIndex, "Lemon: Still preparing.");
        (uint256 amount, bool truth) = rewardAmount(tokenId);
        require(amount > 0, "Nothing to claim");
        _burn(tokenId);
        if(truth){
            if(amount > address(this).balance) {amount = address(this).balance;}
            (bool sent, ) = user.call{value: amount}("");
            require(sent, "Failed to send Ether");
            emit ClaimedToken(user, amount, "Ethereum");
        }else{
            IERC20(primaryToken).safeTransfer(user, amount);
            emit ClaimedToken(user, amount, "VIDYA");
        }
        return amount;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"string","name":"token","type":"string"}],"name":"ClaimedToken","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":true,"internalType":"address","name":"winner","type":"address"},{"indexed":true,"internalType":"uint256","name":"ticket","type":"uint256"}],"name":"Winner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"requestId","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"NumberOfTickets","type":"uint256"}],"name":"requestMade","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":"canRoll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimPrize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"drawing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"endTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hardCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"buyAmount","type":"uint8"}],"name":"mintLemon","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextPoolsPot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"primaryToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"raffleData","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"raffleIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rollDice","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"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":"timer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenToGameIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"winningToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6101206040523480156200001257600080fd5b50733d3d35bb9bec23b06ca00fe472b50e7a4c692c3073e4684afe69ba238e3de17bbd0b1a64ce7077da42737a250d5630b4cf539739df2c5dacb4c659f2488d73f0d54349addcf704f77ae15b96510dea15cb795273514910771af9ca656af840dff83e8264ecf986ca6040518060400160405280600d81526020017f4c656d6f6e6164655374616e64000000000000000000000000000000000000008152506040518060400160405280600581526020017f4c656d6f6e000000000000000000000000000000000000000000000000000000815250816000908051906020019062000100929190620002c3565b50806001908051906020019062000119929190620002c3565b5050508173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050506001600b8190555060008190508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508373ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508273ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050505050601262278d004262000256919062000373565b90806001815401808255809150506001900390600052602060002001600090919091909150556001600c819055507faa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af44560001b601481905550671bc16d674ec800006015819055506200046e565b828054620002d190620003da565b90600052602060002090601f016020900481019282620002f5576000855562000341565b82601f106200031057805160ff191683800117855562000341565b8280016001018555821562000341579182015b828111156200034057825182559160200191906001019062000323565b5b50905062000350919062000354565b5090565b5b808211156200036f57600081600090555060010162000355565b5090565b60006200038082620003d0565b91506200038d83620003d0565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620003c557620003c462000410565b5b828201905092915050565b6000819050919050565b60006002820490506001821680620003f357607f821691505b602082108114156200040a57620004096200043f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160601c60a05160601c60c05160601c60e05160601c6101005160601c6159b86200050860003960008181611e0701526122be01526000818161153d01528181611ca901528181612048015281816120b9015281816121fc01526122e0015260008181610f6201528181611f5c01526121640152600081816115850152612eee0152600081816117560152612eb201526159b86000f3fe6080604052600436106102085760003560e01c8063837e7cc611610118578063a50371c6116100a0578063d5d1ae5e1161006f578063d5d1ae5e146107f0578063d70981541461082d578063e985e9c51461086a578063fb86a404146108a7578063fbfa77cf146108d25761020f565b8063a50371c614610722578063b77200b11461075f578063b88d4fde1461078a578063c87b56dd146107b35761020f565b8063932b37e0116100e7578063932b37e01461063d57806394985ddd1461067a57806395d89b41146106a3578063975020f5146106ce578063a22cb465146106f95761020f565b8063837e7cc61461057f57806388c9cb3c146105aa5780638b1cf21c146105d557806391ac094c146106125761020f565b80632f745c591161019b57806357fafbf21161016a57806357fafbf21461045f578063591daa021461049d5780636352211e146104c857806370a0823114610505578063836ea9e4146105425761020f565b80632f745c591461039157806342842e0e146103ce57806345a6e815146103f75780634f6ccce7146104225761020f565b8063095ea7b3116101d7578063095ea7b3146102e95780631694505e1461031257806318160ddd1461033d57806323b872dd146103685761020f565b806301ffc9a71461021457806305267fc71461025157806306fdde0314610281578063081812fc146102ac5761020f565b3661020f57005b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613e56565b6108fd565b604051610248919061475b565b60405180910390f35b61026b60048036038101906102669190613f4a565b610977565b6040516102789190614739565b60405180910390f35b34801561028d57600080fd5b50610296610d70565b6040516102a39190614866565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce9190613eb0565b610e02565b6040516102e0919061466b565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190613da9565b610e48565b005b34801561031e57600080fd5b50610327610f60565b60405161033491906147ff565b60405180910390f35b34801561034957600080fd5b50610352610f84565b60405161035f9190614c08565b60405180910390f35b34801561037457600080fd5b5061038f600480360381019061038a9190613c93565b610f91565b005b34801561039d57600080fd5b506103b860048036038101906103b39190613da9565b610ff1565b6040516103c59190614c08565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613c93565b611096565b005b34801561040357600080fd5b5061040c6110b6565b6040516104199190614c08565b60405180910390f35b34801561042e57600080fd5b5061044960048036038101906104449190613eb0565b6110bc565b6040516104569190614c08565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190613eb0565b61112d565b604051610494929190614c23565b60405180910390f35b3480156104a957600080fd5b506104b2611238565b6040516104bf9190614c08565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea9190613eb0565b61123e565b6040516104fc919061466b565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190613bf9565b6112f0565b6040516105399190614c08565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190613f0a565b6113a8565b6040516105769190614c08565b60405180910390f35b34801561058b57600080fd5b506105946113d0565b6040516105a19190614776565b60405180910390f35b3480156105b657600080fd5b506105bf61149c565b6040516105cc9190614c08565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f79190613eb0565b6114a3565b604051610609919061475b565b60405180910390f35b34801561061e57600080fd5b5061062761153b565b604051610634919061466b565b60405180910390f35b34801561064957600080fd5b50610664600480360381019061065f9190613eb0565b61155f565b6040516106719190614c08565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613e16565b611583565b005b3480156106af57600080fd5b506106b861161f565b6040516106c59190614866565b60405180910390f35b3480156106da57600080fd5b506106e36116b1565b6040516106f0919061475b565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b9190613d69565b611805565b005b34801561072e57600080fd5b5061074960048036038101906107449190613eb0565b61181b565b6040516107569190614c08565b60405180910390f35b34801561076b57600080fd5b50610774611833565b604051610781919061475b565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613ce6565b611846565b005b3480156107bf57600080fd5b506107da60048036038101906107d59190613eb0565b6118a8565b6040516107e79190614866565b60405180910390f35b3480156107fc57600080fd5b5061081760048036038101906108129190613eb0565b6119cf565b6040516108249190614c08565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f9190613eb0565b6119e7565b6040516108619190614c08565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190613c53565b611d64565b60405161089e919061475b565b60405180910390f35b3480156108b357600080fd5b506108bc611df8565b6040516108c99190614c08565b60405180910390f35b3480156108de57600080fd5b506108e7611e05565b6040516108f4919061466b565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610970575061096f82611e29565b5b9050919050565b60606002600b5414156109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b690614bc8565b60405180910390fd5b6002600b81905550601360009054906101000a900460ff1615610a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0e90614b68565b60405180910390fd5b60008260ff16118015610a2d5750600b8260ff16105b610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6390614888565b60405180910390fd5b67016345785d8a00008260ff16610a839190614e43565b67ffffffffffffffff163414610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac590614a08565b60405180910390fd5b6806c6b935b8bbd40000600d60006010548152602001908152602001600020600060048110610b0057610aff6151b9565b5b015410610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3990614aa8565b60405180910390fd5b6000601434610b519190614db8565b9050600a81610b609190614de9565b600d60006010548152602001908152602001600020600060048110610b8857610b876151b9565b5b016000828254610b989190614d62565b92505081905550601054600f6000600c548152602001908152602001600020819055506000610bd2600983610bcd9190614de9565b611f0b565b905080600d60006010548152602001908152602001600020600160048110610bfd57610bfc6151b9565b5b016000828254610c0d9190614d62565b925050819055508160116000828254610c269190614d62565b9250508190555060008460ff1667ffffffffffffffff811115610c4c57610c4b6151e8565b5b604051908082528060200260200182016040528015610c7a5781602001602082028036833780820191505090505b50905060005b8560ff168160ff161015610d4557610c9a33600c5461233b565b600d60006010548152602001908152602001600020600360048110610cc257610cc16151b9565b5b016000815480929190610cd490615045565b9190505550601054600f6000600c54815260200190815260200160002081905550600c54828260ff1681518110610d0e57610d0d6151b9565b5b602002602001018181525050600c6000815480929190610d2d90615045565b91905055508080610d3d9061508e565b915050610c80565b50610d4e6116b1565b15610d5d57610d5b612515565b505b8093505050506001600b81905550919050565b606060008054610d7f90614fe2565b80601f0160208091040260200160405190810160405280929190818152602001828054610dab90614fe2565b8015610df85780601f10610dcd57610100808354040283529160200191610df8565b820191906000526020600020905b815481529060010190602001808311610ddb57829003601f168201915b5050505050905090565b6000610e0d82612659565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e538261123e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb90614ae8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ee36126a4565b73ffffffffffffffffffffffffffffffffffffffff161480610f125750610f1181610f0c6126a4565b611d64565b5b610f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4890614a48565b60405180910390fd5b610f5b83836126ac565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600880549050905090565b610fa2610f9c6126a4565b82612765565b610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890614ba8565b60405180910390fd5b610fec8383836127fa565b505050565b6000610ffc836112f0565b821061103d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611034906148c8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110b183838360405180602001604052806000815250611846565b505050565b60115481565b60006110c6610f84565b8210611107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fe90614b28565b60405180910390fd5b6008828154811061111b5761111a6151b9565b5b90600052602060002001549050919050565b6000806000600f6000858152602001908152602001600020549050600084600e60008481526020019081526020016000205414905061116b85612852565b1580611178575060105482145b1561118b57600080935093505050611233565b80156111c557600d60008381526020019081526020016000206000600481106111b7576111b66151b9565b5b015481935093505050611233565b6001600d60008481526020019081526020016000206003600481106111ed576111ec6151b9565b5b01546111f99190614e85565b600d600084815260200190815260200160002060016004811061121f5761121e6151b9565b5b015461122b9190614db8565b819350935050505b915091565b60105481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112de90614ac8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611361576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611358906149e8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d60205281600052604060002081600481106113c457600080fd5b01600091509150505481565b6000601360009054906101000a900460ff1615611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141990614b68565b60405180910390fd5b6002600b541415611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90614bc8565b60405180910390fd5b6002600b819055506114786116b1565b1561148c57611485612515565b9050611491565b600080fd5b6001600b8190555090565b62278d0081565b600080601054600f600085815260200190815260200160002054148061151457504262278d0060026114d59190614de9565b6012600f600087815260200190815260200160002054815481106114fc576114fb6151b9565b5b90600052602060002001546115119190614d62565b11155b90508080156115305750601360009054906101000a900460ff16155b905080915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6012818154811061156f57600080fd5b906000526020600020016000915090505481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160890614a88565b60405180910390fd5b61161b82826128be565b5050565b60606001805461162e90614fe2565b80601f016020809104026020016040519081016040528092919081815260200182805461165a90614fe2565b80156116a75780601f1061167c576101008083540402835291602001916116a7565b820191906000526020600020905b81548152906001019060200180831161168a57829003601f168201915b5050505050905090565b60006806c6b935b8bbd40000600d600060105481526020019081526020016000206000600481106116e5576116e46151b9565b5b0154101580611714575042601260105481548110611706576117056151b9565b5b906000526020600020015411155b801561174a57506014600d60006010548152602001908152602001600020600360048110611745576117446151b9565b5b015410155b801561180057506015547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117ad919061466b565b60206040518083038186803b1580156117c557600080fd5b505afa1580156117d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117fd9190613edd565b10155b905090565b6118176118106126a4565b83836129bf565b5050565b600f6020528060005260406000206000915090505481565b601360009054906101000a900460ff1681565b6118576118516126a4565b83612765565b611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614ba8565b60405180910390fd5b6118a284848484612b2c565b50505050565b60606118b382612852565b6118f4576040518060400160405280601181526020017f4e6f206c656d6f6e20666f7220796f752e00000000000000000000000000000081525090506119ca565b6000600f6000848152602001908152602001600020549050601054811415611954576040518060400160405280601d81526020017f68747470733a2f2f77332e6c6f6c2f696d672f6c656d6f6e2e6a736f6e0000008152509150506119ca565b82600e60008381526020019081526020016000205414156119ad576040518060400160405280602081526020017f68747470733a2f2f77332e6c6f6c2f696d672f6c656d6f6e6164652e6a736f6e8152509150506119ca565b604051806060016040528060238152602001615960602391399150505b919050565b600e6020528060005260406000206000915090505481565b60006002600b541415611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2690614bc8565b60405180910390fd5b6002600b819055506000611a428361123e565b90506000600f60008581526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148015611a9c5750611a9b84612852565b5b611adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad290614be8565b60405180910390fd5b601054811415611b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1790614a28565b60405180910390fd5b600080611b2c8661112d565b9150915060008211611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a906148a8565b60405180910390fd5b611b7c86612b88565b8015611ca25747821115611b8e574791505b60008473ffffffffffffffffffffffffffffffffffffffff1683604051611bb490614656565b60006040518083038185875af1925050503d8060008114611bf1576040519150601f19603f3d011682016040523d82523d6000602084013e611bf6565b606091505b5050905080611c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3190614968565b60405180910390fd5b604051611c4690614641565b60405180910390208573ffffffffffffffffffffffffffffffffffffffff167f0904bf8ec5f04b9e994044076e94751f1c34056b02713f762ebc1a72e932769085604051611c949190614c08565b60405180910390a350611d50565b611ced84837f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ca59092919063ffffffff16565b604051611cf99061462c565b60405180910390208473ffffffffffffffffffffffffffffffffffffffff167f0904bf8ec5f04b9e994044076e94751f1c34056b02713f762ebc1a72e932769084604051611d479190614c08565b60405180910390a35b819450505050506001600b81905550919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6806c6b935b8bbd4000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ef457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f045750611f0382612d2b565b5b9050919050565b600080600267ffffffffffffffff811115611f2957611f286151e8565b5b604051908082528060200260200182016040528015611f575781602001602082028036833780820191505090505b5090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611fc057600080fd5b505afa158015611fd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff89190613c26565b8160008151811061200c5761200b6151b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061207b5761207a6151b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612110919061466b565b60206040518083038186803b15801561212857600080fd5b505afa15801561213c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121609190613edd565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b6f9de958560008530426040518663ffffffff1660e01b81526004016121c3949392919061481a565b6000604051808303818588803b1580156121dc57600080fd5b505af11580156121f0573d6000803e3d6000fd5b505050505060006009827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612253919061466b565b60206040518083038186803b15801561226b57600080fd5b505afa15801561227f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a39190613edd565b6122ad9190614e85565b6122b79190614db8565b90506123247f0000000000000000000000000000000000000000000000000000000000000000827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16612ca59092919063ffffffff16565b6008816123319190614de9565b9350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a290614a68565b60405180910390fd5b6123b481612852565b156123f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123eb90614928565b60405180910390fd5b61240060008383612d95565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124509190614d62565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461251160008383612ea9565b5050565b6000612525601454601554612eae565b6017819055506001601360006101000a81548160ff0219169083151502179055506001600c546125559190614e85565b600d600060016010546125689190614d62565b8152602001908152602001600020600260048110612589576125886151b9565b5b0181905550601154600d600060016010546125a49190614d62565b81526020019081526020016000206000600481106125c5576125c46151b9565b5b01819055506000601181905550601054601660006017548152602001908152602001600020819055506017547f12bdf3ad56ebbbfa0d9e56c15ade458f1e87801038e9d2fde884b7dfb4f78d5b600d6000601054815260200190815260200160002060036004811061263a576126396151b9565b5b01546040516126499190614c08565b60405180910390a2601754905090565b61266281612852565b6126a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269890614ac8565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661271f8361123e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806127718361123e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127b357506127b28185611d64565b5b806127f157508373ffffffffffffffffffffffffffffffffffffffff166127d984610e02565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b612803816114a3565b612842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283990614948565b60405180910390fd5b61284d838383613010565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b601054601660008481526020019081526020016000205414612915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290c90614b48565b60405180910390fd5b6000600d6000601054815260200190815260200160002060036004811061293f5761293e6151b9565b5b01548261294c91906150cc565b600d60006010548152602001908152602001600020600260048110612974576129736151b9565b5b015460016129829190614d62565b61298c9190614d62565b905080600e60006010548152602001908152602001600020819055506129ba6129b48261123e565b82613277565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a25906149a8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b1f919061475b565b60405180910390a3505050565b612b378484846127fa565b612b4384848484613329565b612b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b79906148e8565b60405180910390fd5b50505050565b6000612b938261123e565b9050612ba181600084612d95565b612bac6000836126ac565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bfc9190614e85565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ca181600084612ea9565b5050565b612d268363a9059cbb60e01b8484604051602401612cc49291906146d2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506134c0565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612da0838383613587565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612de357612dde8161358c565b612e22565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e2157612e2083826135d5565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e6557612e6081613742565b612ea4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ea357612ea28282613813565b5b5b505050565b505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16634000aea07f000000000000000000000000000000000000000000000000000000000000000084866000604051602001612f22929190614791565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401612f4f939291906146fb565b602060405180830381600087803b158015612f6957600080fd5b505af1158015612f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa19190613de9565b506000612fc484600030600a600089815260200190815260200160002054613892565b90506001600a600086815260200190815260200160002054612fe69190614d62565b600a60008681526020019081526020016000208190555061300784826138ce565b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166130308261123e565b73ffffffffffffffffffffffffffffffffffffffff1614613086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307d90614908565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ed90614988565b60405180910390fd5b613101838383612d95565b61310c6000826126ac565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461315c9190614e85565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131b39190614d62565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613272838383612ea9565b505050565b601262278d00426132889190614d62565b9080600181540180825580915050600190039060005260206000200160009091909190915055601060008154809291906132c190615045565b91905055506000601360006101000a81548160ff021916908315150217905550808273ffffffffffffffffffffffffffffffffffffffff167f9c2270628a9b29d30ae96b6c4c14ed646ee134febdce38a5b77f2bde9cea2e2060405160405180910390a35050565b600061334a8473ffffffffffffffffffffffffffffffffffffffff16613901565b156134b3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133736126a4565b8786866040518563ffffffff1660e01b81526004016133959493929190614686565b602060405180830381600087803b1580156133af57600080fd5b505af19250505080156133e057506040513d601f19601f820116820180604052508101906133dd9190613e83565b60015b613463573d8060008114613410576040519150601f19603f3d011682016040523d82523d6000602084013e613415565b606091505b5060008151141561345b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613452906148e8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134b8565b600190505b949350505050565b6000613522826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166139249092919063ffffffff16565b905060008151111561358257808060200190518101906135429190613de9565b613581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357890614b88565b60405180910390fd5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016135e2846112f0565b6135ec9190614e85565b90506000600760008481526020019081526020016000205490508181146136d1576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137569190614e85565b9050600060096000848152602001908152602001600020549050600060088381548110613786576137856151b9565b5b9060005260206000200154905080600883815481106137a8576137a76151b9565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137f7576137f661518a565b5b6001900381819060005260206000200160009055905550505050565b600061381e836112f0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000848484846040516020016138ab94939291906147ba565b6040516020818303038152906040528051906020012060001c9050949350505050565b600082826040516020016138e39291906145e9565b60405160208183030381529060405280519060200120905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060613933848460008561393c565b90509392505050565b606082471015613981576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613978906149c8565b60405180910390fd5b61398a85613901565b6139c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c090614b08565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516139f29190614615565b60006040518083038185875af1925050503d8060008114613a2f576040519150601f19603f3d011682016040523d82523d6000602084013e613a34565b606091505b5091509150613a44828286613a50565b92505050949350505050565b60608315613a6057829050613ab0565b600083511115613a735782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aa79190614866565b60405180910390fd5b9392505050565b6000613aca613ac584614c71565b614c4c565b905082815260208101848484011115613ae657613ae561521c565b5b613af1848285614fa0565b509392505050565b600081359050613b08816158d5565b92915050565b600081519050613b1d816158d5565b92915050565b600081359050613b32816158ec565b92915050565b600081519050613b47816158ec565b92915050565b600081359050613b5c81615903565b92915050565b600081359050613b718161591a565b92915050565b600081519050613b868161591a565b92915050565b600082601f830112613ba157613ba0615217565b5b8135613bb1848260208601613ab7565b91505092915050565b600081359050613bc981615931565b92915050565b600081519050613bde81615931565b92915050565b600081359050613bf381615948565b92915050565b600060208284031215613c0f57613c0e615226565b5b6000613c1d84828501613af9565b91505092915050565b600060208284031215613c3c57613c3b615226565b5b6000613c4a84828501613b0e565b91505092915050565b60008060408385031215613c6a57613c69615226565b5b6000613c7885828601613af9565b9250506020613c8985828601613af9565b9150509250929050565b600080600060608486031215613cac57613cab615226565b5b6000613cba86828701613af9565b9350506020613ccb86828701613af9565b9250506040613cdc86828701613bba565b9150509250925092565b60008060008060808587031215613d0057613cff615226565b5b6000613d0e87828801613af9565b9450506020613d1f87828801613af9565b9350506040613d3087828801613bba565b925050606085013567ffffffffffffffff811115613d5157613d50615221565b5b613d5d87828801613b8c565b91505092959194509250565b60008060408385031215613d8057613d7f615226565b5b6000613d8e85828601613af9565b9250506020613d9f85828601613b23565b9150509250929050565b60008060408385031215613dc057613dbf615226565b5b6000613dce85828601613af9565b9250506020613ddf85828601613bba565b9150509250929050565b600060208284031215613dff57613dfe615226565b5b6000613e0d84828501613b38565b91505092915050565b60008060408385031215613e2d57613e2c615226565b5b6000613e3b85828601613b4d565b9250506020613e4c85828601613bba565b9150509250929050565b600060208284031215613e6c57613e6b615226565b5b6000613e7a84828501613b62565b91505092915050565b600060208284031215613e9957613e98615226565b5b6000613ea784828501613b77565b91505092915050565b600060208284031215613ec657613ec5615226565b5b6000613ed484828501613bba565b91505092915050565b600060208284031215613ef357613ef2615226565b5b6000613f0184828501613bcf565b91505092915050565b60008060408385031215613f2157613f20615226565b5b6000613f2f85828601613bba565b9250506020613f4085828601613bba565b9150509250929050565b600060208284031215613f6057613f5f615226565b5b6000613f6e84828501613be4565b91505092915050565b6000613f838383613fa7565b60208301905092915050565b6000613f9b83836145b4565b60208301905092915050565b613fb081614eb9565b82525050565b613fbf81614eb9565b82525050565b6000613fd082614cc2565b613fda8185614d08565b9350613fe583614ca2565b8060005b83811015614016578151613ffd8882613f77565b975061400883614cee565b925050600181019050613fe9565b5085935050505092915050565b600061402e82614ccd565b6140388185614d19565b935061404383614cb2565b8060005b8381101561407457815161405b8882613f8f565b975061406683614cfb565b925050600181019050614047565b5085935050505092915050565b61408a81614ecb565b82525050565b61409981614ed7565b82525050565b6140b06140ab82614ed7565b6150b8565b82525050565b60006140c182614cd8565b6140cb8185614d2a565b93506140db818560208601614faf565b6140e48161522b565b840191505092915050565b60006140fa82614cd8565b6141048185614d3b565b9350614114818560208601614faf565b80840191505092915050565b61412981614f58565b82525050565b61413881614f6a565b82525050565b600061414982614ce3565b6141538185614d46565b9350614163818560208601614faf565b61416c8161522b565b840191505092915050565b6000614184602a83614d46565b915061418f8261523c565b604082019050919050565b60006141a7601083614d46565b91506141b28261528b565b602082019050919050565b60006141ca602b83614d46565b91506141d5826152b4565b604082019050919050565b60006141ed603283614d46565b91506141f882615303565b604082019050919050565b6000614210602583614d46565b915061421b82615352565b604082019050919050565b6000614233601c83614d46565b915061423e826153a1565b602082019050919050565b6000614256600583614d57565b9150614261826153ca565b600582019050919050565b6000614279601083614d46565b9150614284826153f3565b602082019050919050565b600061429c601483614d46565b91506142a78261541c565b602082019050919050565b60006142bf602483614d46565b91506142ca82615445565b604082019050919050565b60006142e2601983614d46565b91506142ed82615494565b602082019050919050565b6000614305600883614d57565b9150614310826154bd565b600882019050919050565b6000614328602683614d46565b9150614333826154e6565b604082019050919050565b600061434b602983614d46565b915061435682615535565b604082019050919050565b600061436e601b83614d46565b915061437982615584565b602082019050919050565b6000614391601783614d46565b915061439c826155ad565b602082019050919050565b60006143b4603e83614d46565b91506143bf826155d6565b604082019050919050565b60006143d7602083614d46565b91506143e282615625565b602082019050919050565b60006143fa601f83614d46565b91506144058261564e565b602082019050919050565b600061441d601583614d46565b915061442882615677565b602082019050919050565b6000614440601883614d46565b915061444b826156a0565b602082019050919050565b6000614463602183614d46565b915061446e826156c9565b604082019050919050565b6000614486600083614d3b565b915061449182615718565b600082019050919050565b60006144a9601d83614d46565b91506144b48261571b565b602082019050919050565b60006144cc602c83614d46565b91506144d782615744565b604082019050919050565b60006144ef601a83614d46565b91506144fa82615793565b602082019050919050565b6000614512601a83614d46565b915061451d826157bc565b602082019050919050565b6000614535602a83614d46565b9150614540826157e5565b604082019050919050565b6000614558602e83614d46565b915061456382615834565b604082019050919050565b600061457b601f83614d46565b915061458682615883565b602082019050919050565b600061459e601683614d46565b91506145a9826158ac565b602082019050919050565b6145bd81614f2d565b82525050565b6145cc81614f2d565b82525050565b6145e36145de82614f2d565b6150c2565b82525050565b60006145f5828561409f565b60208201915061460582846145d2565b6020820191508190509392505050565b600061462182846140ef565b915081905092915050565b600061463782614249565b9150819050919050565b600061464c826142f8565b9150819050919050565b600061466182614479565b9150819050919050565b60006020820190506146806000830184613fb6565b92915050565b600060808201905061469b6000830187613fb6565b6146a86020830186613fb6565b6146b560408301856145c3565b81810360608301526146c781846140b6565b905095945050505050565b60006040820190506146e76000830185613fb6565b6146f460208301846145c3565b9392505050565b60006060820190506147106000830186613fb6565b61471d60208301856145c3565b818103604083015261472f81846140b6565b9050949350505050565b600060208201905081810360008301526147538184614023565b905092915050565b60006020820190506147706000830184614081565b92915050565b600060208201905061478b6000830184614090565b92915050565b60006040820190506147a66000830185614090565b6147b360208301846145c3565b9392505050565b60006080820190506147cf6000830187614090565b6147dc60208301866145c3565b6147e96040830185613fb6565b6147f660608301846145c3565b95945050505050565b60006020820190506148146000830184614120565b92915050565b600060808201905061482f600083018761412f565b81810360208301526148418186613fc5565b90506148506040830185613fb6565b61485d60608301846145c3565b95945050505050565b60006020820190508181036000830152614880818461413e565b905092915050565b600060208201905081810360008301526148a181614177565b9050919050565b600060208201905081810360008301526148c18161419a565b9050919050565b600060208201905081810360008301526148e1816141bd565b9050919050565b60006020820190508181036000830152614901816141e0565b9050919050565b6000602082019050818103600083015261492181614203565b9050919050565b6000602082019050818103600083015261494181614226565b9050919050565b600060208201905081810360008301526149618161426c565b9050919050565b600060208201905081810360008301526149818161428f565b9050919050565b600060208201905081810360008301526149a1816142b2565b9050919050565b600060208201905081810360008301526149c1816142d5565b9050919050565b600060208201905081810360008301526149e18161431b565b9050919050565b60006020820190508181036000830152614a018161433e565b9050919050565b60006020820190508181036000830152614a2181614361565b9050919050565b60006020820190508181036000830152614a4181614384565b9050919050565b60006020820190508181036000830152614a61816143a7565b9050919050565b60006020820190508181036000830152614a81816143ca565b9050919050565b60006020820190508181036000830152614aa1816143ed565b9050919050565b60006020820190508181036000830152614ac181614410565b9050919050565b60006020820190508181036000830152614ae181614433565b9050919050565b60006020820190508181036000830152614b0181614456565b9050919050565b60006020820190508181036000830152614b218161449c565b9050919050565b60006020820190508181036000830152614b41816144bf565b9050919050565b60006020820190508181036000830152614b61816144e2565b9050919050565b60006020820190508181036000830152614b8181614505565b9050919050565b60006020820190508181036000830152614ba181614528565b9050919050565b60006020820190508181036000830152614bc18161454b565b9050919050565b60006020820190508181036000830152614be18161456e565b9050919050565b60006020820190508181036000830152614c0181614591565b9050919050565b6000602082019050614c1d60008301846145c3565b92915050565b6000604082019050614c3860008301856145c3565b614c456020830184614081565b9392505050565b6000614c56614c67565b9050614c628282615014565b919050565b6000604051905090565b600067ffffffffffffffff821115614c8c57614c8b6151e8565b5b614c958261522b565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d6d82614f2d565b9150614d7883614f2d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614dad57614dac6150fd565b5b828201905092915050565b6000614dc382614f2d565b9150614dce83614f2d565b925082614dde57614ddd61512c565b5b828204905092915050565b6000614df482614f2d565b9150614dff83614f2d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e3857614e376150fd565b5b828202905092915050565b6000614e4e82614f37565b9150614e5983614f37565b92508167ffffffffffffffff0483118215151615614e7a57614e796150fd565b5b828202905092915050565b6000614e9082614f2d565b9150614e9b83614f2d565b925082821015614eae57614ead6150fd565b5b828203905092915050565b6000614ec482614f0d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b6000614f6382614f7c565b9050919050565b6000614f7582614f2d565b9050919050565b6000614f8782614f8e565b9050919050565b6000614f9982614f0d565b9050919050565b82818337600083830152505050565b60005b83811015614fcd578082015181840152602081019050614fb2565b83811115614fdc576000848401525b50505050565b60006002820490506001821680614ffa57607f821691505b6020821081141561500e5761500d61515b565b5b50919050565b61501d8261522b565b810181811067ffffffffffffffff8211171561503c5761503b6151e8565b5b80604052505050565b600061505082614f2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615083576150826150fd565b5b600182019050919050565b600061509982614f4b565b915060ff8214156150ad576150ac6150fd565b5b600182019050919050565b6000819050919050565b6000819050919050565b60006150d782614f2d565b91506150e283614f2d565b9250826150f2576150f161512c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f596f752063616e20627579206265747765656e20312d3130204c656d6f6e732060008201527f617420612074696d652e00000000000000000000000000000000000000000000602082015250565b7f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5649445941000000000000000000000000000000000000000000000000000000600082015250565b7f4c656d6f6e206973204c6f636b65642100000000000000000000000000000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f457468657265756d000000000000000000000000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4c656d6f6e7320676f20666f7220302e312045544820656163682e0000000000600082015250565b7f4c656d6f6e3a205374696c6c20707265706172696e672e000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b7f4c656d6f6e73206861766520736f6c64206f75742e0000000000000000000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f52657175657374204964206973206e6f7420636f72726563742e000000000000600082015250565b7f4177616974696e672072616e646f6d2073656c656374696f6e2e000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f446f6573206e6f74206f776e20746865204c656d6f6e00000000000000000000600082015250565b6158de81614eb9565b81146158e957600080fd5b50565b6158f581614ecb565b811461590057600080fd5b50565b61590c81614ed7565b811461591757600080fd5b50565b61592381614ee1565b811461592e57600080fd5b50565b61593a81614f2d565b811461594557600080fd5b50565b61595181614f4b565b811461595c57600080fd5b5056fe68747470733a2f2f77332e6c6f6c2f696d672f726f7474656e6c656d6f6e2e6a736f6ea26469706673582212209edc93af51fb51a8b4b0217c8a4a8b0a496bf62d09f024556bcc28f1416b81da64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102085760003560e01c8063837e7cc611610118578063a50371c6116100a0578063d5d1ae5e1161006f578063d5d1ae5e146107f0578063d70981541461082d578063e985e9c51461086a578063fb86a404146108a7578063fbfa77cf146108d25761020f565b8063a50371c614610722578063b77200b11461075f578063b88d4fde1461078a578063c87b56dd146107b35761020f565b8063932b37e0116100e7578063932b37e01461063d57806394985ddd1461067a57806395d89b41146106a3578063975020f5146106ce578063a22cb465146106f95761020f565b8063837e7cc61461057f57806388c9cb3c146105aa5780638b1cf21c146105d557806391ac094c146106125761020f565b80632f745c591161019b57806357fafbf21161016a57806357fafbf21461045f578063591daa021461049d5780636352211e146104c857806370a0823114610505578063836ea9e4146105425761020f565b80632f745c591461039157806342842e0e146103ce57806345a6e815146103f75780634f6ccce7146104225761020f565b8063095ea7b3116101d7578063095ea7b3146102e95780631694505e1461031257806318160ddd1461033d57806323b872dd146103685761020f565b806301ffc9a71461021457806305267fc71461025157806306fdde0314610281578063081812fc146102ac5761020f565b3661020f57005b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190613e56565b6108fd565b604051610248919061475b565b60405180910390f35b61026b60048036038101906102669190613f4a565b610977565b6040516102789190614739565b60405180910390f35b34801561028d57600080fd5b50610296610d70565b6040516102a39190614866565b60405180910390f35b3480156102b857600080fd5b506102d360048036038101906102ce9190613eb0565b610e02565b6040516102e0919061466b565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190613da9565b610e48565b005b34801561031e57600080fd5b50610327610f60565b60405161033491906147ff565b60405180910390f35b34801561034957600080fd5b50610352610f84565b60405161035f9190614c08565b60405180910390f35b34801561037457600080fd5b5061038f600480360381019061038a9190613c93565b610f91565b005b34801561039d57600080fd5b506103b860048036038101906103b39190613da9565b610ff1565b6040516103c59190614c08565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613c93565b611096565b005b34801561040357600080fd5b5061040c6110b6565b6040516104199190614c08565b60405180910390f35b34801561042e57600080fd5b5061044960048036038101906104449190613eb0565b6110bc565b6040516104569190614c08565b60405180910390f35b34801561046b57600080fd5b5061048660048036038101906104819190613eb0565b61112d565b604051610494929190614c23565b60405180910390f35b3480156104a957600080fd5b506104b2611238565b6040516104bf9190614c08565b60405180910390f35b3480156104d457600080fd5b506104ef60048036038101906104ea9190613eb0565b61123e565b6040516104fc919061466b565b60405180910390f35b34801561051157600080fd5b5061052c60048036038101906105279190613bf9565b6112f0565b6040516105399190614c08565b60405180910390f35b34801561054e57600080fd5b5061056960048036038101906105649190613f0a565b6113a8565b6040516105769190614c08565b60405180910390f35b34801561058b57600080fd5b506105946113d0565b6040516105a19190614776565b60405180910390f35b3480156105b657600080fd5b506105bf61149c565b6040516105cc9190614c08565b60405180910390f35b3480156105e157600080fd5b506105fc60048036038101906105f79190613eb0565b6114a3565b604051610609919061475b565b60405180910390f35b34801561061e57600080fd5b5061062761153b565b604051610634919061466b565b60405180910390f35b34801561064957600080fd5b50610664600480360381019061065f9190613eb0565b61155f565b6040516106719190614c08565b60405180910390f35b34801561068657600080fd5b506106a1600480360381019061069c9190613e16565b611583565b005b3480156106af57600080fd5b506106b861161f565b6040516106c59190614866565b60405180910390f35b3480156106da57600080fd5b506106e36116b1565b6040516106f0919061475b565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b9190613d69565b611805565b005b34801561072e57600080fd5b5061074960048036038101906107449190613eb0565b61181b565b6040516107569190614c08565b60405180910390f35b34801561076b57600080fd5b50610774611833565b604051610781919061475b565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613ce6565b611846565b005b3480156107bf57600080fd5b506107da60048036038101906107d59190613eb0565b6118a8565b6040516107e79190614866565b60405180910390f35b3480156107fc57600080fd5b5061081760048036038101906108129190613eb0565b6119cf565b6040516108249190614c08565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f9190613eb0565b6119e7565b6040516108619190614c08565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190613c53565b611d64565b60405161089e919061475b565b60405180910390f35b3480156108b357600080fd5b506108bc611df8565b6040516108c99190614c08565b60405180910390f35b3480156108de57600080fd5b506108e7611e05565b6040516108f4919061466b565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610970575061096f82611e29565b5b9050919050565b60606002600b5414156109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b690614bc8565b60405180910390fd5b6002600b81905550601360009054906101000a900460ff1615610a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0e90614b68565b60405180910390fd5b60008260ff16118015610a2d5750600b8260ff16105b610a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6390614888565b60405180910390fd5b67016345785d8a00008260ff16610a839190614e43565b67ffffffffffffffff163414610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac590614a08565b60405180910390fd5b6806c6b935b8bbd40000600d60006010548152602001908152602001600020600060048110610b0057610aff6151b9565b5b015410610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3990614aa8565b60405180910390fd5b6000601434610b519190614db8565b9050600a81610b609190614de9565b600d60006010548152602001908152602001600020600060048110610b8857610b876151b9565b5b016000828254610b989190614d62565b92505081905550601054600f6000600c548152602001908152602001600020819055506000610bd2600983610bcd9190614de9565b611f0b565b905080600d60006010548152602001908152602001600020600160048110610bfd57610bfc6151b9565b5b016000828254610c0d9190614d62565b925050819055508160116000828254610c269190614d62565b9250508190555060008460ff1667ffffffffffffffff811115610c4c57610c4b6151e8565b5b604051908082528060200260200182016040528015610c7a5781602001602082028036833780820191505090505b50905060005b8560ff168160ff161015610d4557610c9a33600c5461233b565b600d60006010548152602001908152602001600020600360048110610cc257610cc16151b9565b5b016000815480929190610cd490615045565b9190505550601054600f6000600c54815260200190815260200160002081905550600c54828260ff1681518110610d0e57610d0d6151b9565b5b602002602001018181525050600c6000815480929190610d2d90615045565b91905055508080610d3d9061508e565b915050610c80565b50610d4e6116b1565b15610d5d57610d5b612515565b505b8093505050506001600b81905550919050565b606060008054610d7f90614fe2565b80601f0160208091040260200160405190810160405280929190818152602001828054610dab90614fe2565b8015610df85780601f10610dcd57610100808354040283529160200191610df8565b820191906000526020600020905b815481529060010190602001808311610ddb57829003601f168201915b5050505050905090565b6000610e0d82612659565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610e538261123e565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ec4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebb90614ae8565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ee36126a4565b73ffffffffffffffffffffffffffffffffffffffff161480610f125750610f1181610f0c6126a4565b611d64565b5b610f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4890614a48565b60405180910390fd5b610f5b83836126ac565b505050565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600880549050905090565b610fa2610f9c6126a4565b82612765565b610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890614ba8565b60405180910390fd5b610fec8383836127fa565b505050565b6000610ffc836112f0565b821061103d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611034906148c8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6110b183838360405180602001604052806000815250611846565b505050565b60115481565b60006110c6610f84565b8210611107576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fe90614b28565b60405180910390fd5b6008828154811061111b5761111a6151b9565b5b90600052602060002001549050919050565b6000806000600f6000858152602001908152602001600020549050600084600e60008481526020019081526020016000205414905061116b85612852565b1580611178575060105482145b1561118b57600080935093505050611233565b80156111c557600d60008381526020019081526020016000206000600481106111b7576111b66151b9565b5b015481935093505050611233565b6001600d60008481526020019081526020016000206003600481106111ed576111ec6151b9565b5b01546111f99190614e85565b600d600084815260200190815260200160002060016004811061121f5761121e6151b9565b5b015461122b9190614db8565b819350935050505b915091565b60105481565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112de90614ac8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611361576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611358906149e8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600d60205281600052604060002081600481106113c457600080fd5b01600091509150505481565b6000601360009054906101000a900460ff1615611422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141990614b68565b60405180910390fd5b6002600b541415611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90614bc8565b60405180910390fd5b6002600b819055506114786116b1565b1561148c57611485612515565b9050611491565b600080fd5b6001600b8190555090565b62278d0081565b600080601054600f600085815260200190815260200160002054148061151457504262278d0060026114d59190614de9565b6012600f600087815260200190815260200160002054815481106114fc576114fb6151b9565b5b90600052602060002001546115119190614d62565b11155b90508080156115305750601360009054906101000a900460ff16155b905080915050919050565b7f0000000000000000000000003d3d35bb9bec23b06ca00fe472b50e7a4c692c3081565b6012818154811061156f57600080fd5b906000526020600020016000915090505481565b7f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160890614a88565b60405180910390fd5b61161b82826128be565b5050565b60606001805461162e90614fe2565b80601f016020809104026020016040519081016040528092919081815260200182805461165a90614fe2565b80156116a75780601f1061167c576101008083540402835291602001916116a7565b820191906000526020600020905b81548152906001019060200180831161168a57829003601f168201915b5050505050905090565b60006806c6b935b8bbd40000600d600060105481526020019081526020016000206000600481106116e5576116e46151b9565b5b0154101580611714575042601260105481548110611706576117056151b9565b5b906000526020600020015411155b801561174a57506014600d60006010548152602001908152602001600020600360048110611745576117446151b9565b5b015410155b801561180057506015547f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016117ad919061466b565b60206040518083038186803b1580156117c557600080fd5b505afa1580156117d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117fd9190613edd565b10155b905090565b6118176118106126a4565b83836129bf565b5050565b600f6020528060005260406000206000915090505481565b601360009054906101000a900460ff1681565b6118576118516126a4565b83612765565b611896576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188d90614ba8565b60405180910390fd5b6118a284848484612b2c565b50505050565b60606118b382612852565b6118f4576040518060400160405280601181526020017f4e6f206c656d6f6e20666f7220796f752e00000000000000000000000000000081525090506119ca565b6000600f6000848152602001908152602001600020549050601054811415611954576040518060400160405280601d81526020017f68747470733a2f2f77332e6c6f6c2f696d672f6c656d6f6e2e6a736f6e0000008152509150506119ca565b82600e60008381526020019081526020016000205414156119ad576040518060400160405280602081526020017f68747470733a2f2f77332e6c6f6c2f696d672f6c656d6f6e6164652e6a736f6e8152509150506119ca565b604051806060016040528060238152602001615960602391399150505b919050565b600e6020528060005260406000206000915090505481565b60006002600b541415611a2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2690614bc8565b60405180910390fd5b6002600b819055506000611a428361123e565b90506000600f60008581526020019081526020016000205490503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148015611a9c5750611a9b84612852565b5b611adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad290614be8565b60405180910390fd5b601054811415611b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1790614a28565b60405180910390fd5b600080611b2c8661112d565b9150915060008211611b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6a906148a8565b60405180910390fd5b611b7c86612b88565b8015611ca25747821115611b8e574791505b60008473ffffffffffffffffffffffffffffffffffffffff1683604051611bb490614656565b60006040518083038185875af1925050503d8060008114611bf1576040519150601f19603f3d011682016040523d82523d6000602084013e611bf6565b606091505b5050905080611c3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3190614968565b60405180910390fd5b604051611c4690614641565b60405180910390208573ffffffffffffffffffffffffffffffffffffffff167f0904bf8ec5f04b9e994044076e94751f1c34056b02713f762ebc1a72e932769085604051611c949190614c08565b60405180910390a350611d50565b611ced84837f0000000000000000000000003d3d35bb9bec23b06ca00fe472b50e7a4c692c3073ffffffffffffffffffffffffffffffffffffffff16612ca59092919063ffffffff16565b604051611cf99061462c565b60405180910390208473ffffffffffffffffffffffffffffffffffffffff167f0904bf8ec5f04b9e994044076e94751f1c34056b02713f762ebc1a72e932769084604051611d479190614c08565b60405180910390a35b819450505050506001600b81905550919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6806c6b935b8bbd4000081565b7f000000000000000000000000e4684afe69ba238e3de17bbd0b1a64ce7077da4281565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ef457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f045750611f0382612d2b565b5b9050919050565b600080600267ffffffffffffffff811115611f2957611f286151e8565b5b604051908082528060200260200182016040528015611f575781602001602082028036833780820191505090505b5090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611fc057600080fd5b505afa158015611fd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff89190613c26565b8160008151811061200c5761200b6151b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000003d3d35bb9bec23b06ca00fe472b50e7a4c692c308160018151811061207b5761207a6151b9565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f0000000000000000000000003d3d35bb9bec23b06ca00fe472b50e7a4c692c3073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612110919061466b565b60206040518083038186803b15801561212857600080fd5b505afa15801561213c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121609190613edd565b90507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663b6f9de958560008530426040518663ffffffff1660e01b81526004016121c3949392919061481a565b6000604051808303818588803b1580156121dc57600080fd5b505af11580156121f0573d6000803e3d6000fd5b505050505060006009827f0000000000000000000000003d3d35bb9bec23b06ca00fe472b50e7a4c692c3073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612253919061466b565b60206040518083038186803b15801561226b57600080fd5b505afa15801561227f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a39190613edd565b6122ad9190614e85565b6122b79190614db8565b90506123247f000000000000000000000000e4684afe69ba238e3de17bbd0b1a64ce7077da42827f0000000000000000000000003d3d35bb9bec23b06ca00fe472b50e7a4c692c3073ffffffffffffffffffffffffffffffffffffffff16612ca59092919063ffffffff16565b6008816123319190614de9565b9350505050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156123ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a290614a68565b60405180910390fd5b6123b481612852565b156123f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123eb90614928565b60405180910390fd5b61240060008383612d95565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124509190614d62565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461251160008383612ea9565b5050565b6000612525601454601554612eae565b6017819055506001601360006101000a81548160ff0219169083151502179055506001600c546125559190614e85565b600d600060016010546125689190614d62565b8152602001908152602001600020600260048110612589576125886151b9565b5b0181905550601154600d600060016010546125a49190614d62565b81526020019081526020016000206000600481106125c5576125c46151b9565b5b01819055506000601181905550601054601660006017548152602001908152602001600020819055506017547f12bdf3ad56ebbbfa0d9e56c15ade458f1e87801038e9d2fde884b7dfb4f78d5b600d6000601054815260200190815260200160002060036004811061263a576126396151b9565b5b01546040516126499190614c08565b60405180910390a2601754905090565b61266281612852565b6126a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269890614ac8565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661271f8361123e565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806127718361123e565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127b357506127b28185611d64565b5b806127f157508373ffffffffffffffffffffffffffffffffffffffff166127d984610e02565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b612803816114a3565b612842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161283990614948565b60405180910390fd5b61284d838383613010565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b601054601660008481526020019081526020016000205414612915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161290c90614b48565b60405180910390fd5b6000600d6000601054815260200190815260200160002060036004811061293f5761293e6151b9565b5b01548261294c91906150cc565b600d60006010548152602001908152602001600020600260048110612974576129736151b9565b5b015460016129829190614d62565b61298c9190614d62565b905080600e60006010548152602001908152602001600020819055506129ba6129b48261123e565b82613277565b505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a25906149a8565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612b1f919061475b565b60405180910390a3505050565b612b378484846127fa565b612b4384848484613329565b612b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b79906148e8565b60405180910390fd5b50505050565b6000612b938261123e565b9050612ba181600084612d95565b612bac6000836126ac565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bfc9190614e85565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ca181600084612ea9565b5050565b612d268363a9059cbb60e01b8484604051602401612cc49291906146d2565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506134c0565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612da0838383613587565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612de357612dde8161358c565b612e22565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e2157612e2083826135d5565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e6557612e6081613742565b612ea4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ea357612ea28282613813565b5b5b505050565b505050565b60007f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca73ffffffffffffffffffffffffffffffffffffffff16634000aea07f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795284866000604051602001612f22929190614791565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401612f4f939291906146fb565b602060405180830381600087803b158015612f6957600080fd5b505af1158015612f7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa19190613de9565b506000612fc484600030600a600089815260200190815260200160002054613892565b90506001600a600086815260200190815260200160002054612fe69190614d62565b600a60008681526020019081526020016000208190555061300784826138ce565b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166130308261123e565b73ffffffffffffffffffffffffffffffffffffffff1614613086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307d90614908565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ed90614988565b60405180910390fd5b613101838383612d95565b61310c6000826126ac565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461315c9190614e85565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546131b39190614d62565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613272838383612ea9565b505050565b601262278d00426132889190614d62565b9080600181540180825580915050600190039060005260206000200160009091909190915055601060008154809291906132c190615045565b91905055506000601360006101000a81548160ff021916908315150217905550808273ffffffffffffffffffffffffffffffffffffffff167f9c2270628a9b29d30ae96b6c4c14ed646ee134febdce38a5b77f2bde9cea2e2060405160405180910390a35050565b600061334a8473ffffffffffffffffffffffffffffffffffffffff16613901565b156134b3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133736126a4565b8786866040518563ffffffff1660e01b81526004016133959493929190614686565b602060405180830381600087803b1580156133af57600080fd5b505af19250505080156133e057506040513d601f19601f820116820180604052508101906133dd9190613e83565b60015b613463573d8060008114613410576040519150601f19603f3d011682016040523d82523d6000602084013e613415565b606091505b5060008151141561345b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613452906148e8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506134b8565b600190505b949350505050565b6000613522826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166139249092919063ffffffff16565b905060008151111561358257808060200190518101906135429190613de9565b613581576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357890614b88565b60405180910390fd5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016135e2846112f0565b6135ec9190614e85565b90506000600760008481526020019081526020016000205490508181146136d1576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506137569190614e85565b9050600060096000848152602001908152602001600020549050600060088381548110613786576137856151b9565b5b9060005260206000200154905080600883815481106137a8576137a76151b9565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806137f7576137f661518a565b5b6001900381819060005260206000200160009055905550505050565b600061381e836112f0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000848484846040516020016138ab94939291906147ba565b6040516020818303038152906040528051906020012060001c9050949350505050565b600082826040516020016138e39291906145e9565b60405160208183030381529060405280519060200120905092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060613933848460008561393c565b90509392505050565b606082471015613981576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613978906149c8565b60405180910390fd5b61398a85613901565b6139c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139c090614b08565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516139f29190614615565b60006040518083038185875af1925050503d8060008114613a2f576040519150601f19603f3d011682016040523d82523d6000602084013e613a34565b606091505b5091509150613a44828286613a50565b92505050949350505050565b60608315613a6057829050613ab0565b600083511115613a735782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aa79190614866565b60405180910390fd5b9392505050565b6000613aca613ac584614c71565b614c4c565b905082815260208101848484011115613ae657613ae561521c565b5b613af1848285614fa0565b509392505050565b600081359050613b08816158d5565b92915050565b600081519050613b1d816158d5565b92915050565b600081359050613b32816158ec565b92915050565b600081519050613b47816158ec565b92915050565b600081359050613b5c81615903565b92915050565b600081359050613b718161591a565b92915050565b600081519050613b868161591a565b92915050565b600082601f830112613ba157613ba0615217565b5b8135613bb1848260208601613ab7565b91505092915050565b600081359050613bc981615931565b92915050565b600081519050613bde81615931565b92915050565b600081359050613bf381615948565b92915050565b600060208284031215613c0f57613c0e615226565b5b6000613c1d84828501613af9565b91505092915050565b600060208284031215613c3c57613c3b615226565b5b6000613c4a84828501613b0e565b91505092915050565b60008060408385031215613c6a57613c69615226565b5b6000613c7885828601613af9565b9250506020613c8985828601613af9565b9150509250929050565b600080600060608486031215613cac57613cab615226565b5b6000613cba86828701613af9565b9350506020613ccb86828701613af9565b9250506040613cdc86828701613bba565b9150509250925092565b60008060008060808587031215613d0057613cff615226565b5b6000613d0e87828801613af9565b9450506020613d1f87828801613af9565b9350506040613d3087828801613bba565b925050606085013567ffffffffffffffff811115613d5157613d50615221565b5b613d5d87828801613b8c565b91505092959194509250565b60008060408385031215613d8057613d7f615226565b5b6000613d8e85828601613af9565b9250506020613d9f85828601613b23565b9150509250929050565b60008060408385031215613dc057613dbf615226565b5b6000613dce85828601613af9565b9250506020613ddf85828601613bba565b9150509250929050565b600060208284031215613dff57613dfe615226565b5b6000613e0d84828501613b38565b91505092915050565b60008060408385031215613e2d57613e2c615226565b5b6000613e3b85828601613b4d565b9250506020613e4c85828601613bba565b9150509250929050565b600060208284031215613e6c57613e6b615226565b5b6000613e7a84828501613b62565b91505092915050565b600060208284031215613e9957613e98615226565b5b6000613ea784828501613b77565b91505092915050565b600060208284031215613ec657613ec5615226565b5b6000613ed484828501613bba565b91505092915050565b600060208284031215613ef357613ef2615226565b5b6000613f0184828501613bcf565b91505092915050565b60008060408385031215613f2157613f20615226565b5b6000613f2f85828601613bba565b9250506020613f4085828601613bba565b9150509250929050565b600060208284031215613f6057613f5f615226565b5b6000613f6e84828501613be4565b91505092915050565b6000613f838383613fa7565b60208301905092915050565b6000613f9b83836145b4565b60208301905092915050565b613fb081614eb9565b82525050565b613fbf81614eb9565b82525050565b6000613fd082614cc2565b613fda8185614d08565b9350613fe583614ca2565b8060005b83811015614016578151613ffd8882613f77565b975061400883614cee565b925050600181019050613fe9565b5085935050505092915050565b600061402e82614ccd565b6140388185614d19565b935061404383614cb2565b8060005b8381101561407457815161405b8882613f8f565b975061406683614cfb565b925050600181019050614047565b5085935050505092915050565b61408a81614ecb565b82525050565b61409981614ed7565b82525050565b6140b06140ab82614ed7565b6150b8565b82525050565b60006140c182614cd8565b6140cb8185614d2a565b93506140db818560208601614faf565b6140e48161522b565b840191505092915050565b60006140fa82614cd8565b6141048185614d3b565b9350614114818560208601614faf565b80840191505092915050565b61412981614f58565b82525050565b61413881614f6a565b82525050565b600061414982614ce3565b6141538185614d46565b9350614163818560208601614faf565b61416c8161522b565b840191505092915050565b6000614184602a83614d46565b915061418f8261523c565b604082019050919050565b60006141a7601083614d46565b91506141b28261528b565b602082019050919050565b60006141ca602b83614d46565b91506141d5826152b4565b604082019050919050565b60006141ed603283614d46565b91506141f882615303565b604082019050919050565b6000614210602583614d46565b915061421b82615352565b604082019050919050565b6000614233601c83614d46565b915061423e826153a1565b602082019050919050565b6000614256600583614d57565b9150614261826153ca565b600582019050919050565b6000614279601083614d46565b9150614284826153f3565b602082019050919050565b600061429c601483614d46565b91506142a78261541c565b602082019050919050565b60006142bf602483614d46565b91506142ca82615445565b604082019050919050565b60006142e2601983614d46565b91506142ed82615494565b602082019050919050565b6000614305600883614d57565b9150614310826154bd565b600882019050919050565b6000614328602683614d46565b9150614333826154e6565b604082019050919050565b600061434b602983614d46565b915061435682615535565b604082019050919050565b600061436e601b83614d46565b915061437982615584565b602082019050919050565b6000614391601783614d46565b915061439c826155ad565b602082019050919050565b60006143b4603e83614d46565b91506143bf826155d6565b604082019050919050565b60006143d7602083614d46565b91506143e282615625565b602082019050919050565b60006143fa601f83614d46565b91506144058261564e565b602082019050919050565b600061441d601583614d46565b915061442882615677565b602082019050919050565b6000614440601883614d46565b915061444b826156a0565b602082019050919050565b6000614463602183614d46565b915061446e826156c9565b604082019050919050565b6000614486600083614d3b565b915061449182615718565b600082019050919050565b60006144a9601d83614d46565b91506144b48261571b565b602082019050919050565b60006144cc602c83614d46565b91506144d782615744565b604082019050919050565b60006144ef601a83614d46565b91506144fa82615793565b602082019050919050565b6000614512601a83614d46565b915061451d826157bc565b602082019050919050565b6000614535602a83614d46565b9150614540826157e5565b604082019050919050565b6000614558602e83614d46565b915061456382615834565b604082019050919050565b600061457b601f83614d46565b915061458682615883565b602082019050919050565b600061459e601683614d46565b91506145a9826158ac565b602082019050919050565b6145bd81614f2d565b82525050565b6145cc81614f2d565b82525050565b6145e36145de82614f2d565b6150c2565b82525050565b60006145f5828561409f565b60208201915061460582846145d2565b6020820191508190509392505050565b600061462182846140ef565b915081905092915050565b600061463782614249565b9150819050919050565b600061464c826142f8565b9150819050919050565b600061466182614479565b9150819050919050565b60006020820190506146806000830184613fb6565b92915050565b600060808201905061469b6000830187613fb6565b6146a86020830186613fb6565b6146b560408301856145c3565b81810360608301526146c781846140b6565b905095945050505050565b60006040820190506146e76000830185613fb6565b6146f460208301846145c3565b9392505050565b60006060820190506147106000830186613fb6565b61471d60208301856145c3565b818103604083015261472f81846140b6565b9050949350505050565b600060208201905081810360008301526147538184614023565b905092915050565b60006020820190506147706000830184614081565b92915050565b600060208201905061478b6000830184614090565b92915050565b60006040820190506147a66000830185614090565b6147b360208301846145c3565b9392505050565b60006080820190506147cf6000830187614090565b6147dc60208301866145c3565b6147e96040830185613fb6565b6147f660608301846145c3565b95945050505050565b60006020820190506148146000830184614120565b92915050565b600060808201905061482f600083018761412f565b81810360208301526148418186613fc5565b90506148506040830185613fb6565b61485d60608301846145c3565b95945050505050565b60006020820190508181036000830152614880818461413e565b905092915050565b600060208201905081810360008301526148a181614177565b9050919050565b600060208201905081810360008301526148c18161419a565b9050919050565b600060208201905081810360008301526148e1816141bd565b9050919050565b60006020820190508181036000830152614901816141e0565b9050919050565b6000602082019050818103600083015261492181614203565b9050919050565b6000602082019050818103600083015261494181614226565b9050919050565b600060208201905081810360008301526149618161426c565b9050919050565b600060208201905081810360008301526149818161428f565b9050919050565b600060208201905081810360008301526149a1816142b2565b9050919050565b600060208201905081810360008301526149c1816142d5565b9050919050565b600060208201905081810360008301526149e18161431b565b9050919050565b60006020820190508181036000830152614a018161433e565b9050919050565b60006020820190508181036000830152614a2181614361565b9050919050565b60006020820190508181036000830152614a4181614384565b9050919050565b60006020820190508181036000830152614a61816143a7565b9050919050565b60006020820190508181036000830152614a81816143ca565b9050919050565b60006020820190508181036000830152614aa1816143ed565b9050919050565b60006020820190508181036000830152614ac181614410565b9050919050565b60006020820190508181036000830152614ae181614433565b9050919050565b60006020820190508181036000830152614b0181614456565b9050919050565b60006020820190508181036000830152614b218161449c565b9050919050565b60006020820190508181036000830152614b41816144bf565b9050919050565b60006020820190508181036000830152614b61816144e2565b9050919050565b60006020820190508181036000830152614b8181614505565b9050919050565b60006020820190508181036000830152614ba181614528565b9050919050565b60006020820190508181036000830152614bc18161454b565b9050919050565b60006020820190508181036000830152614be18161456e565b9050919050565b60006020820190508181036000830152614c0181614591565b9050919050565b6000602082019050614c1d60008301846145c3565b92915050565b6000604082019050614c3860008301856145c3565b614c456020830184614081565b9392505050565b6000614c56614c67565b9050614c628282615014565b919050565b6000604051905090565b600067ffffffffffffffff821115614c8c57614c8b6151e8565b5b614c958261522b565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614d6d82614f2d565b9150614d7883614f2d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614dad57614dac6150fd565b5b828201905092915050565b6000614dc382614f2d565b9150614dce83614f2d565b925082614dde57614ddd61512c565b5b828204905092915050565b6000614df482614f2d565b9150614dff83614f2d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614e3857614e376150fd565b5b828202905092915050565b6000614e4e82614f37565b9150614e5983614f37565b92508167ffffffffffffffff0483118215151615614e7a57614e796150fd565b5b828202905092915050565b6000614e9082614f2d565b9150614e9b83614f2d565b925082821015614eae57614ead6150fd565b5b828203905092915050565b6000614ec482614f0d565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b6000614f6382614f7c565b9050919050565b6000614f7582614f2d565b9050919050565b6000614f8782614f8e565b9050919050565b6000614f9982614f0d565b9050919050565b82818337600083830152505050565b60005b83811015614fcd578082015181840152602081019050614fb2565b83811115614fdc576000848401525b50505050565b60006002820490506001821680614ffa57607f821691505b6020821081141561500e5761500d61515b565b5b50919050565b61501d8261522b565b810181811067ffffffffffffffff8211171561503c5761503b6151e8565b5b80604052505050565b600061505082614f2d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615083576150826150fd565b5b600182019050919050565b600061509982614f4b565b915060ff8214156150ad576150ac6150fd565b5b600182019050919050565b6000819050919050565b6000819050919050565b60006150d782614f2d565b91506150e283614f2d565b9250826150f2576150f161512c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f596f752063616e20627579206265747765656e20312d3130204c656d6f6e732060008201527f617420612074696d652e00000000000000000000000000000000000000000000602082015250565b7f4e6f7468696e6720746f20636c61696d00000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5649445941000000000000000000000000000000000000000000000000000000600082015250565b7f4c656d6f6e206973204c6f636b65642100000000000000000000000000000000600082015250565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f457468657265756d000000000000000000000000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4c656d6f6e7320676f20666f7220302e312045544820656163682e0000000000600082015250565b7f4c656d6f6e3a205374696c6c20707265706172696e672e000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00600082015250565b7f4c656d6f6e73206861766520736f6c64206f75742e0000000000000000000000600082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f52657175657374204964206973206e6f7420636f72726563742e000000000000600082015250565b7f4177616974696e672072616e646f6d2073656c656374696f6e2e000000000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f446f6573206e6f74206f776e20746865204c656d6f6e00000000000000000000600082015250565b6158de81614eb9565b81146158e957600080fd5b50565b6158f581614ecb565b811461590057600080fd5b50565b61590c81614ed7565b811461591757600080fd5b50565b61592381614ee1565b811461592e57600080fd5b50565b61593a81614f2d565b811461594557600080fd5b50565b61595181614f4b565b811461595c57600080fd5b5056fe68747470733a2f2f77332e6c6f6c2f696d672f726f7474656e6c656d6f6e2e6a736f6ea26469706673582212209edc93af51fb51a8b4b0217c8a4a8b0a496bf62d09f024556bcc28f1416b81da64736f6c63430008070033

Deployed Bytecode Sourcemap

99234:8023:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;93000:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101694:1232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79734:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81247:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;80764:417;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66420:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93640:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81947:336;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93308:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82354:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99741:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93830:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;105935:405;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;99658:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79445:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;79176:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99489:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;103736:148;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99775:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;104762:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66480:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99827:25;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28372:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;79903:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102934:338;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81490:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99598:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99859:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82610:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;105446:480;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99544:47;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106348:906;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;81716:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99691:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66524:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93000:224;93102:4;93141:35;93126:50;;;:11;:50;;;;:90;;;;93180:36;93204:11;93180:23;:36::i;:::-;93126:90;93119:97;;93000:224;;;:::o;101694:1232::-;101778:16;11218:1;11816:7;;:19;;11808:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11218:1;11949:7;:18;;;;101405:7:::1;;;;;;;;;;;101404:8;101396:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;101827:1:::2;101815:9;:13;;;:31;;;;;101844:2;101832:9;:14;;;101815:31;101807:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;102037:9;102025;:21;;;;;;:::i;:::-;102012:34;;:9;:34;102004:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;99725:9;102097:10;:23;102108:11;;102097:23;;;;;;;;;;;102121:1;102097:26;;;;;;;:::i;:::-;;;;:36;102089:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;102170:10;102196:2;102184:9;:14;;;;:::i;:::-;102170:28;;102248:2;102240:5;:10;;;;:::i;:::-;102209;:23;102220:11;;102209:23;;;;;;;;;;;102233:1;102209:26;;;;;;;:::i;:::-;;;;:42;;;;;;;:::i;:::-;;;;;;;;102316:11;;102287:16;:26;102304:8;;102287:26;;;;;;;;;;;:40;;;;102338:14;102355:20;102373:1;102365:5;:9;;;;:::i;:::-;102355;:20::i;:::-;102338:37;;102484:6;102454:10;:23;102465:11;;102454:23;;;;;;;;;;;102478:1;102454:26;;;;;;;:::i;:::-;;;;:36;;;;;;;:::i;:::-;;;;;;;;102517:5;102501:12;;:21;;;;;;;:::i;:::-;;;;;;;;102556:20;102593:9;102579:24;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102556:47;;102618:7;102614:246;102635:9;102631:13;;:1;:13;;;102614:246;;;102666:27;102672:10;102684:8;;102666:5;:27::i;:::-;102708:10;:23;102719:11;;102708:23;;;;;;;;;;;102732:1;102708:26;;;;;;;:::i;:::-;;;;:28;;;;;;;;;:::i;:::-;;;;;;102780:11;;102751:16;:26;102768:8;;102751:26;;;;;;;;;;;:40;;;;102815:8;;102806:3;102810:1;102806:6;;;;;;;;;;:::i;:::-;;;;;;;:17;;;::::0;::::2;102838:8;;:10;;;;;;;;;:::i;:::-;;;;;;102646:3;;;;;:::i;:::-;;;;102614:246;;;;102873:9;:7;:9::i;:::-;102870:28;;;102885:11;:9;:11::i;:::-;;102870:28;102915:3;102908:10;;;;;11174:1:::0;12128:7;:22;;;;101694:1232;;;:::o;79734:100::-;79788:13;79821:5;79814:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79734:100;:::o;81247:171::-;81323:7;81343:23;81358:7;81343:14;:23::i;:::-;81386:15;:24;81402:7;81386:24;;;;;;;;;;;;;;;;;;;;;81379:31;;81247:171;;;:::o;80764:417::-;80845:13;80861:23;80876:7;80861:14;:23::i;:::-;80845:39;;80909:5;80903:11;;:2;:11;;;;80895:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;81003:5;80987:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;81012:37;81029:5;81036:12;:10;:12::i;:::-;81012:16;:37::i;:::-;80987:62;80965:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;81152:21;81161:2;81165:7;81152:8;:21::i;:::-;80834:347;80764:417;;:::o;66420:51::-;;;:::o;93640:113::-;93701:7;93728:10;:17;;;;93721:24;;93640:113;:::o;81947:336::-;82142:41;82161:12;:10;:12::i;:::-;82175:7;82142:18;:41::i;:::-;82134:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;82247:28;82257:4;82263:2;82267:7;82247:9;:28::i;:::-;81947:336;;;:::o;93308:256::-;93405:7;93441:23;93458:5;93441:16;:23::i;:::-;93433:5;:31;93425:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;93530:12;:19;93543:5;93530:19;;;;;;;;;;;;;;;:26;93550:5;93530:26;;;;;;;;;;;;93523:33;;93308:256;;;;:::o;82354:185::-;82492:39;82509:4;82515:2;82519:7;82492:39;;;;;;;;;;;;:16;:39::i;:::-;82354:185;;;:::o;99741:27::-;;;;:::o;93830:233::-;93905:7;93941:30;:28;:30::i;:::-;93933:5;:38;93925:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;94038:10;94049:5;94038:17;;;;;;;;:::i;:::-;;;;;;;;;;94031:24;;93830:233;;;:::o;105935:405::-;105995:7;106004:4;106021:13;106037:16;:25;106054:7;106037:25;;;;;;;;;;;;106021:41;;106073:10;106109:7;106086:12;:19;106099:5;106086:19;;;;;;;;;;;;:30;106073:43;;106131:16;106139:7;106131;:16::i;:::-;106130:17;:40;;;;106159:11;;106150:5;:20;106130:40;106127:64;;;106180:1;106183:5;106172:17;;;;;;;;106127:64;106204:5;106201:132;;;106219:10;:17;106230:5;106219:17;;;;;;;;;;;106237:1;106219:20;;;;;;;:::i;:::-;;;;106241:5;106211:36;;;;;;;;106201:132;106320:1;106297:10;:17;106308:5;106297:17;;;;;;;;;;;106315:1;106297:20;;;;;;;:::i;:::-;;;;:24;;;;:::i;:::-;106273:10;:17;106284:5;106273:17;;;;;;;;;;;106291:1;106273:20;;;;;;;:::i;:::-;;;;:49;;;;:::i;:::-;106325:5;106264:67;;;;;;105935:405;;;;:::o;99658:26::-;;;;:::o;79445:222::-;79517:7;79537:13;79553:7;:16;79561:7;79553:16;;;;;;;;;;;;;;;;;;;;;79537:32;;79605:1;79588:19;;:5;:19;;;;79580:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;79654:5;79647:12;;;79445:222;;;:::o;79176:207::-;79248:7;79293:1;79276:19;;:5;:19;;;;79268:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;79359:9;:16;79369:5;79359:16;;;;;;;;;;;;;;;;79352:23;;79176:207;;;:::o;99489:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;103736:148::-;103796:7;101405;;;;;;;;;;;101404:8;101396:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;11218:1:::1;11816:7;;:19;;11808:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11218:1;11949:7;:18;;;;103819:9:::2;:7;:9::i;:::-;103816:61;;;103838:11;:9;:11::i;:::-;103831:18;;;;103816:61;103867:8;::::0;::::2;11980:1;11174::::1;12128:7;:22;;;;103736:148:::0;:::o;99775:39::-;99807:7;99775:39;:::o;104762:269::-;104818:4;104835:11;104878;;104849:16;:25;104866:7;104849:25;;;;;;;;;;;;:40;:112;;;;104946:15;99807:7;104932:1;:9;;;;:::i;:::-;104893:8;104902:16;:25;104919:7;104902:25;;;;;;;;;;;;104893:35;;;;;;;;:::i;:::-;;;;;;;;;;:49;;;;:::i;:::-;:68;;104849:112;104835:126;;104981:6;:18;;;;;104992:7;;;;;;;;;;;104991:8;104981:18;104972:27;;105017:6;105010:13;;;104762:269;;;:::o;66480:37::-;;;:::o;99827:25::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28372:210::-;28479:14;28465:28;;:10;:28;;;28457:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;28536:40;28554:9;28565:10;28536:17;:40::i;:::-;28372:210;;:::o;79903:104::-;79959:13;79992:7;79985:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79903:104;:::o;102934:338::-;102974:4;99725:9;103104:10;:23;103115:11;;103104:23;;;;;;;;;;;103128:1;103104:26;;;;;;;:::i;:::-;;;;:37;;:81;;;;103170:15;103145:8;103154:11;;103145:21;;;;;;;;:::i;:::-;;;;;;;;;;:40;;103104:81;103103:119;;;;;103220:2;103190:10;:23;103201:11;;103190:23;;;;;;;;;;;103214:1;103190:26;;;;;;;:::i;:::-;;;;:32;;103103:119;103102:161;;;;;103260:3;;103227:4;:14;;;103250:4;103227:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;103102:161;103094:170;;102934:338;:::o;81490:155::-;81585:52;81604:12;:10;:12::i;:::-;81618:8;81628;81585:18;:52::i;:::-;81490:155;;:::o;99598:51::-;;;;;;;;;;;;;;;;;:::o;99859:19::-;;;;;;;;;;;;;:::o;82610:323::-;82784:41;82803:12;:10;:12::i;:::-;82817:7;82784:18;:41::i;:::-;82776:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;82887:38;82901:4;82907:2;82911:7;82920:4;82887:13;:38::i;:::-;82610:323;;;;:::o;105446:480::-;105511:13;105541:16;105549:7;105541;:16::i;:::-;105537:74;;105573:26;;;;;;;;;;;;;;;;;;;;;105537:74;105621:13;105637:16;:25;105654:7;105637:25;;;;;;;;;;;;105621:41;;105685:11;;105676:5;:20;105673:246;;;105698:38;;;;;;;;;;;;;;;;;;;;;;105673:246;105791:7;105770:12;:19;105783:5;105770:19;;;;;;;;;;;;:28;105767:141;;;105800:41;;;;;;;;;;;;;;;;;;;;;;105767:141;105862:44;;;;;;;;;;;;;;;;;;;;105446:480;;;;:::o;99544:47::-;;;;;;;;;;;;;;;;;:::o;106348:906::-;106415:7;11218:1;11816:7;;:19;;11808:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11218:1;11949:7;:18;;;;106435:12:::1;106450:16;106458:7;106450;:16::i;:::-;106435:31;;106477:13;106493:16;:25;106510:7;106493:25;;;;;;;;;;;;106477:41;;106545:10;106537:18;;:4;:18;;;:38;;;;;106559:16;106567:7;106559;:16::i;:::-;106537:38;106529:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;106630:11;;106621:5;:20;;106613:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;106681:14;106697:10:::0;106711:21:::1;106724:7;106711:12;:21::i;:::-;106680:52;;;;106760:1;106751:6;:10;106743:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;106793:14;106799:7;106793:5;:14::i;:::-;106821:5;106818:405;;;106854:21;106845:6;:30;106842:68;;;106887:21;106878:30;;106842:68;106925:9;106940:4;:9;;106957:6;106940:28;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;106924:44;;;106991:4;106983:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;107040:38;;;;;:::i;:::-;;;;;;;;107053:4;107040:38;;;107059:6;107040:38;;;;;;:::i;:::-;;;;;;;;106827:263;106818:405;;;107109:47;107143:4;107149:6;107116:12;107109:33;;;;:47;;;;;:::i;:::-;107176:35;;;;;:::i;:::-;;;;;;;;107189:4;107176:35;;;107195:6;107176:35;;;;;;:::i;:::-;;;;;;;;106818:405;107240:6;107233:13;;;;;;11174:1:::0;12128:7;:22;;;;106348:906;;;:::o;81716:164::-;81813:4;81837:18;:25;81856:5;81837:25;;;;;;;;;;;;;;;:35;81863:8;81837:35;;;;;;;;;;;;;;;;;;;;;;;;;81830:42;;81716:164;;;;:::o;99691:43::-;99725:9;99691:43;:::o;66524:30::-;;;:::o;78807:305::-;78909:4;78961:25;78946:40;;;:11;:40;;;;:105;;;;79018:33;79003:48;;;:11;:48;;;;78946:105;:158;;;;79068:36;79092:11;79068:23;:36::i;:::-;78946:158;78926:178;;78807:305;;;:::o;66979:610::-;67030:7;67051:21;67089:1;67075:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67051:40;;67112:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67102:4;67107:1;67102:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;67155:12;67145:4;67150:1;67145:7;;;;;;;;:::i;:::-;;;;;;;:22;;;;;;;;;;;67178:19;67207:12;67200:30;;;67239:4;67200:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67178:67;;67256:15;:66;;;67329:6;67337:1;67340:4;67354;67361:15;67256:121;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67388:20;67473:1;67460:11;67419:12;67412:30;;;67451:4;67412:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;:::-;67411:63;;;;:::i;:::-;67388:86;;67495:54;67529:5;67536:12;67502;67495:33;;;;:54;;;;;:::i;:::-;67580:1;67567:12;:14;;;;:::i;:::-;67560:21;;;;;66979:610;;;:::o;86332:439::-;86426:1;86412:16;;:2;:16;;;;86404:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;86485:16;86493:7;86485;:16::i;:::-;86484:17;86476:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;86547:45;86576:1;86580:2;86584:7;86547:20;:45::i;:::-;86622:1;86605:9;:13;86615:2;86605:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;86653:2;86634:7;:16;86642:7;86634:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;86698:7;86694:2;86673:33;;86690:1;86673:33;;;;;;;;;;;;86719:44;86747:1;86751:2;86755:7;86719:19;:44::i;:::-;86332:439;;:::o;103280:448::-;103319:7;103358:31;103376:7;;103385:3;;103358:17;:31::i;:::-;103339:16;:50;;;;103411:4;103401:7;;:14;;;;;;;;;;;;;;;;;;103468:1;103457:8;;:12;;;;:::i;:::-;103426:10;:25;103449:1;103437:11;;:13;;;;:::i;:::-;103426:25;;;;;;;;;;;103452:1;103426:28;;;;;;;:::i;:::-;;;:43;;;;103511:12;;103480:10;:25;103503:1;103491:11;;:13;;;;:::i;:::-;103480:25;;;;;;;;;;;103506:1;103480:28;;;;;;;:::i;:::-;;;:43;;;;103549:1;103534:12;:16;;;;103602:11;;103561:20;:38;103582:16;;103561:38;;;;;;;;;;;:52;;;;103641:16;;103629:57;103659:10;:23;103670:11;;103659:23;;;;;;;;;;;103683:1;103659:26;;;;;;;:::i;:::-;;;;103629:57;;;;;;:::i;:::-;;;;;;;;103704:16;;103697:23;;103280:448;:::o;89222:135::-;89304:16;89312:7;89304;:16::i;:::-;89296:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;89222:135;:::o;31765:98::-;31818:7;31845:10;31838:17;;31765:98;:::o;88501:174::-;88603:2;88576:15;:24;88592:7;88576:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;88659:7;88655:2;88621:46;;88630:23;88645:7;88630:14;:23::i;:::-;88621:46;;;;;;;;;;;;88501:174;;:::o;84734:264::-;84827:4;84844:13;84860:23;84875:7;84860:14;:23::i;:::-;84844:39;;84913:5;84902:16;;:7;:16;;;:52;;;;84922:32;84939:5;84946:7;84922:16;:32::i;:::-;84902:52;:87;;;;84982:7;84958:31;;:20;84970:7;84958:11;:20::i;:::-;:31;;;84902:87;84894:96;;;84734:264;;;;:::o;105039:198::-;105146:17;105155:7;105146:8;:17::i;:::-;105138:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;105195:34;105211:4;105217:2;105221:7;105195:15;:34::i;:::-;105039:198;;;:::o;84440:127::-;84505:4;84557:1;84529:30;;:7;:16;84537:7;84529:16;;;;;;;;;;;;;;;;;;;;;:30;;;;84522:37;;84440:127;;;:::o;104118:412::-;104259:11;;104223:20;:32;104244:10;104223:32;;;;;;;;;;;;:47;104215:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;104312:21;104385:10;:23;104396:11;;104385:23;;;;;;;;;;;104409:1;104385:26;;;;;;;:::i;:::-;;;;104371:11;:40;;;;:::i;:::-;104340:10;:23;104351:11;;104340:23;;;;;;;;;;;104364:1;104340:26;;;;;;;:::i;:::-;;;;104336:1;:30;;;;:::i;:::-;:76;;;;:::i;:::-;104312:100;;104451:13;104423:12;:25;104436:11;;104423:25;;;;;;;;;;;:41;;;;104475:47;104484:22;104492:13;104484:7;:22::i;:::-;104508:13;104475:8;:47::i;:::-;104204:326;104118:412;;:::o;88818:315::-;88973:8;88964:17;;:5;:17;;;;88956:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;89060:8;89022:18;:25;89041:5;89022:25;;;;;;;;;;;;;;;:35;89048:8;89022:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;89106:8;89084:41;;89099:5;89084:41;;;89116:8;89084:41;;;;;;:::i;:::-;;;;;;;;88818:315;;;:::o;83814:313::-;83970:28;83980:4;83986:2;83990:7;83970:9;:28::i;:::-;84017:47;84040:4;84046:2;84050:7;84059:4;84017:22;:47::i;:::-;84009:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;83814:313;;;;:::o;87000:420::-;87060:13;87076:23;87091:7;87076:14;:23::i;:::-;87060:39;;87112:48;87133:5;87148:1;87152:7;87112:20;:48::i;:::-;87201:29;87218:1;87222:7;87201:8;:29::i;:::-;87263:1;87243:9;:16;87253:5;87243:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;87282:7;:16;87290:7;87282:16;;;;;;;;;;;;87275:23;;;;;;;;;;;87344:7;87340:1;87316:36;;87325:5;87316:36;;;;;;;;;;;;87365:47;87385:5;87400:1;87404:7;87365:19;:47::i;:::-;87049:371;87000:420;:::o;56878:211::-;56995:86;57015:5;57045:23;;;57070:2;57074:5;57022:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56995:19;:86::i;:::-;56878:211;;;:::o;70469:157::-;70554:4;70593:25;70578:40;;;:11;:40;;;;70571:47;;70469:157;;;:::o;94676:589::-;94820:45;94847:4;94853:2;94857:7;94820:26;:45::i;:::-;94898:1;94882:18;;:4;:18;;;94878:187;;;94917:40;94949:7;94917:31;:40::i;:::-;94878:187;;;94987:2;94979:10;;:4;:10;;;94975:90;;95006:47;95039:4;95045:7;95006:32;:47::i;:::-;94975:90;94878:187;95093:1;95079:16;;:2;:16;;;95075:183;;;95112:45;95149:7;95112:36;:45::i;:::-;95075:183;;;95185:4;95179:10;;:2;:10;;;95175:83;;95206:40;95234:2;95238:7;95206:27;:40::i;:::-;95175:83;95075:183;94676:589;;;:::o;91857:125::-;;;;:::o;26489:1034::-;26566:17;26592:4;:20;;;26613:14;26629:4;26646:8;25319:1;26635:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26592:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26914:15;26932:82;26949:8;25319:1;26990:4;26997:6;:16;27004:8;26997:16;;;;;;;;;;;;26932;:82::i;:::-;26914:100;;27470:1;27451:6;:16;27458:8;27451:16;;;;;;;;;;;;:20;;;;:::i;:::-;27432:6;:16;27439:8;27432:16;;;;;;;;;;;:39;;;;27485:32;27499:8;27509:7;27485:13;:32::i;:::-;27478:39;;;26489:1034;;;;:::o;87757:625::-;87916:4;87889:31;;:23;87904:7;87889:14;:23::i;:::-;:31;;;87881:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;87995:1;87981:16;;:2;:16;;;;87973:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;88051:39;88072:4;88078:2;88082:7;88051:20;:39::i;:::-;88155:29;88172:1;88176:7;88155:8;:29::i;:::-;88216:1;88197:9;:15;88207:4;88197:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;88245:1;88228:9;:13;88238:2;88228:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;88276:2;88257:7;:16;88265:7;88257:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;88315:7;88311:2;88296:27;;88305:4;88296:27;;;;;;;;;;;;88336:38;88356:4;88362:2;88366:7;88336:19;:38::i;:::-;87757:625;;;:::o;104538:216::-;104614:8;99807:7;104628:15;:23;;;;:::i;:::-;104614:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104663:11;;:13;;;;;;;;;:::i;:::-;;;;;;104697:5;104687:7;;:15;;;;;;;;;;;;;;;;;;104733:12;104725:6;104718:28;;;;;;;;;;;;104538:216;;:::o;89921:853::-;90075:4;90096:15;:2;:13;;;:15::i;:::-;90092:675;;;90148:2;90132:36;;;90169:12;:10;:12::i;:::-;90183:4;90189:7;90198:4;90132:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;90128:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90390:1;90373:6;:13;:18;90369:328;;;90416:60;;;;;;;;;;:::i;:::-;;;;;;;;90369:328;90647:6;90641:13;90632:6;90628:2;90624:15;90617:38;90128:584;90264:41;;;90254:51;;;:6;:51;;;;90247:58;;;;;90092:675;90751:4;90744:11;;89921:853;;;;;;;:::o;59945:716::-;60369:23;60395:69;60423:4;60395:69;;;;;;;;;;;;;;;;;60403:5;60395:27;;;;:69;;;;;:::i;:::-;60369:95;;60499:1;60479:10;:17;:21;60475:179;;;60576:10;60565:30;;;;;;;;;;;;:::i;:::-;60557:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;60475:179;60015:646;59945:716;;:::o;91346:126::-;;;;:::o;95988:164::-;96092:10;:17;;;;96065:15;:24;96081:7;96065:24;;;;;;;;;;;:44;;;;96120:10;96136:7;96120:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95988:164;:::o;96779:988::-;97045:22;97095:1;97070:22;97087:4;97070:16;:22::i;:::-;:26;;;;:::i;:::-;97045:51;;97107:18;97128:17;:26;97146:7;97128:26;;;;;;;;;;;;97107:47;;97275:14;97261:10;:28;97257:328;;97306:19;97328:12;:18;97341:4;97328:18;;;;;;;;;;;;;;;:34;97347:14;97328:34;;;;;;;;;;;;97306:56;;97412:11;97379:12;:18;97392:4;97379:18;;;;;;;;;;;;;;;:30;97398:10;97379:30;;;;;;;;;;;:44;;;;97529:10;97496:17;:30;97514:11;97496:30;;;;;;;;;;;:43;;;;97291:294;97257:328;97681:17;:26;97699:7;97681:26;;;;;;;;;;;97674:33;;;97725:12;:18;97738:4;97725:18;;;;;;;;;;;;;;;:34;97744:14;97725:34;;;;;;;;;;;97718:41;;;96860:907;;96779:988;;:::o;98062:1079::-;98315:22;98360:1;98340:10;:17;;;;:21;;;;:::i;:::-;98315:46;;98372:18;98393:15;:24;98409:7;98393:24;;;;;;;;;;;;98372:45;;98744:19;98766:10;98777:14;98766:26;;;;;;;;:::i;:::-;;;;;;;;;;98744:48;;98830:11;98805:10;98816;98805:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;98941:10;98910:15;:28;98926:11;98910:28;;;;;;;;;;;:41;;;;99082:15;:24;99098:7;99082:24;;;;;;;;;;;99075:31;;;99117:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;98133:1008;;;98062:1079;:::o;95566:221::-;95651:14;95668:20;95685:2;95668:16;:20::i;:::-;95651:37;;95726:7;95699:12;:16;95712:2;95699:16;;;;;;;;;;;;;;;:24;95716:6;95699:24;;;;;;;;;;;:34;;;;95773:6;95744:17;:26;95762:7;95744:26;;;;;;;;;;;:35;;;;95640:147;95566:221;;:::o;16625:247::-;16772:7;16824:8;16834:9;16845:10;16857:6;16813:51;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;16803:62;;;;;;16795:71;;16788:78;;16625:247;;;;;;:::o;17263:168::-;17350:7;17400:8;17410:13;17383:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;17373:52;;;;;;17366:59;;17263:168;;;;:::o;48844:326::-;48904:4;49161:1;49139:7;:19;;;:23;49132:30;;48844:326;;;:::o;51589:229::-;51726:12;51758:52;51780:6;51788:4;51794:1;51797:12;51758:21;:52::i;:::-;51751:59;;51589:229;;;;;:::o;52709:510::-;52879:12;52937:5;52912:21;:30;;52904:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;53004:18;53015:6;53004:10;:18::i;:::-;52996:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;53070:12;53084:23;53111:6;:11;;53130:5;53137:4;53111:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53069:73;;;;53160:51;53177:7;53186:10;53198:12;53160:16;:51::i;:::-;53153:58;;;;52709:510;;;;;;:::o;55395:762::-;55545:12;55574:7;55570:580;;;55605:10;55598:17;;;;55570:580;55739:1;55719:10;:17;:21;55715:424;;;55967:10;55961:17;56028:15;56015:10;56011:2;56007:19;56000:44;55715:424;56110:12;56103:20;;;;;;;;;;;:::i;:::-;;;;;;;;55395:762;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:143::-;625:5;656:6;650:13;641:22;;672:33;699:5;672:33;:::i;:::-;568:143;;;;:::o;717:133::-;760:5;798:6;785:20;776:29;;814:30;838:5;814:30;:::i;:::-;717:133;;;;:::o;856:137::-;910:5;941:6;935:13;926:22;;957:30;981:5;957:30;:::i;:::-;856:137;;;;:::o;999:139::-;1045:5;1083:6;1070:20;1061:29;;1099:33;1126:5;1099:33;:::i;:::-;999:139;;;;:::o;1144:137::-;1189:5;1227:6;1214:20;1205:29;;1243:32;1269:5;1243:32;:::i;:::-;1144:137;;;;:::o;1287:141::-;1343:5;1374:6;1368:13;1359:22;;1390:32;1416:5;1390:32;:::i;:::-;1287:141;;;;:::o;1447:338::-;1502:5;1551:3;1544:4;1536:6;1532:17;1528:27;1518:122;;1559:79;;:::i;:::-;1518:122;1676:6;1663:20;1701:78;1775:3;1767:6;1760:4;1752:6;1748:17;1701:78;:::i;:::-;1692:87;;1508:277;1447:338;;;;:::o;1791:139::-;1837:5;1875:6;1862:20;1853:29;;1891:33;1918:5;1891:33;:::i;:::-;1791:139;;;;:::o;1936:143::-;1993:5;2024:6;2018:13;2009:22;;2040:33;2067:5;2040:33;:::i;:::-;1936:143;;;;:::o;2085:135::-;2129:5;2167:6;2154:20;2145:29;;2183:31;2208:5;2183:31;:::i;:::-;2085:135;;;;:::o;2226:329::-;2285:6;2334:2;2322:9;2313:7;2309:23;2305:32;2302:119;;;2340:79;;:::i;:::-;2302:119;2460:1;2485:53;2530:7;2521:6;2510:9;2506:22;2485:53;:::i;:::-;2475:63;;2431:117;2226:329;;;;:::o;2561:351::-;2631:6;2680:2;2668:9;2659:7;2655:23;2651:32;2648:119;;;2686:79;;:::i;:::-;2648:119;2806:1;2831:64;2887:7;2878:6;2867:9;2863:22;2831:64;:::i;:::-;2821:74;;2777:128;2561:351;;;;:::o;2918:474::-;2986:6;2994;3043:2;3031:9;3022:7;3018:23;3014:32;3011:119;;;3049:79;;:::i;:::-;3011:119;3169:1;3194:53;3239:7;3230:6;3219:9;3215:22;3194:53;:::i;:::-;3184:63;;3140:117;3296:2;3322:53;3367:7;3358:6;3347:9;3343:22;3322:53;:::i;:::-;3312:63;;3267:118;2918:474;;;;;:::o;3398:619::-;3475:6;3483;3491;3540:2;3528:9;3519:7;3515:23;3511:32;3508:119;;;3546:79;;:::i;:::-;3508:119;3666:1;3691:53;3736:7;3727:6;3716:9;3712:22;3691:53;:::i;:::-;3681:63;;3637:117;3793:2;3819:53;3864:7;3855:6;3844:9;3840:22;3819:53;:::i;:::-;3809:63;;3764:118;3921:2;3947:53;3992:7;3983:6;3972:9;3968:22;3947:53;:::i;:::-;3937:63;;3892:118;3398:619;;;;;:::o;4023:943::-;4118:6;4126;4134;4142;4191:3;4179:9;4170:7;4166:23;4162:33;4159:120;;;4198:79;;:::i;:::-;4159:120;4318:1;4343:53;4388:7;4379:6;4368:9;4364:22;4343:53;:::i;:::-;4333:63;;4289:117;4445:2;4471:53;4516:7;4507:6;4496:9;4492:22;4471:53;:::i;:::-;4461:63;;4416:118;4573:2;4599:53;4644:7;4635:6;4624:9;4620:22;4599:53;:::i;:::-;4589:63;;4544:118;4729:2;4718:9;4714:18;4701:32;4760:18;4752:6;4749:30;4746:117;;;4782:79;;:::i;:::-;4746:117;4887:62;4941:7;4932:6;4921:9;4917:22;4887:62;:::i;:::-;4877:72;;4672:287;4023:943;;;;;;;:::o;4972:468::-;5037:6;5045;5094:2;5082:9;5073:7;5069:23;5065:32;5062:119;;;5100:79;;:::i;:::-;5062:119;5220:1;5245:53;5290:7;5281:6;5270:9;5266:22;5245:53;:::i;:::-;5235:63;;5191:117;5347:2;5373:50;5415:7;5406:6;5395:9;5391:22;5373:50;:::i;:::-;5363:60;;5318:115;4972:468;;;;;:::o;5446:474::-;5514:6;5522;5571:2;5559:9;5550:7;5546:23;5542:32;5539:119;;;5577:79;;:::i;:::-;5539:119;5697:1;5722:53;5767:7;5758:6;5747:9;5743:22;5722:53;:::i;:::-;5712:63;;5668:117;5824:2;5850:53;5895:7;5886:6;5875:9;5871:22;5850:53;:::i;:::-;5840:63;;5795:118;5446:474;;;;;:::o;5926:345::-;5993:6;6042:2;6030:9;6021:7;6017:23;6013:32;6010:119;;;6048:79;;:::i;:::-;6010:119;6168:1;6193:61;6246:7;6237:6;6226:9;6222:22;6193:61;:::i;:::-;6183:71;;6139:125;5926:345;;;;:::o;6277:474::-;6345:6;6353;6402:2;6390:9;6381:7;6377:23;6373:32;6370:119;;;6408:79;;:::i;:::-;6370:119;6528:1;6553:53;6598:7;6589:6;6578:9;6574:22;6553:53;:::i;:::-;6543:63;;6499:117;6655:2;6681:53;6726:7;6717:6;6706:9;6702:22;6681:53;:::i;:::-;6671:63;;6626:118;6277:474;;;;;:::o;6757:327::-;6815:6;6864:2;6852:9;6843:7;6839:23;6835:32;6832:119;;;6870:79;;:::i;:::-;6832:119;6990:1;7015:52;7059:7;7050:6;7039:9;7035:22;7015:52;:::i;:::-;7005:62;;6961:116;6757:327;;;;:::o;7090:349::-;7159:6;7208:2;7196:9;7187:7;7183:23;7179:32;7176:119;;;7214:79;;:::i;:::-;7176:119;7334:1;7359:63;7414:7;7405:6;7394:9;7390:22;7359:63;:::i;:::-;7349:73;;7305:127;7090:349;;;;:::o;7445:329::-;7504:6;7553:2;7541:9;7532:7;7528:23;7524:32;7521:119;;;7559:79;;:::i;:::-;7521:119;7679:1;7704:53;7749:7;7740:6;7729:9;7725:22;7704:53;:::i;:::-;7694:63;;7650:117;7445:329;;;;:::o;7780:351::-;7850:6;7899:2;7887:9;7878:7;7874:23;7870:32;7867:119;;;7905:79;;:::i;:::-;7867:119;8025:1;8050:64;8106:7;8097:6;8086:9;8082:22;8050:64;:::i;:::-;8040:74;;7996:128;7780:351;;;;:::o;8137:474::-;8205:6;8213;8262:2;8250:9;8241:7;8237:23;8233:32;8230:119;;;8268:79;;:::i;:::-;8230:119;8388:1;8413:53;8458:7;8449:6;8438:9;8434:22;8413:53;:::i;:::-;8403:63;;8359:117;8515:2;8541:53;8586:7;8577:6;8566:9;8562:22;8541:53;:::i;:::-;8531:63;;8486:118;8137:474;;;;;:::o;8617:325::-;8674:6;8723:2;8711:9;8702:7;8698:23;8694:32;8691:119;;;8729:79;;:::i;:::-;8691:119;8849:1;8874:51;8917:7;8908:6;8897:9;8893:22;8874:51;:::i;:::-;8864:61;;8820:115;8617:325;;;;:::o;8948:179::-;9017:10;9038:46;9080:3;9072:6;9038:46;:::i;:::-;9116:4;9111:3;9107:14;9093:28;;8948:179;;;;:::o;9133:::-;9202:10;9223:46;9265:3;9257:6;9223:46;:::i;:::-;9301:4;9296:3;9292:14;9278:28;;9133:179;;;;:::o;9318:108::-;9395:24;9413:5;9395:24;:::i;:::-;9390:3;9383:37;9318:108;;:::o;9432:118::-;9519:24;9537:5;9519:24;:::i;:::-;9514:3;9507:37;9432:118;;:::o;9586:732::-;9705:3;9734:54;9782:5;9734:54;:::i;:::-;9804:86;9883:6;9878:3;9804:86;:::i;:::-;9797:93;;9914:56;9964:5;9914:56;:::i;:::-;9993:7;10024:1;10009:284;10034:6;10031:1;10028:13;10009:284;;;10110:6;10104:13;10137:63;10196:3;10181:13;10137:63;:::i;:::-;10130:70;;10223:60;10276:6;10223:60;:::i;:::-;10213:70;;10069:224;10056:1;10053;10049:9;10044:14;;10009:284;;;10013:14;10309:3;10302:10;;9710:608;;;9586:732;;;;:::o;10354:::-;10473:3;10502:54;10550:5;10502:54;:::i;:::-;10572:86;10651:6;10646:3;10572:86;:::i;:::-;10565:93;;10682:56;10732:5;10682:56;:::i;:::-;10761:7;10792:1;10777:284;10802:6;10799:1;10796:13;10777:284;;;10878:6;10872:13;10905:63;10964:3;10949:13;10905:63;:::i;:::-;10898:70;;10991:60;11044:6;10991:60;:::i;:::-;10981:70;;10837:224;10824:1;10821;10817:9;10812:14;;10777:284;;;10781:14;11077:3;11070:10;;10478:608;;;10354:732;;;;:::o;11092:109::-;11173:21;11188:5;11173:21;:::i;:::-;11168:3;11161:34;11092:109;;:::o;11207:118::-;11294:24;11312:5;11294:24;:::i;:::-;11289:3;11282:37;11207:118;;:::o;11331:157::-;11436:45;11456:24;11474:5;11456:24;:::i;:::-;11436:45;:::i;:::-;11431:3;11424:58;11331:157;;:::o;11494:360::-;11580:3;11608:38;11640:5;11608:38;:::i;:::-;11662:70;11725:6;11720:3;11662:70;:::i;:::-;11655:77;;11741:52;11786:6;11781:3;11774:4;11767:5;11763:16;11741:52;:::i;:::-;11818:29;11840:6;11818:29;:::i;:::-;11813:3;11809:39;11802:46;;11584:270;11494:360;;;;:::o;11860:373::-;11964:3;11992:38;12024:5;11992:38;:::i;:::-;12046:88;12127:6;12122:3;12046:88;:::i;:::-;12039:95;;12143:52;12188:6;12183:3;12176:4;12169:5;12165:16;12143:52;:::i;:::-;12220:6;12215:3;12211:16;12204:23;;11968:265;11860:373;;;;:::o;12239:185::-;12353:64;12411:5;12353:64;:::i;:::-;12348:3;12341:77;12239:185;;:::o;12430:147::-;12525:45;12564:5;12525:45;:::i;:::-;12520:3;12513:58;12430:147;;:::o;12583:364::-;12671:3;12699:39;12732:5;12699:39;:::i;:::-;12754:71;12818:6;12813:3;12754:71;:::i;:::-;12747:78;;12834:52;12879:6;12874:3;12867:4;12860:5;12856:16;12834:52;:::i;:::-;12911:29;12933:6;12911:29;:::i;:::-;12906:3;12902:39;12895:46;;12675:272;12583:364;;;;:::o;12953:366::-;13095:3;13116:67;13180:2;13175:3;13116:67;:::i;:::-;13109:74;;13192:93;13281:3;13192:93;:::i;:::-;13310:2;13305:3;13301:12;13294:19;;12953:366;;;:::o;13325:::-;13467:3;13488:67;13552:2;13547:3;13488:67;:::i;:::-;13481:74;;13564:93;13653:3;13564:93;:::i;:::-;13682:2;13677:3;13673:12;13666:19;;13325:366;;;:::o;13697:::-;13839:3;13860:67;13924:2;13919:3;13860:67;:::i;:::-;13853:74;;13936:93;14025:3;13936:93;:::i;:::-;14054:2;14049:3;14045:12;14038:19;;13697:366;;;:::o;14069:::-;14211:3;14232:67;14296:2;14291:3;14232:67;:::i;:::-;14225:74;;14308:93;14397:3;14308:93;:::i;:::-;14426:2;14421:3;14417:12;14410:19;;14069:366;;;:::o;14441:::-;14583:3;14604:67;14668:2;14663:3;14604:67;:::i;:::-;14597:74;;14680:93;14769:3;14680:93;:::i;:::-;14798:2;14793:3;14789:12;14782:19;;14441:366;;;:::o;14813:::-;14955:3;14976:67;15040:2;15035:3;14976:67;:::i;:::-;14969:74;;15052:93;15141:3;15052:93;:::i;:::-;15170:2;15165:3;15161:12;15154:19;;14813:366;;;:::o;15185:400::-;15345:3;15366:84;15448:1;15443:3;15366:84;:::i;:::-;15359:91;;15459:93;15548:3;15459:93;:::i;:::-;15577:1;15572:3;15568:11;15561:18;;15185:400;;;:::o;15591:366::-;15733:3;15754:67;15818:2;15813:3;15754:67;:::i;:::-;15747:74;;15830:93;15919:3;15830:93;:::i;:::-;15948:2;15943:3;15939:12;15932:19;;15591:366;;;:::o;15963:::-;16105:3;16126:67;16190:2;16185:3;16126:67;:::i;:::-;16119:74;;16202:93;16291:3;16202:93;:::i;:::-;16320:2;16315:3;16311:12;16304:19;;15963:366;;;:::o;16335:::-;16477:3;16498:67;16562:2;16557:3;16498:67;:::i;:::-;16491:74;;16574:93;16663:3;16574:93;:::i;:::-;16692:2;16687:3;16683:12;16676:19;;16335:366;;;:::o;16707:::-;16849:3;16870:67;16934:2;16929:3;16870:67;:::i;:::-;16863:74;;16946:93;17035:3;16946:93;:::i;:::-;17064:2;17059:3;17055:12;17048:19;;16707:366;;;:::o;17079:400::-;17239:3;17260:84;17342:1;17337:3;17260:84;:::i;:::-;17253:91;;17353:93;17442:3;17353:93;:::i;:::-;17471:1;17466:3;17462:11;17455:18;;17079:400;;;:::o;17485:366::-;17627:3;17648:67;17712:2;17707:3;17648:67;:::i;:::-;17641:74;;17724:93;17813:3;17724:93;:::i;:::-;17842:2;17837:3;17833:12;17826:19;;17485:366;;;:::o;17857:::-;17999:3;18020:67;18084:2;18079:3;18020:67;:::i;:::-;18013:74;;18096:93;18185:3;18096:93;:::i;:::-;18214:2;18209:3;18205:12;18198:19;;17857:366;;;:::o;18229:::-;18371:3;18392:67;18456:2;18451:3;18392:67;:::i;:::-;18385:74;;18468:93;18557:3;18468:93;:::i;:::-;18586:2;18581:3;18577:12;18570:19;;18229:366;;;:::o;18601:::-;18743:3;18764:67;18828:2;18823:3;18764:67;:::i;:::-;18757:74;;18840:93;18929:3;18840:93;:::i;:::-;18958:2;18953:3;18949:12;18942:19;;18601:366;;;:::o;18973:::-;19115:3;19136:67;19200:2;19195:3;19136:67;:::i;:::-;19129:74;;19212:93;19301:3;19212:93;:::i;:::-;19330:2;19325:3;19321:12;19314:19;;18973:366;;;:::o;19345:::-;19487:3;19508:67;19572:2;19567:3;19508:67;:::i;:::-;19501:74;;19584:93;19673:3;19584:93;:::i;:::-;19702:2;19697:3;19693:12;19686:19;;19345:366;;;:::o;19717:::-;19859:3;19880:67;19944:2;19939:3;19880:67;:::i;:::-;19873:74;;19956:93;20045:3;19956:93;:::i;:::-;20074:2;20069:3;20065:12;20058:19;;19717:366;;;:::o;20089:::-;20231:3;20252:67;20316:2;20311:3;20252:67;:::i;:::-;20245:74;;20328:93;20417:3;20328:93;:::i;:::-;20446:2;20441:3;20437:12;20430:19;;20089:366;;;:::o;20461:::-;20603:3;20624:67;20688:2;20683:3;20624:67;:::i;:::-;20617:74;;20700:93;20789:3;20700:93;:::i;:::-;20818:2;20813:3;20809:12;20802:19;;20461:366;;;:::o;20833:::-;20975:3;20996:67;21060:2;21055:3;20996:67;:::i;:::-;20989:74;;21072:93;21161:3;21072:93;:::i;:::-;21190:2;21185:3;21181:12;21174:19;;20833:366;;;:::o;21205:398::-;21364:3;21385:83;21466:1;21461:3;21385:83;:::i;:::-;21378:90;;21477:93;21566:3;21477:93;:::i;:::-;21595:1;21590:3;21586:11;21579:18;;21205:398;;;:::o;21609:366::-;21751:3;21772:67;21836:2;21831:3;21772:67;:::i;:::-;21765:74;;21848:93;21937:3;21848:93;:::i;:::-;21966:2;21961:3;21957:12;21950:19;;21609:366;;;:::o;21981:::-;22123:3;22144:67;22208:2;22203:3;22144:67;:::i;:::-;22137:74;;22220:93;22309:3;22220:93;:::i;:::-;22338:2;22333:3;22329:12;22322:19;;21981:366;;;:::o;22353:::-;22495:3;22516:67;22580:2;22575:3;22516:67;:::i;:::-;22509:74;;22592:93;22681:3;22592:93;:::i;:::-;22710:2;22705:3;22701:12;22694:19;;22353:366;;;:::o;22725:::-;22867:3;22888:67;22952:2;22947:3;22888:67;:::i;:::-;22881:74;;22964:93;23053:3;22964:93;:::i;:::-;23082:2;23077:3;23073:12;23066:19;;22725:366;;;:::o;23097:::-;23239:3;23260:67;23324:2;23319:3;23260:67;:::i;:::-;23253:74;;23336:93;23425:3;23336:93;:::i;:::-;23454:2;23449:3;23445:12;23438:19;;23097:366;;;:::o;23469:::-;23611:3;23632:67;23696:2;23691:3;23632:67;:::i;:::-;23625:74;;23708:93;23797:3;23708:93;:::i;:::-;23826:2;23821:3;23817:12;23810:19;;23469:366;;;:::o;23841:::-;23983:3;24004:67;24068:2;24063:3;24004:67;:::i;:::-;23997:74;;24080:93;24169:3;24080:93;:::i;:::-;24198:2;24193:3;24189:12;24182:19;;23841:366;;;:::o;24213:::-;24355:3;24376:67;24440:2;24435:3;24376:67;:::i;:::-;24369:74;;24452:93;24541:3;24452:93;:::i;:::-;24570:2;24565:3;24561:12;24554:19;;24213:366;;;:::o;24585:108::-;24662:24;24680:5;24662:24;:::i;:::-;24657:3;24650:37;24585:108;;:::o;24699:118::-;24786:24;24804:5;24786:24;:::i;:::-;24781:3;24774:37;24699:118;;:::o;24823:157::-;24928:45;24948:24;24966:5;24948:24;:::i;:::-;24928:45;:::i;:::-;24923:3;24916:58;24823:157;;:::o;24986:397::-;25126:3;25141:75;25212:3;25203:6;25141:75;:::i;:::-;25241:2;25236:3;25232:12;25225:19;;25254:75;25325:3;25316:6;25254:75;:::i;:::-;25354:2;25349:3;25345:12;25338:19;;25374:3;25367:10;;24986:397;;;;;:::o;25389:271::-;25519:3;25541:93;25630:3;25621:6;25541:93;:::i;:::-;25534:100;;25651:3;25644:10;;25389:271;;;;:::o;25666:381::-;25851:3;25873:148;26017:3;25873:148;:::i;:::-;25866:155;;26038:3;26031:10;;25666:381;;;:::o;26053:::-;26238:3;26260:148;26404:3;26260:148;:::i;:::-;26253:155;;26425:3;26418:10;;26053:381;;;:::o;26440:379::-;26624:3;26646:147;26789:3;26646:147;:::i;:::-;26639:154;;26810:3;26803:10;;26440:379;;;:::o;26825:222::-;26918:4;26956:2;26945:9;26941:18;26933:26;;26969:71;27037:1;27026:9;27022:17;27013:6;26969:71;:::i;:::-;26825:222;;;;:::o;27053:640::-;27248:4;27286:3;27275:9;27271:19;27263:27;;27300:71;27368:1;27357:9;27353:17;27344:6;27300:71;:::i;:::-;27381:72;27449:2;27438:9;27434:18;27425:6;27381:72;:::i;:::-;27463;27531:2;27520:9;27516:18;27507:6;27463:72;:::i;:::-;27582:9;27576:4;27572:20;27567:2;27556:9;27552:18;27545:48;27610:76;27681:4;27672:6;27610:76;:::i;:::-;27602:84;;27053:640;;;;;;;:::o;27699:332::-;27820:4;27858:2;27847:9;27843:18;27835:26;;27871:71;27939:1;27928:9;27924:17;27915:6;27871:71;:::i;:::-;27952:72;28020:2;28009:9;28005:18;27996:6;27952:72;:::i;:::-;27699:332;;;;;:::o;28037:529::-;28204:4;28242:2;28231:9;28227:18;28219:26;;28255:71;28323:1;28312:9;28308:17;28299:6;28255:71;:::i;:::-;28336:72;28404:2;28393:9;28389:18;28380:6;28336:72;:::i;:::-;28455:9;28449:4;28445:20;28440:2;28429:9;28425:18;28418:48;28483:76;28554:4;28545:6;28483:76;:::i;:::-;28475:84;;28037:529;;;;;;:::o;28572:373::-;28715:4;28753:2;28742:9;28738:18;28730:26;;28802:9;28796:4;28792:20;28788:1;28777:9;28773:17;28766:47;28830:108;28933:4;28924:6;28830:108;:::i;:::-;28822:116;;28572:373;;;;:::o;28951:210::-;29038:4;29076:2;29065:9;29061:18;29053:26;;29089:65;29151:1;29140:9;29136:17;29127:6;29089:65;:::i;:::-;28951:210;;;;:::o;29167:222::-;29260:4;29298:2;29287:9;29283:18;29275:26;;29311:71;29379:1;29368:9;29364:17;29355:6;29311:71;:::i;:::-;29167:222;;;;:::o;29395:332::-;29516:4;29554:2;29543:9;29539:18;29531:26;;29567:71;29635:1;29624:9;29620:17;29611:6;29567:71;:::i;:::-;29648:72;29716:2;29705:9;29701:18;29692:6;29648:72;:::i;:::-;29395:332;;;;;:::o;29733:553::-;29910:4;29948:3;29937:9;29933:19;29925:27;;29962:71;30030:1;30019:9;30015:17;30006:6;29962:71;:::i;:::-;30043:72;30111:2;30100:9;30096:18;30087:6;30043:72;:::i;:::-;30125;30193:2;30182:9;30178:18;30169:6;30125:72;:::i;:::-;30207;30275:2;30264:9;30260:18;30251:6;30207:72;:::i;:::-;29733:553;;;;;;;:::o;30292:276::-;30412:4;30450:2;30439:9;30435:18;30427:26;;30463:98;30558:1;30547:9;30543:17;30534:6;30463:98;:::i;:::-;30292:276;;;;:::o;30574:720::-;30809:4;30847:3;30836:9;30832:19;30824:27;;30861:79;30937:1;30926:9;30922:17;30913:6;30861:79;:::i;:::-;30987:9;30981:4;30977:20;30972:2;30961:9;30957:18;30950:48;31015:108;31118:4;31109:6;31015:108;:::i;:::-;31007:116;;31133:72;31201:2;31190:9;31186:18;31177:6;31133:72;:::i;:::-;31215;31283:2;31272:9;31268:18;31259:6;31215:72;:::i;:::-;30574:720;;;;;;;:::o;31300:313::-;31413:4;31451:2;31440:9;31436:18;31428:26;;31500:9;31494:4;31490:20;31486:1;31475:9;31471:17;31464:47;31528:78;31601:4;31592:6;31528:78;:::i;:::-;31520:86;;31300:313;;;;:::o;31619:419::-;31785:4;31823:2;31812:9;31808:18;31800:26;;31872:9;31866:4;31862:20;31858:1;31847:9;31843:17;31836:47;31900:131;32026:4;31900:131;:::i;:::-;31892:139;;31619:419;;;:::o;32044:::-;32210:4;32248:2;32237:9;32233:18;32225:26;;32297:9;32291:4;32287:20;32283:1;32272:9;32268:17;32261:47;32325:131;32451:4;32325:131;:::i;:::-;32317:139;;32044:419;;;:::o;32469:::-;32635:4;32673:2;32662:9;32658:18;32650:26;;32722:9;32716:4;32712:20;32708:1;32697:9;32693:17;32686:47;32750:131;32876:4;32750:131;:::i;:::-;32742:139;;32469:419;;;:::o;32894:::-;33060:4;33098:2;33087:9;33083:18;33075:26;;33147:9;33141:4;33137:20;33133:1;33122:9;33118:17;33111:47;33175:131;33301:4;33175:131;:::i;:::-;33167:139;;32894:419;;;:::o;33319:::-;33485:4;33523:2;33512:9;33508:18;33500:26;;33572:9;33566:4;33562:20;33558:1;33547:9;33543:17;33536:47;33600:131;33726:4;33600:131;:::i;:::-;33592:139;;33319:419;;;:::o;33744:::-;33910:4;33948:2;33937:9;33933:18;33925:26;;33997:9;33991:4;33987:20;33983:1;33972:9;33968:17;33961:47;34025:131;34151:4;34025:131;:::i;:::-;34017:139;;33744:419;;;:::o;34169:::-;34335:4;34373:2;34362:9;34358:18;34350:26;;34422:9;34416:4;34412:20;34408:1;34397:9;34393:17;34386:47;34450:131;34576:4;34450:131;:::i;:::-;34442:139;;34169:419;;;:::o;34594:::-;34760:4;34798:2;34787:9;34783:18;34775:26;;34847:9;34841:4;34837:20;34833:1;34822:9;34818:17;34811:47;34875:131;35001:4;34875:131;:::i;:::-;34867:139;;34594:419;;;:::o;35019:::-;35185:4;35223:2;35212:9;35208:18;35200:26;;35272:9;35266:4;35262:20;35258:1;35247:9;35243:17;35236:47;35300:131;35426:4;35300:131;:::i;:::-;35292:139;;35019:419;;;:::o;35444:::-;35610:4;35648:2;35637:9;35633:18;35625:26;;35697:9;35691:4;35687:20;35683:1;35672:9;35668:17;35661:47;35725:131;35851:4;35725:131;:::i;:::-;35717:139;;35444:419;;;:::o;35869:::-;36035:4;36073:2;36062:9;36058:18;36050:26;;36122:9;36116:4;36112:20;36108:1;36097:9;36093:17;36086:47;36150:131;36276:4;36150:131;:::i;:::-;36142:139;;35869:419;;;:::o;36294:::-;36460:4;36498:2;36487:9;36483:18;36475:26;;36547:9;36541:4;36537:20;36533:1;36522:9;36518:17;36511:47;36575:131;36701:4;36575:131;:::i;:::-;36567:139;;36294:419;;;:::o;36719:::-;36885:4;36923:2;36912:9;36908:18;36900:26;;36972:9;36966:4;36962:20;36958:1;36947:9;36943:17;36936:47;37000:131;37126:4;37000:131;:::i;:::-;36992:139;;36719:419;;;:::o;37144:::-;37310:4;37348:2;37337:9;37333:18;37325:26;;37397:9;37391:4;37387:20;37383:1;37372:9;37368:17;37361:47;37425:131;37551:4;37425:131;:::i;:::-;37417:139;;37144:419;;;:::o;37569:::-;37735:4;37773:2;37762:9;37758:18;37750:26;;37822:9;37816:4;37812:20;37808:1;37797:9;37793:17;37786:47;37850:131;37976:4;37850:131;:::i;:::-;37842:139;;37569:419;;;:::o;37994:::-;38160:4;38198:2;38187:9;38183:18;38175:26;;38247:9;38241:4;38237:20;38233:1;38222:9;38218:17;38211:47;38275:131;38401:4;38275:131;:::i;:::-;38267:139;;37994:419;;;:::o;38419:::-;38585:4;38623:2;38612:9;38608:18;38600:26;;38672:9;38666:4;38662:20;38658:1;38647:9;38643:17;38636:47;38700:131;38826:4;38700:131;:::i;:::-;38692:139;;38419:419;;;:::o;38844:::-;39010:4;39048:2;39037:9;39033:18;39025:26;;39097:9;39091:4;39087:20;39083:1;39072:9;39068:17;39061:47;39125:131;39251:4;39125:131;:::i;:::-;39117:139;;38844:419;;;:::o;39269:::-;39435:4;39473:2;39462:9;39458:18;39450:26;;39522:9;39516:4;39512:20;39508:1;39497:9;39493:17;39486:47;39550:131;39676:4;39550:131;:::i;:::-;39542:139;;39269:419;;;:::o;39694:::-;39860:4;39898:2;39887:9;39883:18;39875:26;;39947:9;39941:4;39937:20;39933:1;39922:9;39918:17;39911:47;39975:131;40101:4;39975:131;:::i;:::-;39967:139;;39694:419;;;:::o;40119:::-;40285:4;40323:2;40312:9;40308:18;40300:26;;40372:9;40366:4;40362:20;40358:1;40347:9;40343:17;40336:47;40400:131;40526:4;40400:131;:::i;:::-;40392:139;;40119:419;;;:::o;40544:::-;40710:4;40748:2;40737:9;40733:18;40725:26;;40797:9;40791:4;40787:20;40783:1;40772:9;40768:17;40761:47;40825:131;40951:4;40825:131;:::i;:::-;40817:139;;40544:419;;;:::o;40969:::-;41135:4;41173:2;41162:9;41158:18;41150:26;;41222:9;41216:4;41212:20;41208:1;41197:9;41193:17;41186:47;41250:131;41376:4;41250:131;:::i;:::-;41242:139;;40969:419;;;:::o;41394:::-;41560:4;41598:2;41587:9;41583:18;41575:26;;41647:9;41641:4;41637:20;41633:1;41622:9;41618:17;41611:47;41675:131;41801:4;41675:131;:::i;:::-;41667:139;;41394:419;;;:::o;41819:::-;41985:4;42023:2;42012:9;42008:18;42000:26;;42072:9;42066:4;42062:20;42058:1;42047:9;42043:17;42036:47;42100:131;42226:4;42100:131;:::i;:::-;42092:139;;41819:419;;;:::o;42244:::-;42410:4;42448:2;42437:9;42433:18;42425:26;;42497:9;42491:4;42487:20;42483:1;42472:9;42468:17;42461:47;42525:131;42651:4;42525:131;:::i;:::-;42517:139;;42244:419;;;:::o;42669:::-;42835:4;42873:2;42862:9;42858:18;42850:26;;42922:9;42916:4;42912:20;42908:1;42897:9;42893:17;42886:47;42950:131;43076:4;42950:131;:::i;:::-;42942:139;;42669:419;;;:::o;43094:::-;43260:4;43298:2;43287:9;43283:18;43275:26;;43347:9;43341:4;43337:20;43333:1;43322:9;43318:17;43311:47;43375:131;43501:4;43375:131;:::i;:::-;43367:139;;43094:419;;;:::o;43519:222::-;43612:4;43650:2;43639:9;43635:18;43627:26;;43663:71;43731:1;43720:9;43716:17;43707:6;43663:71;:::i;:::-;43519:222;;;;:::o;43747:320::-;43862:4;43900:2;43889:9;43885:18;43877:26;;43913:71;43981:1;43970:9;43966:17;43957:6;43913:71;:::i;:::-;43994:66;44056:2;44045:9;44041:18;44032:6;43994:66;:::i;:::-;43747:320;;;;;:::o;44073:129::-;44107:6;44134:20;;:::i;:::-;44124:30;;44163:33;44191:4;44183:6;44163:33;:::i;:::-;44073:129;;;:::o;44208:75::-;44241:6;44274:2;44268:9;44258:19;;44208:75;:::o;44289:307::-;44350:4;44440:18;44432:6;44429:30;44426:56;;;44462:18;;:::i;:::-;44426:56;44500:29;44522:6;44500:29;:::i;:::-;44492:37;;44584:4;44578;44574:15;44566:23;;44289:307;;;:::o;44602:132::-;44669:4;44692:3;44684:11;;44722:4;44717:3;44713:14;44705:22;;44602:132;;;:::o;44740:::-;44807:4;44830:3;44822:11;;44860:4;44855:3;44851:14;44843:22;;44740:132;;;:::o;44878:114::-;44945:6;44979:5;44973:12;44963:22;;44878:114;;;:::o;44998:::-;45065:6;45099:5;45093:12;45083:22;;44998:114;;;:::o;45118:98::-;45169:6;45203:5;45197:12;45187:22;;45118:98;;;:::o;45222:99::-;45274:6;45308:5;45302:12;45292:22;;45222:99;;;:::o;45327:113::-;45397:4;45429;45424:3;45420:14;45412:22;;45327:113;;;:::o;45446:::-;45516:4;45548;45543:3;45539:14;45531:22;;45446:113;;;:::o;45565:184::-;45664:11;45698:6;45693:3;45686:19;45738:4;45733:3;45729:14;45714:29;;45565:184;;;;:::o;45755:::-;45854:11;45888:6;45883:3;45876:19;45928:4;45923:3;45919:14;45904:29;;45755:184;;;;:::o;45945:168::-;46028:11;46062:6;46057:3;46050:19;46102:4;46097:3;46093:14;46078:29;;45945:168;;;;:::o;46119:147::-;46220:11;46257:3;46242:18;;46119:147;;;;:::o;46272:169::-;46356:11;46390:6;46385:3;46378:19;46430:4;46425:3;46421:14;46406:29;;46272:169;;;;:::o;46447:148::-;46549:11;46586:3;46571:18;;46447:148;;;;:::o;46601:305::-;46641:3;46660:20;46678:1;46660:20;:::i;:::-;46655:25;;46694:20;46712:1;46694:20;:::i;:::-;46689:25;;46848:1;46780:66;46776:74;46773:1;46770:81;46767:107;;;46854:18;;:::i;:::-;46767:107;46898:1;46895;46891:9;46884:16;;46601:305;;;;:::o;46912:185::-;46952:1;46969:20;46987:1;46969:20;:::i;:::-;46964:25;;47003:20;47021:1;47003:20;:::i;:::-;46998:25;;47042:1;47032:35;;47047:18;;:::i;:::-;47032:35;47089:1;47086;47082:9;47077:14;;46912:185;;;;:::o;47103:348::-;47143:7;47166:20;47184:1;47166:20;:::i;:::-;47161:25;;47200:20;47218:1;47200:20;:::i;:::-;47195:25;;47388:1;47320:66;47316:74;47313:1;47310:81;47305:1;47298:9;47291:17;47287:105;47284:131;;;47395:18;;:::i;:::-;47284:131;47443:1;47440;47436:9;47425:20;;47103:348;;;;:::o;47457:297::-;47496:7;47519:19;47536:1;47519:19;:::i;:::-;47514:24;;47552:19;47569:1;47552:19;:::i;:::-;47547:24;;47691:1;47671:18;47667:26;47664:1;47661:33;47656:1;47649:9;47642:17;47638:57;47635:83;;;47698:18;;:::i;:::-;47635:83;47746:1;47743;47739:9;47728:20;;47457:297;;;;:::o;47760:191::-;47800:4;47820:20;47838:1;47820:20;:::i;:::-;47815:25;;47854:20;47872:1;47854:20;:::i;:::-;47849:25;;47893:1;47890;47887:8;47884:34;;;47898:18;;:::i;:::-;47884:34;47943:1;47940;47936:9;47928:17;;47760:191;;;;:::o;47957:96::-;47994:7;48023:24;48041:5;48023:24;:::i;:::-;48012:35;;47957:96;;;:::o;48059:90::-;48093:7;48136:5;48129:13;48122:21;48111:32;;48059:90;;;:::o;48155:77::-;48192:7;48221:5;48210:16;;48155:77;;;:::o;48238:149::-;48274:7;48314:66;48307:5;48303:78;48292:89;;48238:149;;;:::o;48393:126::-;48430:7;48470:42;48463:5;48459:54;48448:65;;48393:126;;;:::o;48525:77::-;48562:7;48591:5;48580:16;;48525:77;;;:::o;48608:101::-;48644:7;48684:18;48677:5;48673:30;48662:41;;48608:101;;;:::o;48715:86::-;48750:7;48790:4;48783:5;48779:16;48768:27;;48715:86;;;:::o;48807:153::-;48884:9;48917:37;48948:5;48917:37;:::i;:::-;48904:50;;48807:153;;;:::o;48966:121::-;49024:9;49057:24;49075:5;49057:24;:::i;:::-;49044:37;;48966:121;;;:::o;49093:126::-;49143:9;49176:37;49207:5;49176:37;:::i;:::-;49163:50;;49093:126;;;:::o;49225:113::-;49275:9;49308:24;49326:5;49308:24;:::i;:::-;49295:37;;49225:113;;;:::o;49344:154::-;49428:6;49423:3;49418;49405:30;49490:1;49481:6;49476:3;49472:16;49465:27;49344:154;;;:::o;49504:307::-;49572:1;49582:113;49596:6;49593:1;49590:13;49582:113;;;49681:1;49676:3;49672:11;49666:18;49662:1;49657:3;49653:11;49646:39;49618:2;49615:1;49611:10;49606:15;;49582:113;;;49713:6;49710:1;49707:13;49704:101;;;49793:1;49784:6;49779:3;49775:16;49768:27;49704:101;49553:258;49504:307;;;:::o;49817:320::-;49861:6;49898:1;49892:4;49888:12;49878:22;;49945:1;49939:4;49935:12;49966:18;49956:81;;50022:4;50014:6;50010:17;50000:27;;49956:81;50084:2;50076:6;50073:14;50053:18;50050:38;50047:84;;;50103:18;;:::i;:::-;50047:84;49868:269;49817:320;;;:::o;50143:281::-;50226:27;50248:4;50226:27;:::i;:::-;50218:6;50214:40;50356:6;50344:10;50341:22;50320:18;50308:10;50305:34;50302:62;50299:88;;;50367:18;;:::i;:::-;50299:88;50407:10;50403:2;50396:22;50186:238;50143:281;;:::o;50430:233::-;50469:3;50492:24;50510:5;50492:24;:::i;:::-;50483:33;;50538:66;50531:5;50528:77;50525:103;;;50608:18;;:::i;:::-;50525:103;50655:1;50648:5;50644:13;50637:20;;50430:233;;;:::o;50669:167::-;50706:3;50729:22;50745:5;50729:22;:::i;:::-;50720:31;;50773:4;50766:5;50763:15;50760:41;;;50781:18;;:::i;:::-;50760:41;50828:1;50821:5;50817:13;50810:20;;50669:167;;;:::o;50842:79::-;50881:7;50910:5;50899:16;;50842:79;;;:::o;50927:::-;50966:7;50995:5;50984:16;;50927:79;;;:::o;51012:176::-;51044:1;51061:20;51079:1;51061:20;:::i;:::-;51056:25;;51095:20;51113:1;51095:20;:::i;:::-;51090:25;;51134:1;51124:35;;51139:18;;:::i;:::-;51124:35;51180:1;51177;51173:9;51168:14;;51012:176;;;;:::o;51194:180::-;51242:77;51239:1;51232:88;51339:4;51336:1;51329:15;51363:4;51360:1;51353:15;51380:180;51428:77;51425:1;51418:88;51525:4;51522:1;51515:15;51549:4;51546:1;51539:15;51566:180;51614:77;51611:1;51604:88;51711:4;51708:1;51701:15;51735:4;51732:1;51725:15;51752:180;51800:77;51797:1;51790:88;51897:4;51894:1;51887:15;51921:4;51918:1;51911:15;51938:180;51986:77;51983:1;51976:88;52083:4;52080:1;52073:15;52107:4;52104:1;52097:15;52124:180;52172:77;52169:1;52162:88;52269:4;52266:1;52259:15;52293:4;52290:1;52283:15;52310:117;52419:1;52416;52409:12;52433:117;52542:1;52539;52532:12;52556:117;52665:1;52662;52655:12;52679:117;52788:1;52785;52778:12;52802:102;52843:6;52894:2;52890:7;52885:2;52878:5;52874:14;52870:28;52860:38;;52802:102;;;:::o;52910:229::-;53050:34;53046:1;53038:6;53034:14;53027:58;53119:12;53114:2;53106:6;53102:15;53095:37;52910:229;:::o;53145:166::-;53285:18;53281:1;53273:6;53269:14;53262:42;53145:166;:::o;53317:230::-;53457:34;53453:1;53445:6;53441:14;53434:58;53526:13;53521:2;53513:6;53509:15;53502:38;53317:230;:::o;53553:237::-;53693:34;53689:1;53681:6;53677:14;53670:58;53762:20;53757:2;53749:6;53745:15;53738:45;53553:237;:::o;53796:224::-;53936:34;53932:1;53924:6;53920:14;53913:58;54005:7;54000:2;53992:6;53988:15;53981:32;53796:224;:::o;54026:178::-;54166:30;54162:1;54154:6;54150:14;54143:54;54026:178;:::o;54210:155::-;54350:7;54346:1;54338:6;54334:14;54327:31;54210:155;:::o;54371:166::-;54511:18;54507:1;54499:6;54495:14;54488:42;54371:166;:::o;54543:170::-;54683:22;54679:1;54671:6;54667:14;54660:46;54543:170;:::o;54719:223::-;54859:34;54855:1;54847:6;54843:14;54836:58;54928:6;54923:2;54915:6;54911:15;54904:31;54719:223;:::o;54948:175::-;55088:27;55084:1;55076:6;55072:14;55065:51;54948:175;:::o;55129:158::-;55269:10;55265:1;55257:6;55253:14;55246:34;55129:158;:::o;55293:225::-;55433:34;55429:1;55421:6;55417:14;55410:58;55502:8;55497:2;55489:6;55485:15;55478:33;55293:225;:::o;55524:228::-;55664:34;55660:1;55652:6;55648:14;55641:58;55733:11;55728:2;55720:6;55716:15;55709:36;55524:228;:::o;55758:177::-;55898:29;55894:1;55886:6;55882:14;55875:53;55758:177;:::o;55941:173::-;56081:25;56077:1;56069:6;56065:14;56058:49;55941:173;:::o;56120:249::-;56260:34;56256:1;56248:6;56244:14;56237:58;56329:32;56324:2;56316:6;56312:15;56305:57;56120:249;:::o;56375:182::-;56515:34;56511:1;56503:6;56499:14;56492:58;56375:182;:::o;56563:181::-;56703:33;56699:1;56691:6;56687:14;56680:57;56563:181;:::o;56750:171::-;56890:23;56886:1;56878:6;56874:14;56867:47;56750:171;:::o;56927:174::-;57067:26;57063:1;57055:6;57051:14;57044:50;56927:174;:::o;57107:220::-;57247:34;57243:1;57235:6;57231:14;57224:58;57316:3;57311:2;57303:6;57299:15;57292:28;57107:220;:::o;57333:114::-;;:::o;57453:179::-;57593:31;57589:1;57581:6;57577:14;57570:55;57453:179;:::o;57638:231::-;57778:34;57774:1;57766:6;57762:14;57755:58;57847:14;57842:2;57834:6;57830:15;57823:39;57638:231;:::o;57875:176::-;58015:28;58011:1;58003:6;57999:14;57992:52;57875:176;:::o;58057:::-;58197:28;58193:1;58185:6;58181:14;58174:52;58057:176;:::o;58239:229::-;58379:34;58375:1;58367:6;58363:14;58356:58;58448:12;58443:2;58435:6;58431:15;58424:37;58239:229;:::o;58474:233::-;58614:34;58610:1;58602:6;58598:14;58591:58;58683:16;58678:2;58670:6;58666:15;58659:41;58474:233;:::o;58713:181::-;58853:33;58849:1;58841:6;58837:14;58830:57;58713:181;:::o;58900:172::-;59040:24;59036:1;59028:6;59024:14;59017:48;58900:172;:::o;59078:122::-;59151:24;59169:5;59151:24;:::i;:::-;59144:5;59141:35;59131:63;;59190:1;59187;59180:12;59131:63;59078:122;:::o;59206:116::-;59276:21;59291:5;59276:21;:::i;:::-;59269:5;59266:32;59256:60;;59312:1;59309;59302:12;59256:60;59206:116;:::o;59328:122::-;59401:24;59419:5;59401:24;:::i;:::-;59394:5;59391:35;59381:63;;59440:1;59437;59430:12;59381:63;59328:122;:::o;59456:120::-;59528:23;59545:5;59528:23;:::i;:::-;59521:5;59518:34;59508:62;;59566:1;59563;59556:12;59508:62;59456:120;:::o;59582:122::-;59655:24;59673:5;59655:24;:::i;:::-;59648:5;59645:35;59635:63;;59694:1;59691;59684:12;59635:63;59582:122;:::o;59710:118::-;59781:22;59797:5;59781:22;:::i;:::-;59774:5;59771:33;59761:61;;59818:1;59815;59808:12;59761:61;59710:118;:::o

Swarm Source

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