POL Price: $0.627205 (-2.54%)
 

Overview

Max Total Supply

0 Mojor Early Bird Ticket - Waitinglist

Holders

34,782

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 Mojor Early Bird Ticket - Waitinglist
0x4a02cd742904a46e0926cba4d3382ad0403e8fcb
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
Waitinglist

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-08-24
*/

// File: Mojor Early Bird Ticket - Waitinglist_flat.sol


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


pragma solidity ^0.8.4;

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

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

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

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

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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts (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.6.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 be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: Mojor Early Bird Ticket - Waitinglist.sol


pragma solidity ^0.8.4;







contract Waitinglist is ERC721, ERC721URIStorage,Ownable,VRFConsumerBaseV2{

    VRFCoordinatorV2Interface COORDINATOR;

    // Your subscription ID.
    uint64 s_subscriptionId = 229;

    // Goerli coordinator. For other networks,
    // see https://docs.chain.link/docs/vrf-contracts/#configurations
    address vrfCoordinator = 0xAE975071Be8F8eE67addBC1A82488F1C24858067;

    // The gas lane to use, which specifies the maximum gas price to bump to.
    // For a list of available gas lanes on each network,
    // see https://docs.chain.link/docs/vrf-contracts/#configurations
    bytes32 keyHash = 0xcc294a196eeeb44da2888d17c0625cc88d70d9760a69d58d853ba6581a9ab0cd;

    // Depends on the number of requested values that you want sent to the
    // fulfillRandomWords() function. Storing each word costs about 20,000 gas,
    // so 100,000 is a safe default for this example contract. Test and adjust
    // this limit based on the network that you select, the size of the request,
    // and the processing of the callback request in the fulfillRandomWords()
    // function.
    uint32 callbackGasLimit = 1000000;

    // The default is 3, but you can set this higher.
    uint16 requestConfirmations = 3;

    // For this example, retrieve 2 random values in one request.
    // Cannot exceed VRFCoordinatorV2.MAX_NUM_WORDS.
    uint32 numWords =  200;

    uint256[] public s_randomWords;

    uint256 public s_requestId;

    address s_owner;

    event luckyNumBirthEvent       (uint  noc);

    event luckyWinnerBirthEvent    (address  ads,uint tokenId);

    mapping(uint => address) public winner;

    mapping(uint => address) public participantMaps;


    uint public winNo=0;

    uint public tokenId=0;
    
    uint public participantIdx=0;

    uint beforeRandom;


    constructor() ERC721("Mojor Early Bird Ticket - Waitinglist", "Mojor Early Bird Ticket - Waitinglist") VRFConsumerBaseV2(vrfCoordinator) {
        COORDINATOR = VRFCoordinatorV2Interface(vrfCoordinator);
        s_owner = msg.sender;
    }
    function safeMint(address to,string memory uri)
    onlyOwner
    public
    {
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
        tokenId++;
    }

    // The following functions are overrides required by Solidity.

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }


    function tokenURI(uint256 tokenId)
    public
    view
    override(ERC721, ERC721URIStorage)
    returns (string memory)
    {
        return super.tokenURI(tokenId);
    }


   function setParticipant(address[] memory ads) onlyOwner public  {
      participantIdx=0;
       for(uint a=0;a<ads.length;a++){
           participantMaps[participantIdx]=ads[a];
           participantIdx++;
       }
   }

    function addParticipant(address[] memory ads) onlyOwner public  {
       for(uint a=0;a<ads.length;a++){
           participantMaps[participantIdx]=ads[a];
           participantIdx++;
       }
   }
   
    function mojorLotteryOne(uint num,uint idx) public onlyOwner returns(uint){
        uint  parmsOne=getNumber(blockhash(block.number - num));
        uint  parmsTotal=parmsOne * ((block.timestamp)/ num);
        if(s_randomWords.length > 0 && beforeRandom != s_randomWords[idx]){
            parmsTotal=s_randomWords[idx];
            beforeRandom=parmsTotal;
        }
        uint  luckyNum=parmsTotal % participantIdx;
        return luckyNum;
    }

    function mojorLotterys(uint times) public  onlyOwner {
        requestRandomWords();
        uint[1000] memory lucks;
        uint idx=0;
        bool rp=true;
        uint ft= times;
        uint luckyNum;
        address lucky;
        require(times>0,"Must more than one");
        require(times<participantIdx,"Must less than participant nums");
        for(uint t=0;t<times;t++){
            while(rp){
                rp=false;
                ft++;
                luckyNum=mojorLotteryOne(ft,t);
                emit luckyNumBirthEvent(luckyNum);
                lucky= participantMaps[luckyNum];
                //check Diff
                for(uint l=0; l<lucks.length ;l++){
                    if(lucks[l] == luckyNum){
                        rp=true;
                    }
                }
                if(!rp){
                    emit luckyWinnerBirthEvent(lucky,luckyNum);
                    winner[winNo]=participantMaps[luckyNum];
                    winNo++;
                    lucks[idx]=luckyNum;
                    idx++;
                }

            }
            rp=true;
        }
    }

    
    function isEqual(bytes memory a, bytes memory b) public pure returns (bool) {
        if (a.length != b.length) return false;
        for(uint i = 0; i < a.length; i ++) {
            if(a[i] != b[i]) return false;
        }
        return true;
    }

    function getNumber(bytes32 _hash) private pure returns(uint8) {
        for(uint8 i = _hash.length - 1;i >= 0;i--){
            uint8 b = uint8(_hash[i]) % 16;
            if(b>0 && b<10) return b;
            uint8 c = uint8(_hash[i]) / 16;
            if(c>0 && c<10) return c;
        }
        return 1;
    }


    // Assumes the subscription is funded sufficiently.
    function requestRandomWords() public onlyOwner {
        // Will revert if subscription is not set and funded.
        s_requestId = COORDINATOR.requestRandomWords(
        keyHash,
        s_subscriptionId,
        requestConfirmations,
        callbackGasLimit,
        numWords
        );
    }

    function fulfillRandomWords(
        uint256, /* requestId */
        uint256[] memory randomWords
    ) internal override {
        s_randomWords = randomWords;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"have","type":"address"},{"internalType":"address","name":"want","type":"address"}],"name":"OnlyCoordinatorCanFulfill","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"noc","type":"uint256"}],"name":"luckyNumBirthEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"ads","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"luckyWinnerBirthEvent","type":"event"},{"inputs":[{"internalType":"address[]","name":"ads","type":"address[]"}],"name":"addParticipant","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"bytes","name":"a","type":"bytes"},{"internalType":"bytes","name":"b","type":"bytes"}],"name":"isEqual","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"uint256","name":"idx","type":"uint256"}],"name":"mojorLotteryOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"times","type":"uint256"}],"name":"mojorLotterys","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"participantIdx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"participantMaps","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"requestId","type":"uint256"},{"internalType":"uint256[]","name":"randomWords","type":"uint256[]"}],"name":"rawFulfillRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestRandomWords","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"s_randomWords","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"s_requestId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"ads","type":"address[]"}],"name":"setParticipant","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":"tokenId","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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"winNo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"winner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60a060405260e5600860146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555073ae975071be8f8ee67addbc1a82488f1c24858067600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fcc294a196eeeb44da2888d17c0625cc88d70d9760a69d58d853ba6581a9ab0cd60001b600a55620f4240600b60006101000a81548163ffffffff021916908363ffffffff1602179055506003600b60046101000a81548161ffff021916908361ffff16021790555060c8600b60066101000a81548163ffffffff021916908363ffffffff1602179055506000601155600060125560006013553480156200012a57600080fd5b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660405180606001604052806025815260200162004b2e6025913960405180606001604052806025815260200162004b2e6025913981600090805190602001906200019a92919062000386565b508060019080519060200190620001b392919062000386565b505050620001d6620001ca620002b860201b60201c565b620002c060201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200049b565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003949062000436565b90600052602060002090601f016020900481019282620003b8576000855562000404565b82601f10620003d357805160ff191683800117855562000404565b8280016001018555821562000404579182015b8281111562000403578251825591602001919060010190620003e6565b5b50905062000413919062000417565b5090565b5b808211156200043257600081600090555060010162000418565b5090565b600060028204905060018216806200044f57607f821691505b602082108114156200046657620004656200046c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160601c61466d620004c160003960008181610ae20152610b36015261466d6000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c8063817c07dc1161010f578063be0896ea116100a2578063e89e106a11610071578063e89e106a1461057a578063e985e9c514610598578063f2fde38b146105c8578063f6eaffc8146105e4576101e5565b8063be0896ea146104f4578063c87b56dd14610524578063d204c45e14610554578063e0c8628914610570576101e5565b8063a22cb465116100de578063a22cb46514610482578063b1cc9c461461049e578063b71e785b146104bc578063b88d4fde146104d8576101e5565b8063817c07dc1461040e5780638da5cb5b1461042a57806395d89b4114610448578063a166b4b114610466576101e5565b80631fe543e3116101875780636352211e116101565780636352211e1461038657806363c11bb8146103b657806370a08231146103d4578063715018a614610404576101e5565b80631fe543e31461030257806323b872dd1461031e578063343598081461033a57806342842e0e1461036a576101e5565b8063081812fc116101c3578063081812fc14610268578063095ea7b31461029857806317d70f7c146102b45780631cbeae5e146102d2576101e5565b806301b9d3cd146101ea57806301ffc9a71461021a57806306fdde031461024a575b600080fd5b61020460048036038101906101ff91906132e7565b610614565b6040516102119190613ad8565b60405180910390f35b610234600480360381019061022f9190613183565b610796565b60405161024191906137c8565b60405180910390f35b610252610878565b60405161025f9190613836565b60405180910390f35b610282600480360381019061027d9190613241565b61090a565b60405161028f919061370f565b60405180910390f35b6102b260048036038101906102ad9190613106565b61098f565b005b6102bc610aa7565b6040516102c99190613ad8565b60405180910390f35b6102ec60048036038101906102e79190613241565b610aad565b6040516102f9919061370f565b60405180910390f35b61031c60048036038101906103179190613293565b610ae0565b005b61033860048036038101906103339190612fac565b610ba0565b005b610354600480360381019061034f91906131d5565b610c00565b60405161036191906137c8565b60405180910390f35b610384600480360381019061037f9190612fac565b610d1a565b005b6103a0600480360381019061039b9190613241565b610d3a565b6040516103ad919061370f565b60405180910390f35b6103be610dec565b6040516103cb9190613ad8565b60405180910390f35b6103ee60048036038101906103e99190612f47565b610df2565b6040516103fb9190613ad8565b60405180910390f35b61040c610eaa565b005b61042860048036038101906104239190613142565b610f32565b005b610432611085565b60405161043f919061370f565b60405180910390f35b6104506110af565b60405161045d9190613836565b60405180910390f35b610480600480360381019061047b9190613142565b611141565b005b61049c60048036038101906104979190613076565b61128c565b005b6104a66112a2565b6040516104b39190613ad8565b60405180910390f35b6104d660048036038101906104d19190613241565b6112a8565b005b6104f260048036038101906104ed9190612ffb565b611629565b005b61050e60048036038101906105099190613241565b61168b565b60405161051b919061370f565b60405180910390f35b61053e60048036038101906105399190613241565b6116be565b60405161054b9190613836565b60405180910390f35b61056e600480360381019061056991906130b2565b6116d0565b005b610578611780565b005b610582611905565b60405161058f9190613ad8565b60405180910390f35b6105b260048036038101906105ad9190612f70565b61190b565b6040516105bf91906137c8565b60405180910390f35b6105e260048036038101906105dd9190612f47565b61199f565b005b6105fe60048036038101906105f99190613241565b611a97565b60405161060b9190613ad8565b60405180910390f35b600061061e611abb565b73ffffffffffffffffffffffffffffffffffffffff1661063c611085565b73ffffffffffffffffffffffffffffffffffffffff1614610692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068990613a58565b60405180910390fd5b60006106a984436106a39190613d27565b40611ac3565b60ff169050600084426106bc9190613c6b565b826106c79190613ccd565b90506000600c805490501180156107245750600c8481548110610713577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015460145414155b1561077857600c8481548110610763577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806014819055505b6000601354826107889190613f64565b905080935050505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610871575061087082611bf3565b5b9050919050565b60606000805461088790613eb8565b80601f01602080910402602001604051908101604052809291908181526020018280546108b390613eb8565b80156109005780601f106108d557610100808354040283529160200191610900565b820191906000526020600020905b8154815290600101906020018083116108e357829003601f168201915b5050505050905090565b600061091582611c5d565b610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b90613a38565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061099a82610d3a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0290613a98565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a2a611abb565b73ffffffffffffffffffffffffffffffffffffffff161480610a595750610a5881610a53611abb565b61190b565b5b610a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8f90613958565b60405180910390fd5b610aa28383611cc9565b505050565b60125481565b600f6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b9257337f00000000000000000000000000000000000000000000000000000000000000006040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610b8992919061372a565b60405180910390fd5b610b9c8282611d82565b5050565b610bb1610bab611abb565b82611d9d565b610bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be790613ab8565b60405180910390fd5b610bfb838383611e7b565b505050565b60008151835114610c145760009050610d14565b60005b8351811015610d0e57828181518110610c59577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110610cbf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610cfb576000915050610d14565b8080610d0690613f1b565b915050610c17565b50600190505b92915050565b610d3583838360405180602001604052806000815250611629565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda90613998565b60405180910390fd5b80915050919050565b60135481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a90613978565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610eb2611abb565b73ffffffffffffffffffffffffffffffffffffffff16610ed0611085565b73ffffffffffffffffffffffffffffffffffffffff1614610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90613a58565b60405180910390fd5b610f3060006120e2565b565b610f3a611abb565b73ffffffffffffffffffffffffffffffffffffffff16610f58611085565b73ffffffffffffffffffffffffffffffffffffffff1614610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590613a58565b60405180910390fd5b600060138190555060005b815181101561108157818181518110610ffb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160106000601354815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506013600081548092919061106990613f1b565b9190505550808061107990613f1b565b915050610fb9565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546110be90613eb8565b80601f01602080910402602001604051908101604052809291908181526020018280546110ea90613eb8565b80156111375780601f1061110c57610100808354040283529160200191611137565b820191906000526020600020905b81548152906001019060200180831161111a57829003601f168201915b5050505050905090565b611149611abb565b73ffffffffffffffffffffffffffffffffffffffff16611167611085565b73ffffffffffffffffffffffffffffffffffffffff16146111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b490613a58565b60405180910390fd5b60005b815181101561128857818181518110611202577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160106000601354815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506013600081548092919061127090613f1b565b9190505550808061128090613f1b565b9150506111c0565b5050565b61129e611297611abb565b83836121a8565b5050565b60115481565b6112b0611abb565b73ffffffffffffffffffffffffffffffffffffffff166112ce611085565b73ffffffffffffffffffffffffffffffffffffffff1614611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90613a58565b60405180910390fd5b61132c611780565b611334612bb9565b60008060019050600084905060008060008711611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d90613878565b60405180910390fd5b60135487106113ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c1906139f8565b60405180910390fd5b60005b8781101561161f575b8415611608576000945083806113eb90613f1b565b9450506113f88482610614565b92507f5223dba0c56ba000393176c685a273f2bbfc0ff7fd7caf239b16efdbfdfa40c0836040516114299190613ad8565b60405180910390a16010600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060005b6103e88110156114d2578388826103e881106114af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015114156114bf57600195505b80806114ca90613f1b565b91505061146a565b5084611603577f5b8e92a4f84440a6110b8a78bb4f23116277fafcfc2e7be9dee4f1a360c2d7c1828460405161150992919061379f565b60405180910390a16010600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f6000601154815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601160008154809291906115ab90613f1b565b91905055508287876103e881106115eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201818152505085806115ff90613f1b565b9650505b6113d6565b60019450808061161790613f1b565b9150506113cd565b5050505050505050565b61163a611634611abb565b83611d9d565b611679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167090613ab8565b60405180910390fd5b61168584848484612315565b50505050565b60106020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606116c982612371565b9050919050565b6116d8611abb565b73ffffffffffffffffffffffffffffffffffffffff166116f6611085565b73ffffffffffffffffffffffffffffffffffffffff161461174c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174390613a58565b60405180910390fd5b611758826012546124c3565b611764601254826124e1565b6012600081548092919061177790613f1b565b91905055505050565b611788611abb565b73ffffffffffffffffffffffffffffffffffffffff166117a6611085565b73ffffffffffffffffffffffffffffffffffffffff16146117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f390613a58565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600a54600860149054906101000a900467ffffffffffffffff16600b60049054906101000a900461ffff16600b60009054906101000a900463ffffffff16600b60069054906101000a900463ffffffff166040518663ffffffff1660e01b81526004016118ab9594939291906137e3565b602060405180830381600087803b1580156118c557600080fd5b505af11580156118d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fd919061326a565b600d81905550565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119a7611abb565b73ffffffffffffffffffffffffffffffffffffffff166119c5611085565b73ffffffffffffffffffffffffffffffffffffffff1614611a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1290613a58565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8290613898565b60405180910390fd5b611a94816120e2565b50565b600c8181548110611aa757600080fd5b906000526020600020016000915090505481565b600033905090565b60008060016020611ad49190613d5b565b90505b60008160ff1610611be85760006010848360ff1660208110611b22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b60f81c611b339190613f95565b905060008160ff16118015611b4b5750600a8160ff16105b15611b5a578092505050611bee565b60006010858460ff1660208110611b9a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b60f81c611bab9190613c9c565b905060008160ff16118015611bc35750600a8160ff16105b15611bd357809350505050611bee565b50508080611be090613e8e565b915050611ad7565b50600190505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d3c83610d3a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80600c9080519060200190611d98929190612bdd565b505050565b6000611da882611c5d565b611de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dde90613938565b60405180910390fd5b6000611df283610d3a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e345750611e33818561190b565b5b80611e7257508373ffffffffffffffffffffffffffffffffffffffff16611e5a8461090a565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e9b82610d3a565b73ffffffffffffffffffffffffffffffffffffffff1614611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee8906138b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f58906138f8565b60405180910390fd5b611f6c838383612555565b611f77600082611cc9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fc79190613d27565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461201e9190613c15565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120dd83838361255a565b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220e90613918565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161230891906137c8565b60405180910390a3505050565b612320848484611e7b565b61232c8484848461255f565b61236b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236290613858565b60405180910390fd5b50505050565b606061237c82611c5d565b6123bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b290613a18565b60405180910390fd5b60006006600084815260200190815260200160002080546123db90613eb8565b80601f016020809104026020016040519081016040528092919081815260200182805461240790613eb8565b80156124545780601f1061242957610100808354040283529160200191612454565b820191906000526020600020905b81548152906001019060200180831161243757829003601f168201915b5050505050905060006124656126f6565b905060008151141561247b5781925050506124be565b6000825111156124b05780826040516020016124989291906136eb565b604051602081830303815290604052925050506124be565b6124b98461270d565b925050505b919050565b6124dd8282604051806020016040528060008152506127b4565b5050565b6124ea82611c5d565b612529576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612520906139b8565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190612550929190612c2a565b505050565b505050565b505050565b60006125808473ffffffffffffffffffffffffffffffffffffffff1661280f565b156126e9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125a9611abb565b8786866040518563ffffffff1660e01b81526004016125cb9493929190613753565b602060405180830381600087803b1580156125e557600080fd5b505af192505050801561261657506040513d601f19601f8201168201806040525081019061261391906131ac565b60015b612699573d8060008114612646576040519150601f19603f3d011682016040523d82523d6000602084013e61264b565b606091505b50600081511415612691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268890613858565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126ee565b600190505b949350505050565b606060405180602001604052806000815250905090565b606061271882611c5d565b612757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274e90613a78565b60405180910390fd5b60006127616126f6565b9050600081511161278157604051806020016040528060008152506127ac565b8061278b84612832565b60405160200161279c9291906136eb565b6040516020818303038152906040525b915050919050565b6127be83836129df565b6127cb600084848461255f565b61280a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280190613858565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060600082141561287a576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129da565b600082905060005b600082146128ac57808061289590613f1b565b915050600a826128a59190613c6b565b9150612882565b60008167ffffffffffffffff8111156128ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129205781602001600182028036833780820191505090505b5090505b600085146129d3576001826129399190613d27565b9150600a856129489190613f64565b60306129549190613c15565b60f81b818381518110612990577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129cc9190613c6b565b9450612924565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a46906139d8565b60405180910390fd5b612a5881611c5d565b15612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f906138d8565b60405180910390fd5b612aa460008383612555565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612af49190613c15565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bb56000838361255a565b5050565b60405180617d0001604052806103e890602082028036833780820191505090505090565b828054828255906000526020600020908101928215612c19579160200282015b82811115612c18578251825591602001919060010190612bfd565b5b509050612c269190612cb0565b5090565b828054612c3690613eb8565b90600052602060002090601f016020900481019282612c585760008555612c9f565b82601f10612c7157805160ff1916838001178555612c9f565b82800160010185558215612c9f579182015b82811115612c9e578251825591602001919060010190612c83565b5b509050612cac9190612cb0565b5090565b5b80821115612cc9576000816000905550600101612cb1565b5090565b6000612ce0612cdb84613b18565b613af3565b90508083825260208201905082856020860282011115612cff57600080fd5b60005b85811015612d2f5781612d158882612e21565b845260208401935060208301925050600181019050612d02565b5050509392505050565b6000612d4c612d4784613b44565b613af3565b90508083825260208201905082856020860282011115612d6b57600080fd5b60005b85811015612d9b5781612d818882612f1d565b845260208401935060208301925050600181019050612d6e565b5050509392505050565b6000612db8612db384613b70565b613af3565b905082815260208101848484011115612dd057600080fd5b612ddb848285613e4c565b509392505050565b6000612df6612df184613ba1565b613af3565b905082815260208101848484011115612e0e57600080fd5b612e19848285613e4c565b509392505050565b600081359050612e30816145db565b92915050565b600082601f830112612e4757600080fd5b8135612e57848260208601612ccd565b91505092915050565b600082601f830112612e7157600080fd5b8135612e81848260208601612d39565b91505092915050565b600081359050612e99816145f2565b92915050565b600081359050612eae81614609565b92915050565b600081519050612ec381614609565b92915050565b600082601f830112612eda57600080fd5b8135612eea848260208601612da5565b91505092915050565b600082601f830112612f0457600080fd5b8135612f14848260208601612de3565b91505092915050565b600081359050612f2c81614620565b92915050565b600081519050612f4181614620565b92915050565b600060208284031215612f5957600080fd5b6000612f6784828501612e21565b91505092915050565b60008060408385031215612f8357600080fd5b6000612f9185828601612e21565b9250506020612fa285828601612e21565b9150509250929050565b600080600060608486031215612fc157600080fd5b6000612fcf86828701612e21565b9350506020612fe086828701612e21565b9250506040612ff186828701612f1d565b9150509250925092565b6000806000806080858703121561301157600080fd5b600061301f87828801612e21565b945050602061303087828801612e21565b935050604061304187828801612f1d565b925050606085013567ffffffffffffffff81111561305e57600080fd5b61306a87828801612ec9565b91505092959194509250565b6000806040838503121561308957600080fd5b600061309785828601612e21565b92505060206130a885828601612e8a565b9150509250929050565b600080604083850312156130c557600080fd5b60006130d385828601612e21565b925050602083013567ffffffffffffffff8111156130f057600080fd5b6130fc85828601612ef3565b9150509250929050565b6000806040838503121561311957600080fd5b600061312785828601612e21565b925050602061313885828601612f1d565b9150509250929050565b60006020828403121561315457600080fd5b600082013567ffffffffffffffff81111561316e57600080fd5b61317a84828501612e36565b91505092915050565b60006020828403121561319557600080fd5b60006131a384828501612e9f565b91505092915050565b6000602082840312156131be57600080fd5b60006131cc84828501612eb4565b91505092915050565b600080604083850312156131e857600080fd5b600083013567ffffffffffffffff81111561320257600080fd5b61320e85828601612ec9565b925050602083013567ffffffffffffffff81111561322b57600080fd5b61323785828601612ec9565b9150509250929050565b60006020828403121561325357600080fd5b600061326184828501612f1d565b91505092915050565b60006020828403121561327c57600080fd5b600061328a84828501612f32565b91505092915050565b600080604083850312156132a657600080fd5b60006132b485828601612f1d565b925050602083013567ffffffffffffffff8111156132d157600080fd5b6132dd85828601612e60565b9150509250929050565b600080604083850312156132fa57600080fd5b600061330885828601612f1d565b925050602061331985828601612f1d565b9150509250929050565b61332c81613d8f565b82525050565b61333b81613da1565b82525050565b61334a81613dad565b82525050565b600061335b82613bd2565b6133658185613be8565b9350613375818560208601613e5b565b61337e81614082565b840191505092915050565b600061339482613bdd565b61339e8185613bf9565b93506133ae818560208601613e5b565b6133b781614082565b840191505092915050565b60006133cd82613bdd565b6133d78185613c0a565b93506133e7818560208601613e5b565b80840191505092915050565b6000613400603283613bf9565b915061340b82614093565b604082019050919050565b6000613423601283613bf9565b915061342e826140e2565b602082019050919050565b6000613446602683613bf9565b91506134518261410b565b604082019050919050565b6000613469602583613bf9565b91506134748261415a565b604082019050919050565b600061348c601c83613bf9565b9150613497826141a9565b602082019050919050565b60006134af602483613bf9565b91506134ba826141d2565b604082019050919050565b60006134d2601983613bf9565b91506134dd82614221565b602082019050919050565b60006134f5602c83613bf9565b91506135008261424a565b604082019050919050565b6000613518603883613bf9565b915061352382614299565b604082019050919050565b600061353b602a83613bf9565b9150613546826142e8565b604082019050919050565b600061355e602983613bf9565b915061356982614337565b604082019050919050565b6000613581602e83613bf9565b915061358c82614386565b604082019050919050565b60006135a4602083613bf9565b91506135af826143d5565b602082019050919050565b60006135c7601f83613bf9565b91506135d2826143fe565b602082019050919050565b60006135ea603183613bf9565b91506135f582614427565b604082019050919050565b600061360d602c83613bf9565b915061361882614476565b604082019050919050565b6000613630602083613bf9565b915061363b826144c5565b602082019050919050565b6000613653602f83613bf9565b915061365e826144ee565b604082019050919050565b6000613676602183613bf9565b91506136818261453d565b604082019050919050565b6000613699603183613bf9565b91506136a48261458c565b604082019050919050565b6136b881613de3565b82525050565b6136c781613e11565b82525050565b6136d681613e1b565b82525050565b6136e581613e2b565b82525050565b60006136f782856133c2565b915061370382846133c2565b91508190509392505050565b60006020820190506137246000830184613323565b92915050565b600060408201905061373f6000830185613323565b61374c6020830184613323565b9392505050565b60006080820190506137686000830187613323565b6137756020830186613323565b61378260408301856136be565b81810360608301526137948184613350565b905095945050505050565b60006040820190506137b46000830185613323565b6137c160208301846136be565b9392505050565b60006020820190506137dd6000830184613332565b92915050565b600060a0820190506137f86000830188613341565b61380560208301876136dc565b61381260408301866136af565b61381f60608301856136cd565b61382c60808301846136cd565b9695505050505050565b600060208201905081810360008301526138508184613389565b905092915050565b60006020820190508181036000830152613871816133f3565b9050919050565b6000602082019050818103600083015261389181613416565b9050919050565b600060208201905081810360008301526138b181613439565b9050919050565b600060208201905081810360008301526138d18161345c565b9050919050565b600060208201905081810360008301526138f18161347f565b9050919050565b60006020820190508181036000830152613911816134a2565b9050919050565b60006020820190508181036000830152613931816134c5565b9050919050565b60006020820190508181036000830152613951816134e8565b9050919050565b600060208201905081810360008301526139718161350b565b9050919050565b600060208201905081810360008301526139918161352e565b9050919050565b600060208201905081810360008301526139b181613551565b9050919050565b600060208201905081810360008301526139d181613574565b9050919050565b600060208201905081810360008301526139f181613597565b9050919050565b60006020820190508181036000830152613a11816135ba565b9050919050565b60006020820190508181036000830152613a31816135dd565b9050919050565b60006020820190508181036000830152613a5181613600565b9050919050565b60006020820190508181036000830152613a7181613623565b9050919050565b60006020820190508181036000830152613a9181613646565b9050919050565b60006020820190508181036000830152613ab181613669565b9050919050565b60006020820190508181036000830152613ad18161368c565b9050919050565b6000602082019050613aed60008301846136be565b92915050565b6000613afd613b0e565b9050613b098282613eea565b919050565b6000604051905090565b600067ffffffffffffffff821115613b3357613b32614053565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b5f57613b5e614053565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b8b57613b8a614053565b5b613b9482614082565b9050602081019050919050565b600067ffffffffffffffff821115613bbc57613bbb614053565b5b613bc582614082565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c2082613e11565b9150613c2b83613e11565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6057613c5f613fc6565b5b828201905092915050565b6000613c7682613e11565b9150613c8183613e11565b925082613c9157613c90613ff5565b5b828204905092915050565b6000613ca782613e3f565b9150613cb283613e3f565b925082613cc257613cc1613ff5565b5b828204905092915050565b6000613cd882613e11565b9150613ce383613e11565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d1c57613d1b613fc6565b5b828202905092915050565b6000613d3282613e11565b9150613d3d83613e11565b925082821015613d5057613d4f613fc6565b5b828203905092915050565b6000613d6682613e3f565b9150613d7183613e3f565b925082821015613d8457613d83613fc6565b5b828203905092915050565b6000613d9a82613df1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613e79578082015181840152602081019050613e5e565b83811115613e88576000848401525b50505050565b6000613e9982613e3f565b91506000821415613ead57613eac613fc6565b5b600182039050919050565b60006002820490506001821680613ed057607f821691505b60208210811415613ee457613ee3614024565b5b50919050565b613ef382614082565b810181811067ffffffffffffffff82111715613f1257613f11614053565b5b80604052505050565b6000613f2682613e11565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f5957613f58613fc6565b5b600182019050919050565b6000613f6f82613e11565b9150613f7a83613e11565b925082613f8a57613f89613ff5565b5b828206905092915050565b6000613fa082613e3f565b9150613fab83613e3f565b925082613fbb57613fba613ff5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d757374206d6f7265207468616e206f6e650000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4d757374206c657373207468616e207061727469636970616e74206e756d7300600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6145e481613d8f565b81146145ef57600080fd5b50565b6145fb81613da1565b811461460657600080fd5b50565b61461281613db7565b811461461d57600080fd5b50565b61462981613e11565b811461463457600080fd5b5056fea264697066735822122063323ac57d60f207b0761248ab47a92d7291d7915f2906dd74af70387291b1b764736f6c634300080400334d6f6a6f72204561726c792042697264205469636b6574202d2057616974696e676c697374

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101e55760003560e01c8063817c07dc1161010f578063be0896ea116100a2578063e89e106a11610071578063e89e106a1461057a578063e985e9c514610598578063f2fde38b146105c8578063f6eaffc8146105e4576101e5565b8063be0896ea146104f4578063c87b56dd14610524578063d204c45e14610554578063e0c8628914610570576101e5565b8063a22cb465116100de578063a22cb46514610482578063b1cc9c461461049e578063b71e785b146104bc578063b88d4fde146104d8576101e5565b8063817c07dc1461040e5780638da5cb5b1461042a57806395d89b4114610448578063a166b4b114610466576101e5565b80631fe543e3116101875780636352211e116101565780636352211e1461038657806363c11bb8146103b657806370a08231146103d4578063715018a614610404576101e5565b80631fe543e31461030257806323b872dd1461031e578063343598081461033a57806342842e0e1461036a576101e5565b8063081812fc116101c3578063081812fc14610268578063095ea7b31461029857806317d70f7c146102b45780631cbeae5e146102d2576101e5565b806301b9d3cd146101ea57806301ffc9a71461021a57806306fdde031461024a575b600080fd5b61020460048036038101906101ff91906132e7565b610614565b6040516102119190613ad8565b60405180910390f35b610234600480360381019061022f9190613183565b610796565b60405161024191906137c8565b60405180910390f35b610252610878565b60405161025f9190613836565b60405180910390f35b610282600480360381019061027d9190613241565b61090a565b60405161028f919061370f565b60405180910390f35b6102b260048036038101906102ad9190613106565b61098f565b005b6102bc610aa7565b6040516102c99190613ad8565b60405180910390f35b6102ec60048036038101906102e79190613241565b610aad565b6040516102f9919061370f565b60405180910390f35b61031c60048036038101906103179190613293565b610ae0565b005b61033860048036038101906103339190612fac565b610ba0565b005b610354600480360381019061034f91906131d5565b610c00565b60405161036191906137c8565b60405180910390f35b610384600480360381019061037f9190612fac565b610d1a565b005b6103a0600480360381019061039b9190613241565b610d3a565b6040516103ad919061370f565b60405180910390f35b6103be610dec565b6040516103cb9190613ad8565b60405180910390f35b6103ee60048036038101906103e99190612f47565b610df2565b6040516103fb9190613ad8565b60405180910390f35b61040c610eaa565b005b61042860048036038101906104239190613142565b610f32565b005b610432611085565b60405161043f919061370f565b60405180910390f35b6104506110af565b60405161045d9190613836565b60405180910390f35b610480600480360381019061047b9190613142565b611141565b005b61049c60048036038101906104979190613076565b61128c565b005b6104a66112a2565b6040516104b39190613ad8565b60405180910390f35b6104d660048036038101906104d19190613241565b6112a8565b005b6104f260048036038101906104ed9190612ffb565b611629565b005b61050e60048036038101906105099190613241565b61168b565b60405161051b919061370f565b60405180910390f35b61053e60048036038101906105399190613241565b6116be565b60405161054b9190613836565b60405180910390f35b61056e600480360381019061056991906130b2565b6116d0565b005b610578611780565b005b610582611905565b60405161058f9190613ad8565b60405180910390f35b6105b260048036038101906105ad9190612f70565b61190b565b6040516105bf91906137c8565b60405180910390f35b6105e260048036038101906105dd9190612f47565b61199f565b005b6105fe60048036038101906105f99190613241565b611a97565b60405161060b9190613ad8565b60405180910390f35b600061061e611abb565b73ffffffffffffffffffffffffffffffffffffffff1661063c611085565b73ffffffffffffffffffffffffffffffffffffffff1614610692576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068990613a58565b60405180910390fd5b60006106a984436106a39190613d27565b40611ac3565b60ff169050600084426106bc9190613c6b565b826106c79190613ccd565b90506000600c805490501180156107245750600c8481548110610713577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015460145414155b1561077857600c8481548110610763577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806014819055505b6000601354826107889190613f64565b905080935050505092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610871575061087082611bf3565b5b9050919050565b60606000805461088790613eb8565b80601f01602080910402602001604051908101604052809291908181526020018280546108b390613eb8565b80156109005780601f106108d557610100808354040283529160200191610900565b820191906000526020600020905b8154815290600101906020018083116108e357829003601f168201915b5050505050905090565b600061091582611c5d565b610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b90613a38565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061099a82610d3a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0290613a98565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a2a611abb565b73ffffffffffffffffffffffffffffffffffffffff161480610a595750610a5881610a53611abb565b61190b565b5b610a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8f90613958565b60405180910390fd5b610aa28383611cc9565b505050565b60125481565b600f6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000ae975071be8f8ee67addbc1a82488f1c2485806773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b9257337f000000000000000000000000ae975071be8f8ee67addbc1a82488f1c248580676040517f1cf993f4000000000000000000000000000000000000000000000000000000008152600401610b8992919061372a565b60405180910390fd5b610b9c8282611d82565b5050565b610bb1610bab611abb565b82611d9d565b610bf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be790613ab8565b60405180910390fd5b610bfb838383611e7b565b505050565b60008151835114610c145760009050610d14565b60005b8351811015610d0e57828181518110610c59577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848281518110610cbf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610cfb576000915050610d14565b8080610d0690613f1b565b915050610c17565b50600190505b92915050565b610d3583838360405180602001604052806000815250611629565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dda90613998565b60405180910390fd5b80915050919050565b60135481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5a90613978565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610eb2611abb565b73ffffffffffffffffffffffffffffffffffffffff16610ed0611085565b73ffffffffffffffffffffffffffffffffffffffff1614610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90613a58565b60405180910390fd5b610f3060006120e2565b565b610f3a611abb565b73ffffffffffffffffffffffffffffffffffffffff16610f58611085565b73ffffffffffffffffffffffffffffffffffffffff1614610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590613a58565b60405180910390fd5b600060138190555060005b815181101561108157818181518110610ffb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160106000601354815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506013600081548092919061106990613f1b565b9190505550808061107990613f1b565b915050610fb9565b5050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546110be90613eb8565b80601f01602080910402602001604051908101604052809291908181526020018280546110ea90613eb8565b80156111375780601f1061110c57610100808354040283529160200191611137565b820191906000526020600020905b81548152906001019060200180831161111a57829003601f168201915b5050505050905090565b611149611abb565b73ffffffffffffffffffffffffffffffffffffffff16611167611085565b73ffffffffffffffffffffffffffffffffffffffff16146111bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b490613a58565b60405180910390fd5b60005b815181101561128857818181518110611202577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160106000601354815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506013600081548092919061127090613f1b565b9190505550808061128090613f1b565b9150506111c0565b5050565b61129e611297611abb565b83836121a8565b5050565b60115481565b6112b0611abb565b73ffffffffffffffffffffffffffffffffffffffff166112ce611085565b73ffffffffffffffffffffffffffffffffffffffff1614611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b90613a58565b60405180910390fd5b61132c611780565b611334612bb9565b60008060019050600084905060008060008711611386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137d90613878565b60405180910390fd5b60135487106113ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c1906139f8565b60405180910390fd5b60005b8781101561161f575b8415611608576000945083806113eb90613f1b565b9450506113f88482610614565b92507f5223dba0c56ba000393176c685a273f2bbfc0ff7fd7caf239b16efdbfdfa40c0836040516114299190613ad8565b60405180910390a16010600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060005b6103e88110156114d2578388826103e881106114af577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015114156114bf57600195505b80806114ca90613f1b565b91505061146a565b5084611603577f5b8e92a4f84440a6110b8a78bb4f23116277fafcfc2e7be9dee4f1a360c2d7c1828460405161150992919061379f565b60405180910390a16010600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f6000601154815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601160008154809291906115ab90613f1b565b91905055508287876103e881106115eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201818152505085806115ff90613f1b565b9650505b6113d6565b60019450808061161790613f1b565b9150506113cd565b5050505050505050565b61163a611634611abb565b83611d9d565b611679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167090613ab8565b60405180910390fd5b61168584848484612315565b50505050565b60106020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60606116c982612371565b9050919050565b6116d8611abb565b73ffffffffffffffffffffffffffffffffffffffff166116f6611085565b73ffffffffffffffffffffffffffffffffffffffff161461174c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174390613a58565b60405180910390fd5b611758826012546124c3565b611764601254826124e1565b6012600081548092919061177790613f1b565b91905055505050565b611788611abb565b73ffffffffffffffffffffffffffffffffffffffff166117a6611085565b73ffffffffffffffffffffffffffffffffffffffff16146117fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f390613a58565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600a54600860149054906101000a900467ffffffffffffffff16600b60049054906101000a900461ffff16600b60009054906101000a900463ffffffff16600b60069054906101000a900463ffffffff166040518663ffffffff1660e01b81526004016118ab9594939291906137e3565b602060405180830381600087803b1580156118c557600080fd5b505af11580156118d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118fd919061326a565b600d81905550565b600d5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119a7611abb565b73ffffffffffffffffffffffffffffffffffffffff166119c5611085565b73ffffffffffffffffffffffffffffffffffffffff1614611a1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1290613a58565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8290613898565b60405180910390fd5b611a94816120e2565b50565b600c8181548110611aa757600080fd5b906000526020600020016000915090505481565b600033905090565b60008060016020611ad49190613d5b565b90505b60008160ff1610611be85760006010848360ff1660208110611b22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b60f81c611b339190613f95565b905060008160ff16118015611b4b5750600a8160ff16105b15611b5a578092505050611bee565b60006010858460ff1660208110611b9a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b60f81c611bab9190613c9c565b905060008160ff16118015611bc35750600a8160ff16105b15611bd357809350505050611bee565b50508080611be090613e8e565b915050611ad7565b50600190505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d3c83610d3a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80600c9080519060200190611d98929190612bdd565b505050565b6000611da882611c5d565b611de7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dde90613938565b60405180910390fd5b6000611df283610d3a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e345750611e33818561190b565b5b80611e7257508373ffffffffffffffffffffffffffffffffffffffff16611e5a8461090a565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e9b82610d3a565b73ffffffffffffffffffffffffffffffffffffffff1614611ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ee8906138b8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f58906138f8565b60405180910390fd5b611f6c838383612555565b611f77600082611cc9565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fc79190613d27565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461201e9190613c15565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46120dd83838361255a565b505050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612217576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220e90613918565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161230891906137c8565b60405180910390a3505050565b612320848484611e7b565b61232c8484848461255f565b61236b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236290613858565b60405180910390fd5b50505050565b606061237c82611c5d565b6123bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b290613a18565b60405180910390fd5b60006006600084815260200190815260200160002080546123db90613eb8565b80601f016020809104026020016040519081016040528092919081815260200182805461240790613eb8565b80156124545780601f1061242957610100808354040283529160200191612454565b820191906000526020600020905b81548152906001019060200180831161243757829003601f168201915b5050505050905060006124656126f6565b905060008151141561247b5781925050506124be565b6000825111156124b05780826040516020016124989291906136eb565b604051602081830303815290604052925050506124be565b6124b98461270d565b925050505b919050565b6124dd8282604051806020016040528060008152506127b4565b5050565b6124ea82611c5d565b612529576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612520906139b8565b60405180910390fd5b80600660008481526020019081526020016000209080519060200190612550929190612c2a565b505050565b505050565b505050565b60006125808473ffffffffffffffffffffffffffffffffffffffff1661280f565b156126e9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125a9611abb565b8786866040518563ffffffff1660e01b81526004016125cb9493929190613753565b602060405180830381600087803b1580156125e557600080fd5b505af192505050801561261657506040513d601f19601f8201168201806040525081019061261391906131ac565b60015b612699573d8060008114612646576040519150601f19603f3d011682016040523d82523d6000602084013e61264b565b606091505b50600081511415612691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268890613858565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126ee565b600190505b949350505050565b606060405180602001604052806000815250905090565b606061271882611c5d565b612757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274e90613a78565b60405180910390fd5b60006127616126f6565b9050600081511161278157604051806020016040528060008152506127ac565b8061278b84612832565b60405160200161279c9291906136eb565b6040516020818303038152906040525b915050919050565b6127be83836129df565b6127cb600084848461255f565b61280a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161280190613858565b60405180910390fd5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6060600082141561287a576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129da565b600082905060005b600082146128ac57808061289590613f1b565b915050600a826128a59190613c6b565b9150612882565b60008167ffffffffffffffff8111156128ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156129205781602001600182028036833780820191505090505b5090505b600085146129d3576001826129399190613d27565b9150600a856129489190613f64565b60306129549190613c15565b60f81b818381518110612990577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856129cc9190613c6b565b9450612924565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a46906139d8565b60405180910390fd5b612a5881611c5d565b15612a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a8f906138d8565b60405180910390fd5b612aa460008383612555565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612af49190613c15565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bb56000838361255a565b5050565b60405180617d0001604052806103e890602082028036833780820191505090505090565b828054828255906000526020600020908101928215612c19579160200282015b82811115612c18578251825591602001919060010190612bfd565b5b509050612c269190612cb0565b5090565b828054612c3690613eb8565b90600052602060002090601f016020900481019282612c585760008555612c9f565b82601f10612c7157805160ff1916838001178555612c9f565b82800160010185558215612c9f579182015b82811115612c9e578251825591602001919060010190612c83565b5b509050612cac9190612cb0565b5090565b5b80821115612cc9576000816000905550600101612cb1565b5090565b6000612ce0612cdb84613b18565b613af3565b90508083825260208201905082856020860282011115612cff57600080fd5b60005b85811015612d2f5781612d158882612e21565b845260208401935060208301925050600181019050612d02565b5050509392505050565b6000612d4c612d4784613b44565b613af3565b90508083825260208201905082856020860282011115612d6b57600080fd5b60005b85811015612d9b5781612d818882612f1d565b845260208401935060208301925050600181019050612d6e565b5050509392505050565b6000612db8612db384613b70565b613af3565b905082815260208101848484011115612dd057600080fd5b612ddb848285613e4c565b509392505050565b6000612df6612df184613ba1565b613af3565b905082815260208101848484011115612e0e57600080fd5b612e19848285613e4c565b509392505050565b600081359050612e30816145db565b92915050565b600082601f830112612e4757600080fd5b8135612e57848260208601612ccd565b91505092915050565b600082601f830112612e7157600080fd5b8135612e81848260208601612d39565b91505092915050565b600081359050612e99816145f2565b92915050565b600081359050612eae81614609565b92915050565b600081519050612ec381614609565b92915050565b600082601f830112612eda57600080fd5b8135612eea848260208601612da5565b91505092915050565b600082601f830112612f0457600080fd5b8135612f14848260208601612de3565b91505092915050565b600081359050612f2c81614620565b92915050565b600081519050612f4181614620565b92915050565b600060208284031215612f5957600080fd5b6000612f6784828501612e21565b91505092915050565b60008060408385031215612f8357600080fd5b6000612f9185828601612e21565b9250506020612fa285828601612e21565b9150509250929050565b600080600060608486031215612fc157600080fd5b6000612fcf86828701612e21565b9350506020612fe086828701612e21565b9250506040612ff186828701612f1d565b9150509250925092565b6000806000806080858703121561301157600080fd5b600061301f87828801612e21565b945050602061303087828801612e21565b935050604061304187828801612f1d565b925050606085013567ffffffffffffffff81111561305e57600080fd5b61306a87828801612ec9565b91505092959194509250565b6000806040838503121561308957600080fd5b600061309785828601612e21565b92505060206130a885828601612e8a565b9150509250929050565b600080604083850312156130c557600080fd5b60006130d385828601612e21565b925050602083013567ffffffffffffffff8111156130f057600080fd5b6130fc85828601612ef3565b9150509250929050565b6000806040838503121561311957600080fd5b600061312785828601612e21565b925050602061313885828601612f1d565b9150509250929050565b60006020828403121561315457600080fd5b600082013567ffffffffffffffff81111561316e57600080fd5b61317a84828501612e36565b91505092915050565b60006020828403121561319557600080fd5b60006131a384828501612e9f565b91505092915050565b6000602082840312156131be57600080fd5b60006131cc84828501612eb4565b91505092915050565b600080604083850312156131e857600080fd5b600083013567ffffffffffffffff81111561320257600080fd5b61320e85828601612ec9565b925050602083013567ffffffffffffffff81111561322b57600080fd5b61323785828601612ec9565b9150509250929050565b60006020828403121561325357600080fd5b600061326184828501612f1d565b91505092915050565b60006020828403121561327c57600080fd5b600061328a84828501612f32565b91505092915050565b600080604083850312156132a657600080fd5b60006132b485828601612f1d565b925050602083013567ffffffffffffffff8111156132d157600080fd5b6132dd85828601612e60565b9150509250929050565b600080604083850312156132fa57600080fd5b600061330885828601612f1d565b925050602061331985828601612f1d565b9150509250929050565b61332c81613d8f565b82525050565b61333b81613da1565b82525050565b61334a81613dad565b82525050565b600061335b82613bd2565b6133658185613be8565b9350613375818560208601613e5b565b61337e81614082565b840191505092915050565b600061339482613bdd565b61339e8185613bf9565b93506133ae818560208601613e5b565b6133b781614082565b840191505092915050565b60006133cd82613bdd565b6133d78185613c0a565b93506133e7818560208601613e5b565b80840191505092915050565b6000613400603283613bf9565b915061340b82614093565b604082019050919050565b6000613423601283613bf9565b915061342e826140e2565b602082019050919050565b6000613446602683613bf9565b91506134518261410b565b604082019050919050565b6000613469602583613bf9565b91506134748261415a565b604082019050919050565b600061348c601c83613bf9565b9150613497826141a9565b602082019050919050565b60006134af602483613bf9565b91506134ba826141d2565b604082019050919050565b60006134d2601983613bf9565b91506134dd82614221565b602082019050919050565b60006134f5602c83613bf9565b91506135008261424a565b604082019050919050565b6000613518603883613bf9565b915061352382614299565b604082019050919050565b600061353b602a83613bf9565b9150613546826142e8565b604082019050919050565b600061355e602983613bf9565b915061356982614337565b604082019050919050565b6000613581602e83613bf9565b915061358c82614386565b604082019050919050565b60006135a4602083613bf9565b91506135af826143d5565b602082019050919050565b60006135c7601f83613bf9565b91506135d2826143fe565b602082019050919050565b60006135ea603183613bf9565b91506135f582614427565b604082019050919050565b600061360d602c83613bf9565b915061361882614476565b604082019050919050565b6000613630602083613bf9565b915061363b826144c5565b602082019050919050565b6000613653602f83613bf9565b915061365e826144ee565b604082019050919050565b6000613676602183613bf9565b91506136818261453d565b604082019050919050565b6000613699603183613bf9565b91506136a48261458c565b604082019050919050565b6136b881613de3565b82525050565b6136c781613e11565b82525050565b6136d681613e1b565b82525050565b6136e581613e2b565b82525050565b60006136f782856133c2565b915061370382846133c2565b91508190509392505050565b60006020820190506137246000830184613323565b92915050565b600060408201905061373f6000830185613323565b61374c6020830184613323565b9392505050565b60006080820190506137686000830187613323565b6137756020830186613323565b61378260408301856136be565b81810360608301526137948184613350565b905095945050505050565b60006040820190506137b46000830185613323565b6137c160208301846136be565b9392505050565b60006020820190506137dd6000830184613332565b92915050565b600060a0820190506137f86000830188613341565b61380560208301876136dc565b61381260408301866136af565b61381f60608301856136cd565b61382c60808301846136cd565b9695505050505050565b600060208201905081810360008301526138508184613389565b905092915050565b60006020820190508181036000830152613871816133f3565b9050919050565b6000602082019050818103600083015261389181613416565b9050919050565b600060208201905081810360008301526138b181613439565b9050919050565b600060208201905081810360008301526138d18161345c565b9050919050565b600060208201905081810360008301526138f18161347f565b9050919050565b60006020820190508181036000830152613911816134a2565b9050919050565b60006020820190508181036000830152613931816134c5565b9050919050565b60006020820190508181036000830152613951816134e8565b9050919050565b600060208201905081810360008301526139718161350b565b9050919050565b600060208201905081810360008301526139918161352e565b9050919050565b600060208201905081810360008301526139b181613551565b9050919050565b600060208201905081810360008301526139d181613574565b9050919050565b600060208201905081810360008301526139f181613597565b9050919050565b60006020820190508181036000830152613a11816135ba565b9050919050565b60006020820190508181036000830152613a31816135dd565b9050919050565b60006020820190508181036000830152613a5181613600565b9050919050565b60006020820190508181036000830152613a7181613623565b9050919050565b60006020820190508181036000830152613a9181613646565b9050919050565b60006020820190508181036000830152613ab181613669565b9050919050565b60006020820190508181036000830152613ad18161368c565b9050919050565b6000602082019050613aed60008301846136be565b92915050565b6000613afd613b0e565b9050613b098282613eea565b919050565b6000604051905090565b600067ffffffffffffffff821115613b3357613b32614053565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b5f57613b5e614053565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b8b57613b8a614053565b5b613b9482614082565b9050602081019050919050565b600067ffffffffffffffff821115613bbc57613bbb614053565b5b613bc582614082565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c2082613e11565b9150613c2b83613e11565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c6057613c5f613fc6565b5b828201905092915050565b6000613c7682613e11565b9150613c8183613e11565b925082613c9157613c90613ff5565b5b828204905092915050565b6000613ca782613e3f565b9150613cb283613e3f565b925082613cc257613cc1613ff5565b5b828204905092915050565b6000613cd882613e11565b9150613ce383613e11565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d1c57613d1b613fc6565b5b828202905092915050565b6000613d3282613e11565b9150613d3d83613e11565b925082821015613d5057613d4f613fc6565b5b828203905092915050565b6000613d6682613e3f565b9150613d7183613e3f565b925082821015613d8457613d83613fc6565b5b828203905092915050565b6000613d9a82613df1565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613e79578082015181840152602081019050613e5e565b83811115613e88576000848401525b50505050565b6000613e9982613e3f565b91506000821415613ead57613eac613fc6565b5b600182039050919050565b60006002820490506001821680613ed057607f821691505b60208210811415613ee457613ee3614024565b5b50919050565b613ef382614082565b810181811067ffffffffffffffff82111715613f1257613f11614053565b5b80604052505050565b6000613f2682613e11565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f5957613f58613fc6565b5b600182019050919050565b6000613f6f82613e11565b9150613f7a83613e11565b925082613f8a57613f89613ff5565b5b828206905092915050565b6000613fa082613e3f565b9150613fab83613e3f565b925082613fbb57613fba613ff5565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d757374206d6f7265207468616e206f6e650000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4d757374206c657373207468616e207061727469636970616e74206e756d7300600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6145e481613d8f565b81146145ef57600080fd5b50565b6145fb81613da1565b811461460657600080fd5b50565b61461281613db7565b811461461d57600080fd5b50565b61462981613e11565b811461463457600080fd5b5056fea264697066735822122063323ac57d60f207b0761248ab47a92d7291d7915f2906dd74af70387291b1b764736f6c63430008040033

Deployed Bytecode Sourcemap

51474:5896:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54589:460;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36259:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37204:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38764:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38287:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53222:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53089:38;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6838:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39514:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56226:257;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39924:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36898:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53256:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36628:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16842:103;;;:::i;:::-;;54139:228;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16191:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37373:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54375:203;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39057:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53194:19;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55057:1155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40180:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53136:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53950:180;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53569:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56879:306;;;:::i;:::-;;52912:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39283:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17100:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52873:30;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54589:460;54658:4;16422:12;:10;:12::i;:::-;16411:23;;:7;:5;:7::i;:::-;:23;;;16403:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54674:14:::1;54689:40;54724:3;54709:12;:18;;;;:::i;:::-;54699:29;54689:9;:40::i;:::-;54674:55;;;;54740:16;54788:3;54770:15;54769:22;;;;:::i;:::-;54757:8;:35;;;;:::i;:::-;54740:52;;54829:1;54806:13;:20;;;;:24;:62;;;;;54850:13;54864:3;54850:18;;;;;;;;;;;;;;;;;;;;;;;;54834:12;;:34;;54806:62;54803:160;;;54895:13;54909:3;54895:18;;;;;;;;;;;;;;;;;;;;;;;;54884:29;;54941:10;54928:12;:23;;;;54803:160;54973:14;55001;;54988:10;:27;;;;:::i;:::-;54973:42;;55033:8;55026:15;;;;;54589:460:::0;;;;:::o;36259:305::-;36361:4;36413:25;36398:40;;;:11;:40;;;;:105;;;;36470:33;36455:48;;;:11;:48;;;;36398:105;:158;;;;36520:36;36544:11;36520:23;:36::i;:::-;36398:158;36378:178;;36259:305;;;:::o;37204:100::-;37258:13;37291:5;37284:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37204:100;:::o;38764:221::-;38840:7;38868:16;38876:7;38868;:16::i;:::-;38860:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38953:15;:24;38969:7;38953:24;;;;;;;;;;;;;;;;;;;;;38946:31;;38764:221;;;:::o;38287:411::-;38368:13;38384:23;38399:7;38384:14;:23::i;:::-;38368:39;;38432:5;38426:11;;:2;:11;;;;38418:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;38526:5;38510:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;38535:37;38552:5;38559:12;:10;:12::i;:::-;38535:16;:37::i;:::-;38510:62;38488:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;38669:21;38678:2;38682:7;38669:8;:21::i;:::-;38287:411;;;:::o;53222:21::-;;;;:::o;53089:38::-;;;;;;;;;;;;;;;;;;;;;;:::o;6838:261::-;6952:14;6938:28;;:10;:28;;;6934:111;;7010:10;7022:14;6984:53;;;;;;;;;;;;:::i;:::-;;;;;;;;6934:111;7051:42;7070:9;7081:11;7051:18;:42::i;:::-;6838:261;;:::o;39514:339::-;39709:41;39728:12;:10;:12::i;:::-;39742:7;39709:18;:41::i;:::-;39701:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;39817:28;39827:4;39833:2;39837:7;39817:9;:28::i;:::-;39514:339;;;:::o;56226:257::-;56296:4;56329:1;:8;56317:1;:8;:20;56313:38;;56346:5;56339:12;;;;56313:38;56366:6;56362:92;56382:1;:8;56378:1;:12;56362:92;;;56424:1;56426;56424:4;;;;;;;;;;;;;;;;;;;;;;;;56416:12;;;:1;56418;56416:4;;;;;;;;;;;;;;;;;;;;;;;;:12;;;;56413:29;;56437:5;56430:12;;;;;56413:29;56392:4;;;;;:::i;:::-;;;;56362:92;;;;56471:4;56464:11;;56226:257;;;;;:::o;39924:185::-;40062:39;40079:4;40085:2;40089:7;40062:39;;;;;;;;;;;;:16;:39::i;:::-;39924:185;;;:::o;36898:239::-;36970:7;36990:13;37006:7;:16;37014:7;37006:16;;;;;;;;;;;;;;;;;;;;;36990:32;;37058:1;37041:19;;:5;:19;;;;37033:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37124:5;37117:12;;;36898:239;;;:::o;53256:28::-;;;;:::o;36628:208::-;36700:7;36745:1;36728:19;;:5;:19;;;;36720:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;36812:9;:16;36822:5;36812:16;;;;;;;;;;;;;;;;36805:23;;36628:208;;;:::o;16842:103::-;16422:12;:10;:12::i;:::-;16411:23;;:7;:5;:7::i;:::-;:23;;;16403:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;16907:30:::1;16934:1;16907:18;:30::i;:::-;16842:103::o:0;54139:228::-;16422:12;:10;:12::i;:::-;16411:23;;:7;:5;:7::i;:::-;:23;;;16403:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54227:1:::1;54212:14;:16;;;;54242:6;54238:123;54253:3;:10;54251:1;:12;54238:123;;;54314:3;54318:1;54314:6;;;;;;;;;;;;;;;;;;;;;;54282:15;:31;54298:14;;54282:31;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;54334:14;;:16;;;;;;;;;:::i;:::-;;;;;;54264:3;;;;;:::i;:::-;;;;54238:123;;;;54139:228:::0;:::o;16191:87::-;16237:7;16264:6;;;;;;;;;;;16257:13;;16191:87;:::o;37373:104::-;37429:13;37462:7;37455:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37373:104;:::o;54375:203::-;16422:12;:10;:12::i;:::-;16411:23;;:7;:5;:7::i;:::-;:23;;;16403:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54453:6:::1;54449:123;54464:3;:10;54462:1;:12;54449:123;;;54525:3;54529:1;54525:6;;;;;;;;;;;;;;;;;;;;;;54493:15;:31;54509:14;;54493:31;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;54545:14;;:16;;;;;;;;;:::i;:::-;;;;;;54475:3;;;;;:::i;:::-;;;;54449:123;;;;54375:203:::0;:::o;39057:155::-;39152:52;39171:12;:10;:12::i;:::-;39185:8;39195;39152:18;:52::i;:::-;39057:155;;:::o;53194:19::-;;;;:::o;55057:1155::-;16422:12;:10;:12::i;:::-;16411:23;;:7;:5;:7::i;:::-;:23;;;16403:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55121:20:::1;:18;:20::i;:::-;55152:23;;:::i;:::-;55186:8;55207:7:::0;55215:4:::1;55207:12;;55230:7;55239:5;55230:14;;55255:13;55279::::0;55317:1:::1;55311:5;:7;55303:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;55365:14;;55359:5;:20;55351:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55429:6;55425:780;55440:5;55438:1;:7;55425:780;;;55465:707;55471:2;55465:707;;;55496:5;55493:8;;55520:4;;;;;:::i;:::-;;;;55552:21;55568:2;55571:1;55552:15;:21::i;:::-;55543:30;;55597:28;55616:8;55597:28;;;;;;:::i;:::-;;;;;;;;55651:15;:25;55667:8;55651:25;;;;;;;;;;;;;;;;;;;;;55644:32;;55729:6;55725:158;55741:12;55739:1;:14;55725:158;;;55797:8;55785:5;55791:1;55785:8;;;;;;;;;;;;;;;;;;;:20;55782:82;;;55836:4;55833:7;;55782:82;55755:3;;;;;:::i;:::-;;;;55725:158;;;;55905:2;55901:254;;55936:37;55958:5;55964:8;55936:37;;;;;;;:::i;:::-;;;;;;;;56010:15;:25;56026:8;56010:25;;;;;;;;;;;;;;;;;;;;;55996:6;:13;56003:5;;55996:13;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;56058:5;;:7;;;;;;;;;:::i;:::-;;;;;;56099:8;56088:5;56094:3;56088:10;;;;;;;;;;;;;;;;;;:19;;;::::0;::::1;56130:5;;;;;:::i;:::-;;;;55901:254;55465:707;;;56189:4;56186:7;;55446:3;;;;;:::i;:::-;;;;55425:780;;;;16482:1;;;;;;55057:1155:::0;:::o;40180:328::-;40355:41;40374:12;:10;:12::i;:::-;40388:7;40355:18;:41::i;:::-;40347:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;40461:39;40475:4;40481:2;40485:7;40494:5;40461:13;:39::i;:::-;40180:328;;;;:::o;53136:47::-;;;;;;;;;;;;;;;;;;;;;;:::o;53950:180::-;54061:13;54099:23;54114:7;54099:14;:23::i;:::-;54092:30;;53950:180;;;:::o;53569:178::-;16422:12;:10;:12::i;:::-;16411:23;;:7;:5;:7::i;:::-;:23;;;16403:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53660:22:::1;53670:2;53674:7;;53660:9;:22::i;:::-;53693:26;53706:7;;53715:3;53693:12;:26::i;:::-;53730:7;;:9;;;;;;;;;:::i;:::-;;;;;;53569:178:::0;;:::o;56879:306::-;16422:12;:10;:12::i;:::-;16411:23;;:7;:5;:7::i;:::-;:23;;;16403:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57014:11:::1;;;;;;;;;;;:30;;;57055:7;;57073:16;;;;;;;;;;;57100:20;;;;;;;;;;;57131:16;;;;;;;;;;;57158:8;;;;;;;;;;;57014:163;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57000:11;:177;;;;56879:306::o:0;52912:26::-;;;;:::o;39283:164::-;39380:4;39404:18;:25;39423:5;39404:25;;;;;;;;;;;;;;;:35;39430:8;39404:35;;;;;;;;;;;;;;;;;;;;;;;;;39397:42;;39283:164;;;;:::o;17100:201::-;16422:12;:10;:12::i;:::-;16411:23;;:7;:5;:7::i;:::-;:23;;;16403:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17209:1:::1;17189:22;;:8;:22;;;;17181:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;17265:28;17284:8;17265:18;:28::i;:::-;17100:201:::0;:::o;52873:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14915:98::-;14968:7;14995:10;14988:17;;14915:98;:::o;56491:321::-;56546:5;56568:7;56593:1;56578:12;:16;;;;:::i;:::-;56568:26;;56564:222;56600:1;56595;:6;;;56564:222;;56621:7;56649:2;56637:5;56643:1;56637:8;;;;;;;;;;;;;;;;;;;;56631:15;;:20;;;;:::i;:::-;56621:30;;56671:1;56669;:3;;;:11;;;;;56678:2;56676:1;:4;;;56669:11;56666:24;;;56689:1;56682:8;;;;;;56666:24;56705:7;56733:2;56721:5;56727:1;56721:8;;;;;;;;;;;;;;;;;;;;56715:15;;:20;;;;:::i;:::-;56705:30;;56755:1;56753;:3;;;:11;;;;;56762:2;56760:1;:4;;;56753:11;56750:24;;;56773:1;56766:8;;;;;;;56750:24;56564:222;;56602:3;;;;;:::i;:::-;;;;56564:222;;;;56803:1;56796:8;;56491:321;;;;:::o;28998:157::-;29083:4;29122:25;29107:40;;;:11;:40;;;;29100:47;;28998:157;;;:::o;42018:127::-;42083:4;42135:1;42107:30;;:7;:16;42115:7;42107:16;;;;;;;;;;;;;;;;;;;;;:30;;;;42100:37;;42018:127;;;:::o;46164:174::-;46266:2;46239:15;:24;46255:7;46239:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;46322:7;46318:2;46284:46;;46293:23;46308:7;46293:14;:23::i;:::-;46284:46;;;;;;;;;;;;46164:174;;:::o;57193:172::-;57346:11;57330:13;:27;;;;;;;;;;;;:::i;:::-;;57193:172;;:::o;42312:348::-;42405:4;42430:16;42438:7;42430;:16::i;:::-;42422:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42506:13;42522:23;42537:7;42522:14;:23::i;:::-;42506:39;;42575:5;42564:16;;:7;:16;;;:52;;;;42584:32;42601:5;42608:7;42584:16;:32::i;:::-;42564:52;:87;;;;42644:7;42620:31;;:20;42632:7;42620:11;:20::i;:::-;:31;;;42564:87;42556:96;;;42312:348;;;;:::o;45421:625::-;45580:4;45553:31;;:23;45568:7;45553:14;:23::i;:::-;:31;;;45545:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;45659:1;45645:16;;:2;:16;;;;45637:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45715:39;45736:4;45742:2;45746:7;45715:20;:39::i;:::-;45819:29;45836:1;45840:7;45819:8;:29::i;:::-;45880:1;45861:9;:15;45871:4;45861:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;45909:1;45892:9;:13;45902:2;45892:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;45940:2;45921:7;:16;45929:7;45921:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;45979:7;45975:2;45960:27;;45969:4;45960:27;;;;;;;;;;;;46000:38;46020:4;46026:2;46030:7;46000:19;:38::i;:::-;45421:625;;;:::o;17461:191::-;17535:16;17554:6;;;;;;;;;;;17535:25;;17580:8;17571:6;;:17;;;;;;;;;;;;;;;;;;17635:8;17604:40;;17625:8;17604:40;;;;;;;;;;;;17461:191;;:::o;46480:315::-;46635:8;46626:17;;:5;:17;;;;46618:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;46722:8;46684:18;:25;46703:5;46684:25;;;;;;;;;;;;;;;:35;46710:8;46684:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;46768:8;46746:41;;46761:5;46746:41;;;46778:8;46746:41;;;;;;:::i;:::-;;;;;;;;46480:315;;;:::o;41390:::-;41547:28;41557:4;41563:2;41567:7;41547:9;:28::i;:::-;41594:48;41617:4;41623:2;41627:7;41636:5;41594:22;:48::i;:::-;41586:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;41390:315;;;;:::o;49885:679::-;49958:13;49992:16;50000:7;49992;:16::i;:::-;49984:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;50075:23;50101:10;:19;50112:7;50101:19;;;;;;;;;;;50075:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50131:18;50152:10;:8;:10::i;:::-;50131:31;;50260:1;50244:4;50238:18;:23;50234:72;;;50285:9;50278:16;;;;;;50234:72;50436:1;50416:9;50410:23;:27;50406:108;;;50485:4;50491:9;50468:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50454:48;;;;;;50406:108;50533:23;50548:7;50533:14;:23::i;:::-;50526:30;;;;49885:679;;;;:::o;43002:110::-;43078:26;43088:2;43092:7;43078:26;;;;;;;;;;;;:9;:26::i;:::-;43002:110;;:::o;50720:217::-;50820:16;50828:7;50820;:16::i;:::-;50812:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;50920:9;50898:10;:19;50909:7;50898:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;50720:217;;:::o;48731:126::-;;;;:::o;49242:125::-;;;;:::o;47360:799::-;47515:4;47536:15;:2;:13;;;:15::i;:::-;47532:620;;;47588:2;47572:36;;;47609:12;:10;:12::i;:::-;47623:4;47629:7;47638:5;47572:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47568:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47831:1;47814:6;:13;:18;47810:272;;;47857:60;;;;;;;;;;:::i;:::-;;;;;;;;47810:272;48032:6;48026:13;48017:6;48013:2;48009:15;48002:38;47568:529;47705:41;;;47695:51;;;:6;:51;;;;47688:58;;;;;47532:620;48136:4;48129:11;;47360:799;;;;;;;:::o;38131:94::-;38182:13;38208:9;;;;;;;;;;;;;;38131:94;:::o;37548:334::-;37621:13;37655:16;37663:7;37655;:16::i;:::-;37647:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37736:21;37760:10;:8;:10::i;:::-;37736:34;;37812:1;37794:7;37788:21;:25;:86;;;;;;;;;;;;;;;;;37840:7;37849:18;:7;:16;:18::i;:::-;37823:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37788:86;37781:93;;;37548:334;;;:::o;43339:321::-;43469:18;43475:2;43479:7;43469:5;:18::i;:::-;43520:54;43551:1;43555:2;43559:7;43568:5;43520:22;:54::i;:::-;43498:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;43339:321;;;:::o;18892:326::-;18952:4;19209:1;19187:7;:19;;;:23;19180:30;;18892:326;;;:::o;12477:723::-;12533:13;12763:1;12754:5;:10;12750:53;;;12781:10;;;;;;;;;;;;;;;;;;;;;12750:53;12813:12;12828:5;12813:20;;12844:14;12869:78;12884:1;12876:4;:9;12869:78;;12902:8;;;;;:::i;:::-;;;;12933:2;12925:10;;;;;:::i;:::-;;;12869:78;;;12957:19;12989:6;12979:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12957:39;;13007:154;13023:1;13014:5;:10;13007:154;;13051:1;13041:11;;;;;:::i;:::-;;;13118:2;13110:5;:10;;;;:::i;:::-;13097:2;:24;;;;:::i;:::-;13084:39;;13067:6;13074;13067:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;13147:2;13138:11;;;;;:::i;:::-;;;13007:154;;;13185:6;13171:21;;;;;12477:723;;;;:::o;43996:439::-;44090:1;44076:16;;:2;:16;;;;44068:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;44149:16;44157:7;44149;:16::i;:::-;44148:17;44140:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44211:45;44240:1;44244:2;44248:7;44211:20;:45::i;:::-;44286:1;44269:9;:13;44279:2;44269:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44317:2;44298:7;:16;44306:7;44298:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44362:7;44358:2;44337:33;;44354:1;44337:33;;;;;;;;;;;;44383:44;44411:1;44415:2;44419:7;44383:19;:44::i;:::-;43996:439;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;702:655::-;798:5;823:81;839:64;896:6;839:64;:::i;:::-;823:81;:::i;:::-;814:90;;924:5;953:6;946:5;939:21;987:4;980:5;976:16;969:23;;1013:6;1063:3;1055:4;1047:6;1043:17;1038:3;1034:27;1031:36;1028:2;;;1092:1;1089;1082:12;1028:2;1128:1;1113:238;1138:6;1135:1;1132:13;1113:238;;;1206:3;1235:37;1268:3;1256:10;1235:37;:::i;:::-;1230:3;1223:50;1302:4;1297:3;1293:14;1286:21;;1336:4;1331:3;1327:14;1320:21;;1173:178;1160:1;1157;1153:9;1148:14;;1113:238;;;1117:14;804:553;;;;;;;:::o;1363:343::-;1440:5;1465:65;1481:48;1522:6;1481:48;:::i;:::-;1465:65;:::i;:::-;1456:74;;1553:6;1546:5;1539:21;1591:4;1584:5;1580:16;1629:3;1620:6;1615:3;1611:16;1608:25;1605:2;;;1646:1;1643;1636:12;1605:2;1659:41;1693:6;1688:3;1683;1659:41;:::i;:::-;1446:260;;;;;;:::o;1712:345::-;1790:5;1815:66;1831:49;1873:6;1831:49;:::i;:::-;1815:66;:::i;:::-;1806:75;;1904:6;1897:5;1890:21;1942:4;1935:5;1931:16;1980:3;1971:6;1966:3;1962:16;1959:25;1956:2;;;1997:1;1994;1987:12;1956:2;2010:41;2044:6;2039:3;2034;2010:41;:::i;:::-;1796:261;;;;;;:::o;2063:139::-;2109:5;2147:6;2134:20;2125:29;;2163:33;2190:5;2163:33;:::i;:::-;2115:87;;;;:::o;2225:303::-;2296:5;2345:3;2338:4;2330:6;2326:17;2322:27;2312:2;;2363:1;2360;2353:12;2312:2;2403:6;2390:20;2428:94;2518:3;2510:6;2503:4;2495:6;2491:17;2428:94;:::i;:::-;2419:103;;2302:226;;;;;:::o;2551:303::-;2622:5;2671:3;2664:4;2656:6;2652:17;2648:27;2638:2;;2689:1;2686;2679:12;2638:2;2729:6;2716:20;2754:94;2844:3;2836:6;2829:4;2821:6;2817:17;2754:94;:::i;:::-;2745:103;;2628:226;;;;;:::o;2860:133::-;2903:5;2941:6;2928:20;2919:29;;2957:30;2981:5;2957:30;:::i;:::-;2909:84;;;;:::o;2999:137::-;3044:5;3082:6;3069:20;3060:29;;3098:32;3124:5;3098:32;:::i;:::-;3050:86;;;;:::o;3142:141::-;3198:5;3229:6;3223:13;3214:22;;3245:32;3271:5;3245:32;:::i;:::-;3204:79;;;;:::o;3302:271::-;3357:5;3406:3;3399:4;3391:6;3387:17;3383:27;3373:2;;3424:1;3421;3414:12;3373:2;3464:6;3451:20;3489:78;3563:3;3555:6;3548:4;3540:6;3536:17;3489:78;:::i;:::-;3480:87;;3363:210;;;;;:::o;3593:273::-;3649:5;3698:3;3691:4;3683:6;3679:17;3675:27;3665:2;;3716:1;3713;3706:12;3665:2;3756:6;3743:20;3781:79;3856:3;3848:6;3841:4;3833:6;3829:17;3781:79;:::i;:::-;3772:88;;3655:211;;;;;:::o;3872:139::-;3918:5;3956:6;3943:20;3934:29;;3972:33;3999:5;3972:33;:::i;:::-;3924:87;;;;:::o;4017:143::-;4074:5;4105:6;4099:13;4090:22;;4121:33;4148:5;4121:33;:::i;:::-;4080:80;;;;:::o;4166:262::-;4225:6;4274:2;4262:9;4253:7;4249:23;4245:32;4242:2;;;4290:1;4287;4280:12;4242:2;4333:1;4358:53;4403:7;4394:6;4383:9;4379:22;4358:53;:::i;:::-;4348:63;;4304:117;4232:196;;;;:::o;4434:407::-;4502:6;4510;4559:2;4547:9;4538:7;4534:23;4530:32;4527:2;;;4575:1;4572;4565:12;4527:2;4618:1;4643:53;4688:7;4679:6;4668:9;4664:22;4643:53;:::i;:::-;4633:63;;4589:117;4745:2;4771:53;4816:7;4807:6;4796:9;4792:22;4771:53;:::i;:::-;4761:63;;4716:118;4517:324;;;;;:::o;4847:552::-;4924:6;4932;4940;4989:2;4977:9;4968:7;4964:23;4960:32;4957:2;;;5005:1;5002;4995:12;4957:2;5048:1;5073:53;5118:7;5109:6;5098:9;5094:22;5073:53;:::i;:::-;5063:63;;5019:117;5175:2;5201:53;5246:7;5237:6;5226:9;5222:22;5201:53;:::i;:::-;5191:63;;5146:118;5303:2;5329:53;5374:7;5365:6;5354:9;5350:22;5329:53;:::i;:::-;5319:63;;5274:118;4947:452;;;;;:::o;5405:809::-;5500:6;5508;5516;5524;5573:3;5561:9;5552:7;5548:23;5544:33;5541:2;;;5590:1;5587;5580:12;5541:2;5633:1;5658:53;5703:7;5694:6;5683:9;5679:22;5658:53;:::i;:::-;5648:63;;5604:117;5760:2;5786:53;5831:7;5822:6;5811:9;5807:22;5786:53;:::i;:::-;5776:63;;5731:118;5888:2;5914:53;5959:7;5950:6;5939:9;5935:22;5914:53;:::i;:::-;5904:63;;5859:118;6044:2;6033:9;6029:18;6016:32;6075:18;6067:6;6064:30;6061:2;;;6107:1;6104;6097:12;6061:2;6135:62;6189:7;6180:6;6169:9;6165:22;6135:62;:::i;:::-;6125:72;;5987:220;5531:683;;;;;;;:::o;6220:401::-;6285:6;6293;6342:2;6330:9;6321:7;6317:23;6313:32;6310:2;;;6358:1;6355;6348:12;6310:2;6401:1;6426:53;6471:7;6462:6;6451:9;6447:22;6426:53;:::i;:::-;6416:63;;6372:117;6528:2;6554:50;6596:7;6587:6;6576:9;6572:22;6554:50;:::i;:::-;6544:60;;6499:115;6300:321;;;;;:::o;6627:520::-;6705:6;6713;6762:2;6750:9;6741:7;6737:23;6733:32;6730:2;;;6778:1;6775;6768:12;6730:2;6821:1;6846:53;6891:7;6882:6;6871:9;6867:22;6846:53;:::i;:::-;6836:63;;6792:117;6976:2;6965:9;6961:18;6948:32;7007:18;6999:6;6996:30;6993:2;;;7039:1;7036;7029:12;6993:2;7067:63;7122:7;7113:6;7102:9;7098:22;7067:63;:::i;:::-;7057:73;;6919:221;6720:427;;;;;:::o;7153:407::-;7221:6;7229;7278:2;7266:9;7257:7;7253:23;7249:32;7246:2;;;7294:1;7291;7284:12;7246:2;7337:1;7362:53;7407:7;7398:6;7387:9;7383:22;7362:53;:::i;:::-;7352:63;;7308:117;7464:2;7490:53;7535:7;7526:6;7515:9;7511:22;7490:53;:::i;:::-;7480:63;;7435:118;7236:324;;;;;:::o;7566:405::-;7650:6;7699:2;7687:9;7678:7;7674:23;7670:32;7667:2;;;7715:1;7712;7705:12;7667:2;7786:1;7775:9;7771:17;7758:31;7816:18;7808:6;7805:30;7802:2;;;7848:1;7845;7838:12;7802:2;7876:78;7946:7;7937:6;7926:9;7922:22;7876:78;:::i;:::-;7866:88;;7729:235;7657:314;;;;:::o;7977:260::-;8035:6;8084:2;8072:9;8063:7;8059:23;8055:32;8052:2;;;8100:1;8097;8090:12;8052:2;8143:1;8168:52;8212:7;8203:6;8192:9;8188:22;8168:52;:::i;:::-;8158:62;;8114:116;8042:195;;;;:::o;8243:282::-;8312:6;8361:2;8349:9;8340:7;8336:23;8332:32;8329:2;;;8377:1;8374;8367:12;8329:2;8420:1;8445:63;8500:7;8491:6;8480:9;8476:22;8445:63;:::i;:::-;8435:73;;8391:127;8319:206;;;;:::o;8531:629::-;8617:6;8625;8674:2;8662:9;8653:7;8649:23;8645:32;8642:2;;;8690:1;8687;8680:12;8642:2;8761:1;8750:9;8746:17;8733:31;8791:18;8783:6;8780:30;8777:2;;;8823:1;8820;8813:12;8777:2;8851:62;8905:7;8896:6;8885:9;8881:22;8851:62;:::i;:::-;8841:72;;8704:219;8990:2;8979:9;8975:18;8962:32;9021:18;9013:6;9010:30;9007:2;;;9053:1;9050;9043:12;9007:2;9081:62;9135:7;9126:6;9115:9;9111:22;9081:62;:::i;:::-;9071:72;;8933:220;8632:528;;;;;:::o;9166:262::-;9225:6;9274:2;9262:9;9253:7;9249:23;9245:32;9242:2;;;9290:1;9287;9280:12;9242:2;9333:1;9358:53;9403:7;9394:6;9383:9;9379:22;9358:53;:::i;:::-;9348:63;;9304:117;9232:196;;;;:::o;9434:284::-;9504:6;9553:2;9541:9;9532:7;9528:23;9524:32;9521:2;;;9569:1;9566;9559:12;9521:2;9612:1;9637:64;9693:7;9684:6;9673:9;9669:22;9637:64;:::i;:::-;9627:74;;9583:128;9511:207;;;;:::o;9724:550::-;9817:6;9825;9874:2;9862:9;9853:7;9849:23;9845:32;9842:2;;;9890:1;9887;9880:12;9842:2;9933:1;9958:53;10003:7;9994:6;9983:9;9979:22;9958:53;:::i;:::-;9948:63;;9904:117;10088:2;10077:9;10073:18;10060:32;10119:18;10111:6;10108:30;10105:2;;;10151:1;10148;10141:12;10105:2;10179:78;10249:7;10240:6;10229:9;10225:22;10179:78;:::i;:::-;10169:88;;10031:236;9832:442;;;;;:::o;10280:407::-;10348:6;10356;10405:2;10393:9;10384:7;10380:23;10376:32;10373:2;;;10421:1;10418;10411:12;10373:2;10464:1;10489:53;10534:7;10525:6;10514:9;10510:22;10489:53;:::i;:::-;10479:63;;10435:117;10591:2;10617:53;10662:7;10653:6;10642:9;10638:22;10617:53;:::i;:::-;10607:63;;10562:118;10363:324;;;;;:::o;10693:118::-;10780:24;10798:5;10780:24;:::i;:::-;10775:3;10768:37;10758:53;;:::o;10817:109::-;10898:21;10913:5;10898:21;:::i;:::-;10893:3;10886:34;10876:50;;:::o;10932:118::-;11019:24;11037:5;11019:24;:::i;:::-;11014:3;11007:37;10997:53;;:::o;11056:360::-;11142:3;11170:38;11202:5;11170:38;:::i;:::-;11224:70;11287:6;11282:3;11224:70;:::i;:::-;11217:77;;11303:52;11348:6;11343:3;11336:4;11329:5;11325:16;11303:52;:::i;:::-;11380:29;11402:6;11380:29;:::i;:::-;11375:3;11371:39;11364:46;;11146:270;;;;;:::o;11422:364::-;11510:3;11538:39;11571:5;11538:39;:::i;:::-;11593:71;11657:6;11652:3;11593:71;:::i;:::-;11586:78;;11673:52;11718:6;11713:3;11706:4;11699:5;11695:16;11673:52;:::i;:::-;11750:29;11772:6;11750:29;:::i;:::-;11745:3;11741:39;11734:46;;11514:272;;;;;:::o;11792:377::-;11898:3;11926:39;11959:5;11926:39;:::i;:::-;11981:89;12063:6;12058:3;11981:89;:::i;:::-;11974:96;;12079:52;12124:6;12119:3;12112:4;12105:5;12101:16;12079:52;:::i;:::-;12156:6;12151:3;12147:16;12140:23;;11902:267;;;;;:::o;12175:366::-;12317:3;12338:67;12402:2;12397:3;12338:67;:::i;:::-;12331:74;;12414:93;12503:3;12414:93;:::i;:::-;12532:2;12527:3;12523:12;12516:19;;12321:220;;;:::o;12547:366::-;12689:3;12710:67;12774:2;12769:3;12710:67;:::i;:::-;12703:74;;12786:93;12875:3;12786:93;:::i;:::-;12904:2;12899:3;12895:12;12888:19;;12693:220;;;:::o;12919:366::-;13061:3;13082:67;13146:2;13141:3;13082:67;:::i;:::-;13075:74;;13158:93;13247:3;13158:93;:::i;:::-;13276:2;13271:3;13267:12;13260:19;;13065:220;;;:::o;13291:366::-;13433:3;13454:67;13518:2;13513:3;13454:67;:::i;:::-;13447:74;;13530:93;13619:3;13530:93;:::i;:::-;13648:2;13643:3;13639:12;13632:19;;13437:220;;;:::o;13663:366::-;13805:3;13826:67;13890:2;13885:3;13826:67;:::i;:::-;13819:74;;13902:93;13991:3;13902:93;:::i;:::-;14020:2;14015:3;14011:12;14004:19;;13809:220;;;:::o;14035:366::-;14177:3;14198:67;14262:2;14257:3;14198:67;:::i;:::-;14191:74;;14274:93;14363:3;14274:93;:::i;:::-;14392:2;14387:3;14383:12;14376:19;;14181:220;;;:::o;14407:366::-;14549:3;14570:67;14634:2;14629:3;14570:67;:::i;:::-;14563:74;;14646:93;14735:3;14646:93;:::i;:::-;14764:2;14759:3;14755:12;14748:19;;14553:220;;;:::o;14779:366::-;14921:3;14942:67;15006:2;15001:3;14942:67;:::i;:::-;14935:74;;15018:93;15107:3;15018:93;:::i;:::-;15136:2;15131:3;15127:12;15120:19;;14925:220;;;:::o;15151:366::-;15293:3;15314:67;15378:2;15373:3;15314:67;:::i;:::-;15307:74;;15390:93;15479:3;15390:93;:::i;:::-;15508:2;15503:3;15499:12;15492:19;;15297:220;;;:::o;15523:366::-;15665:3;15686:67;15750:2;15745:3;15686:67;:::i;:::-;15679:74;;15762:93;15851:3;15762:93;:::i;:::-;15880:2;15875:3;15871:12;15864:19;;15669:220;;;:::o;15895:366::-;16037:3;16058:67;16122:2;16117:3;16058:67;:::i;:::-;16051:74;;16134:93;16223:3;16134:93;:::i;:::-;16252:2;16247:3;16243:12;16236:19;;16041:220;;;:::o;16267:366::-;16409:3;16430:67;16494:2;16489:3;16430:67;:::i;:::-;16423:74;;16506:93;16595:3;16506:93;:::i;:::-;16624:2;16619:3;16615:12;16608:19;;16413:220;;;:::o;16639:366::-;16781:3;16802:67;16866:2;16861:3;16802:67;:::i;:::-;16795:74;;16878:93;16967:3;16878:93;:::i;:::-;16996:2;16991:3;16987:12;16980:19;;16785:220;;;:::o;17011:366::-;17153:3;17174:67;17238:2;17233:3;17174:67;:::i;:::-;17167:74;;17250:93;17339:3;17250:93;:::i;:::-;17368:2;17363:3;17359:12;17352:19;;17157:220;;;:::o;17383:366::-;17525:3;17546:67;17610:2;17605:3;17546:67;:::i;:::-;17539:74;;17622:93;17711:3;17622:93;:::i;:::-;17740:2;17735:3;17731:12;17724:19;;17529:220;;;:::o;17755:366::-;17897:3;17918:67;17982:2;17977:3;17918:67;:::i;:::-;17911:74;;17994:93;18083:3;17994:93;:::i;:::-;18112:2;18107:3;18103:12;18096:19;;17901:220;;;:::o;18127:366::-;18269:3;18290:67;18354:2;18349:3;18290:67;:::i;:::-;18283:74;;18366:93;18455:3;18366:93;:::i;:::-;18484:2;18479:3;18475:12;18468:19;;18273:220;;;:::o;18499:366::-;18641:3;18662:67;18726:2;18721:3;18662:67;:::i;:::-;18655:74;;18738:93;18827:3;18738:93;:::i;:::-;18856:2;18851:3;18847:12;18840:19;;18645:220;;;:::o;18871:366::-;19013:3;19034:67;19098:2;19093:3;19034:67;:::i;:::-;19027:74;;19110:93;19199:3;19110:93;:::i;:::-;19228:2;19223:3;19219:12;19212:19;;19017:220;;;:::o;19243:366::-;19385:3;19406:67;19470:2;19465:3;19406:67;:::i;:::-;19399:74;;19482:93;19571:3;19482:93;:::i;:::-;19600:2;19595:3;19591:12;19584:19;;19389:220;;;:::o;19615:115::-;19700:23;19717:5;19700:23;:::i;:::-;19695:3;19688:36;19678:52;;:::o;19736:118::-;19823:24;19841:5;19823:24;:::i;:::-;19818:3;19811:37;19801:53;;:::o;19860:115::-;19945:23;19962:5;19945:23;:::i;:::-;19940:3;19933:36;19923:52;;:::o;19981:115::-;20066:23;20083:5;20066:23;:::i;:::-;20061:3;20054:36;20044:52;;:::o;20102:435::-;20282:3;20304:95;20395:3;20386:6;20304:95;:::i;:::-;20297:102;;20416:95;20507:3;20498:6;20416:95;:::i;:::-;20409:102;;20528:3;20521:10;;20286:251;;;;;:::o;20543:222::-;20636:4;20674:2;20663:9;20659:18;20651:26;;20687:71;20755:1;20744:9;20740:17;20731:6;20687:71;:::i;:::-;20641:124;;;;:::o;20771:332::-;20892:4;20930:2;20919:9;20915:18;20907:26;;20943:71;21011:1;21000:9;20996:17;20987:6;20943:71;:::i;:::-;21024:72;21092:2;21081:9;21077:18;21068:6;21024:72;:::i;:::-;20897:206;;;;;:::o;21109:640::-;21304:4;21342:3;21331:9;21327:19;21319:27;;21356:71;21424:1;21413:9;21409:17;21400:6;21356:71;:::i;:::-;21437:72;21505:2;21494:9;21490:18;21481:6;21437:72;:::i;:::-;21519;21587:2;21576:9;21572:18;21563:6;21519:72;:::i;:::-;21638:9;21632:4;21628:20;21623:2;21612:9;21608:18;21601:48;21666:76;21737:4;21728:6;21666:76;:::i;:::-;21658:84;;21309:440;;;;;;;:::o;21755:332::-;21876:4;21914:2;21903:9;21899:18;21891:26;;21927:71;21995:1;21984:9;21980:17;21971:6;21927:71;:::i;:::-;22008:72;22076:2;22065:9;22061:18;22052:6;22008:72;:::i;:::-;21881:206;;;;;:::o;22093:210::-;22180:4;22218:2;22207:9;22203:18;22195:26;;22231:65;22293:1;22282:9;22278:17;22269:6;22231:65;:::i;:::-;22185:118;;;;:::o;22309:648::-;22506:4;22544:3;22533:9;22529:19;22521:27;;22558:71;22626:1;22615:9;22611:17;22602:6;22558:71;:::i;:::-;22639:70;22705:2;22694:9;22690:18;22681:6;22639:70;:::i;:::-;22719;22785:2;22774:9;22770:18;22761:6;22719:70;:::i;:::-;22799;22865:2;22854:9;22850:18;22841:6;22799:70;:::i;:::-;22879:71;22945:3;22934:9;22930:19;22921:6;22879:71;:::i;:::-;22511:446;;;;;;;;:::o;22963:313::-;23076:4;23114:2;23103:9;23099:18;23091:26;;23163:9;23157:4;23153:20;23149:1;23138:9;23134:17;23127:47;23191:78;23264:4;23255:6;23191:78;:::i;:::-;23183:86;;23081:195;;;;:::o;23282:419::-;23448:4;23486:2;23475:9;23471:18;23463:26;;23535:9;23529:4;23525:20;23521:1;23510:9;23506:17;23499:47;23563:131;23689:4;23563:131;:::i;:::-;23555:139;;23453:248;;;:::o;23707:419::-;23873:4;23911:2;23900:9;23896:18;23888:26;;23960:9;23954:4;23950:20;23946:1;23935:9;23931:17;23924:47;23988:131;24114:4;23988:131;:::i;:::-;23980:139;;23878:248;;;:::o;24132:419::-;24298:4;24336:2;24325:9;24321:18;24313:26;;24385:9;24379:4;24375:20;24371:1;24360:9;24356:17;24349:47;24413:131;24539:4;24413:131;:::i;:::-;24405:139;;24303:248;;;:::o;24557:419::-;24723:4;24761:2;24750:9;24746:18;24738:26;;24810:9;24804:4;24800:20;24796:1;24785:9;24781:17;24774:47;24838:131;24964:4;24838:131;:::i;:::-;24830:139;;24728:248;;;:::o;24982:419::-;25148:4;25186:2;25175:9;25171:18;25163:26;;25235:9;25229:4;25225:20;25221:1;25210:9;25206:17;25199:47;25263:131;25389:4;25263:131;:::i;:::-;25255:139;;25153:248;;;:::o;25407:419::-;25573:4;25611:2;25600:9;25596:18;25588:26;;25660:9;25654:4;25650:20;25646:1;25635:9;25631:17;25624:47;25688:131;25814:4;25688:131;:::i;:::-;25680:139;;25578:248;;;:::o;25832:419::-;25998:4;26036:2;26025:9;26021:18;26013:26;;26085:9;26079:4;26075:20;26071:1;26060:9;26056:17;26049:47;26113:131;26239:4;26113:131;:::i;:::-;26105:139;;26003:248;;;:::o;26257:419::-;26423:4;26461:2;26450:9;26446:18;26438:26;;26510:9;26504:4;26500:20;26496:1;26485:9;26481:17;26474:47;26538:131;26664:4;26538:131;:::i;:::-;26530:139;;26428:248;;;:::o;26682:419::-;26848:4;26886:2;26875:9;26871:18;26863:26;;26935:9;26929:4;26925:20;26921:1;26910:9;26906:17;26899:47;26963:131;27089:4;26963:131;:::i;:::-;26955:139;;26853:248;;;:::o;27107:419::-;27273:4;27311:2;27300:9;27296:18;27288:26;;27360:9;27354:4;27350:20;27346:1;27335:9;27331:17;27324:47;27388:131;27514:4;27388:131;:::i;:::-;27380:139;;27278:248;;;:::o;27532:419::-;27698:4;27736:2;27725:9;27721:18;27713:26;;27785:9;27779:4;27775:20;27771:1;27760:9;27756:17;27749:47;27813:131;27939:4;27813:131;:::i;:::-;27805:139;;27703:248;;;:::o;27957:419::-;28123:4;28161:2;28150:9;28146:18;28138:26;;28210:9;28204:4;28200:20;28196:1;28185:9;28181:17;28174:47;28238:131;28364:4;28238:131;:::i;:::-;28230:139;;28128:248;;;:::o;28382:419::-;28548:4;28586:2;28575:9;28571:18;28563:26;;28635:9;28629:4;28625:20;28621:1;28610:9;28606:17;28599:47;28663:131;28789:4;28663:131;:::i;:::-;28655:139;;28553:248;;;:::o;28807:419::-;28973:4;29011:2;29000:9;28996:18;28988:26;;29060:9;29054:4;29050:20;29046:1;29035:9;29031:17;29024:47;29088:131;29214:4;29088:131;:::i;:::-;29080:139;;28978:248;;;:::o;29232:419::-;29398:4;29436:2;29425:9;29421:18;29413:26;;29485:9;29479:4;29475:20;29471:1;29460:9;29456:17;29449:47;29513:131;29639:4;29513:131;:::i;:::-;29505:139;;29403:248;;;:::o;29657:419::-;29823:4;29861:2;29850:9;29846:18;29838:26;;29910:9;29904:4;29900:20;29896:1;29885:9;29881:17;29874:47;29938:131;30064:4;29938:131;:::i;:::-;29930:139;;29828:248;;;:::o;30082:419::-;30248:4;30286:2;30275:9;30271:18;30263:26;;30335:9;30329:4;30325:20;30321:1;30310:9;30306:17;30299:47;30363:131;30489:4;30363:131;:::i;:::-;30355:139;;30253:248;;;:::o;30507:419::-;30673:4;30711:2;30700:9;30696:18;30688:26;;30760:9;30754:4;30750:20;30746:1;30735:9;30731:17;30724:47;30788:131;30914:4;30788:131;:::i;:::-;30780:139;;30678:248;;;:::o;30932:419::-;31098:4;31136:2;31125:9;31121:18;31113:26;;31185:9;31179:4;31175:20;31171:1;31160:9;31156:17;31149:47;31213:131;31339:4;31213:131;:::i;:::-;31205:139;;31103:248;;;:::o;31357:419::-;31523:4;31561:2;31550:9;31546:18;31538:26;;31610:9;31604:4;31600:20;31596:1;31585:9;31581:17;31574:47;31638:131;31764:4;31638:131;:::i;:::-;31630:139;;31528:248;;;:::o;31782:222::-;31875:4;31913:2;31902:9;31898:18;31890:26;;31926:71;31994:1;31983:9;31979:17;31970:6;31926:71;:::i;:::-;31880:124;;;;:::o;32010:129::-;32044:6;32071:20;;:::i;:::-;32061:30;;32100:33;32128:4;32120:6;32100:33;:::i;:::-;32051:88;;;:::o;32145:75::-;32178:6;32211:2;32205:9;32195:19;;32185:35;:::o;32226:311::-;32303:4;32393:18;32385:6;32382:30;32379:2;;;32415:18;;:::i;:::-;32379:2;32465:4;32457:6;32453:17;32445:25;;32525:4;32519;32515:15;32507:23;;32308:229;;;:::o;32543:311::-;32620:4;32710:18;32702:6;32699:30;32696:2;;;32732:18;;:::i;:::-;32696:2;32782:4;32774:6;32770:17;32762:25;;32842:4;32836;32832:15;32824:23;;32625:229;;;:::o;32860:307::-;32921:4;33011:18;33003:6;33000:30;32997:2;;;33033:18;;:::i;:::-;32997:2;33071:29;33093:6;33071:29;:::i;:::-;33063:37;;33155:4;33149;33145:15;33137:23;;32926:241;;;:::o;33173:308::-;33235:4;33325:18;33317:6;33314:30;33311:2;;;33347:18;;:::i;:::-;33311:2;33385:29;33407:6;33385:29;:::i;:::-;33377:37;;33469:4;33463;33459:15;33451:23;;33240:241;;;:::o;33487:98::-;33538:6;33572:5;33566:12;33556:22;;33545:40;;;:::o;33591:99::-;33643:6;33677:5;33671:12;33661:22;;33650:40;;;:::o;33696:168::-;33779:11;33813:6;33808:3;33801:19;33853:4;33848:3;33844:14;33829:29;;33791:73;;;;:::o;33870:169::-;33954:11;33988:6;33983:3;33976:19;34028:4;34023:3;34019:14;34004:29;;33966:73;;;;:::o;34045:148::-;34147:11;34184:3;34169:18;;34159:34;;;;:::o;34199:305::-;34239:3;34258:20;34276:1;34258:20;:::i;:::-;34253:25;;34292:20;34310:1;34292:20;:::i;:::-;34287:25;;34446:1;34378:66;34374:74;34371:1;34368:81;34365:2;;;34452:18;;:::i;:::-;34365:2;34496:1;34493;34489:9;34482:16;;34243:261;;;;:::o;34510:185::-;34550:1;34567:20;34585:1;34567:20;:::i;:::-;34562:25;;34601:20;34619:1;34601:20;:::i;:::-;34596:25;;34640:1;34630:2;;34645:18;;:::i;:::-;34630:2;34687:1;34684;34680:9;34675:14;;34552:143;;;;:::o;34701:179::-;34739:1;34756:18;34772:1;34756:18;:::i;:::-;34751:23;;34788:18;34804:1;34788:18;:::i;:::-;34783:23;;34825:1;34815:2;;34830:18;;:::i;:::-;34815:2;34872:1;34869;34865:9;34860:14;;34741:139;;;;:::o;34886:348::-;34926:7;34949:20;34967:1;34949:20;:::i;:::-;34944:25;;34983:20;35001:1;34983:20;:::i;:::-;34978:25;;35171:1;35103:66;35099:74;35096:1;35093:81;35088:1;35081:9;35074:17;35070:105;35067:2;;;35178:18;;:::i;:::-;35067:2;35226:1;35223;35219:9;35208:20;;34934:300;;;;:::o;35240:191::-;35280:4;35300:20;35318:1;35300:20;:::i;:::-;35295:25;;35334:20;35352:1;35334:20;:::i;:::-;35329:25;;35373:1;35370;35367:8;35364:2;;;35378:18;;:::i;:::-;35364:2;35423:1;35420;35416:9;35408:17;;35285:146;;;;:::o;35437:185::-;35475:4;35495:18;35511:1;35495:18;:::i;:::-;35490:23;;35527:18;35543:1;35527:18;:::i;:::-;35522:23;;35564:1;35561;35558:8;35555:2;;;35569:18;;:::i;:::-;35555:2;35614:1;35611;35607:9;35599:17;;35480:142;;;;:::o;35628:96::-;35665:7;35694:24;35712:5;35694:24;:::i;:::-;35683:35;;35673:51;;;:::o;35730:90::-;35764:7;35807:5;35800:13;35793:21;35782:32;;35772:48;;;:::o;35826:77::-;35863:7;35892:5;35881:16;;35871:32;;;:::o;35909:149::-;35945:7;35985:66;35978:5;35974:78;35963:89;;35953:105;;;:::o;36064:89::-;36100:7;36140:6;36133:5;36129:18;36118:29;;36108:45;;;:::o;36159:126::-;36196:7;36236:42;36229:5;36225:54;36214:65;;36204:81;;;:::o;36291:77::-;36328:7;36357:5;36346:16;;36336:32;;;:::o;36374:93::-;36410:7;36450:10;36443:5;36439:22;36428:33;;36418:49;;;:::o;36473:101::-;36509:7;36549:18;36542:5;36538:30;36527:41;;36517:57;;;:::o;36580:86::-;36615:7;36655:4;36648:5;36644:16;36633:27;;36623:43;;;:::o;36672:154::-;36756:6;36751:3;36746;36733:30;36818:1;36809:6;36804:3;36800:16;36793:27;36723:103;;;:::o;36832:307::-;36900:1;36910:113;36924:6;36921:1;36918:13;36910:113;;;37009:1;37004:3;37000:11;36994:18;36990:1;36985:3;36981:11;36974:39;36946:2;36943:1;36939:10;36934:15;;36910:113;;;37041:6;37038:1;37035:13;37032:2;;;37121:1;37112:6;37107:3;37103:16;37096:27;37032:2;36881:258;;;;:::o;37145:167::-;37182:3;37205:22;37221:5;37205:22;:::i;:::-;37196:31;;37249:4;37242:5;37239:15;37236:2;;;37257:18;;:::i;:::-;37236:2;37304:1;37297:5;37293:13;37286:20;;37186:126;;;:::o;37318:320::-;37362:6;37399:1;37393:4;37389:12;37379:22;;37446:1;37440:4;37436:12;37467:18;37457:2;;37523:4;37515:6;37511:17;37501:27;;37457:2;37585;37577:6;37574:14;37554:18;37551:38;37548:2;;;37604:18;;:::i;:::-;37548:2;37369:269;;;;:::o;37644:281::-;37727:27;37749:4;37727:27;:::i;:::-;37719:6;37715:40;37857:6;37845:10;37842:22;37821:18;37809:10;37806:34;37803:62;37800:2;;;37868:18;;:::i;:::-;37800:2;37908:10;37904:2;37897:22;37687:238;;;:::o;37931:233::-;37970:3;37993:24;38011:5;37993:24;:::i;:::-;37984:33;;38039:66;38032:5;38029:77;38026:2;;;38109:18;;:::i;:::-;38026:2;38156:1;38149:5;38145:13;38138:20;;37974:190;;;:::o;38170:176::-;38202:1;38219:20;38237:1;38219:20;:::i;:::-;38214:25;;38253:20;38271:1;38253:20;:::i;:::-;38248:25;;38292:1;38282:2;;38297:18;;:::i;:::-;38282:2;38338:1;38335;38331:9;38326:14;;38204:142;;;;:::o;38352:170::-;38382:1;38399:18;38415:1;38399:18;:::i;:::-;38394:23;;38431:18;38447:1;38431:18;:::i;:::-;38426:23;;38468:1;38458:2;;38473:18;;:::i;:::-;38458:2;38514:1;38511;38507:9;38502:14;;38384:138;;;;:::o;38528:180::-;38576:77;38573:1;38566:88;38673:4;38670:1;38663:15;38697:4;38694:1;38687:15;38714:180;38762:77;38759:1;38752:88;38859:4;38856:1;38849:15;38883:4;38880:1;38873:15;38900:180;38948:77;38945:1;38938:88;39045:4;39042:1;39035:15;39069:4;39066:1;39059:15;39086:180;39134:77;39131:1;39124:88;39231:4;39228:1;39221:15;39255:4;39252:1;39245:15;39272:102;39313:6;39364:2;39360:7;39355:2;39348:5;39344:14;39340:28;39330:38;;39320:54;;;:::o;39380:237::-;39520:34;39516:1;39508:6;39504:14;39497:58;39589:20;39584:2;39576:6;39572:15;39565:45;39486:131;:::o;39623:168::-;39763:20;39759:1;39751:6;39747:14;39740:44;39729:62;:::o;39797:225::-;39937:34;39933:1;39925:6;39921:14;39914:58;40006:8;40001:2;39993:6;39989:15;39982:33;39903:119;:::o;40028:224::-;40168:34;40164:1;40156:6;40152:14;40145:58;40237:7;40232:2;40224:6;40220:15;40213:32;40134:118;:::o;40258:178::-;40398:30;40394:1;40386:6;40382:14;40375:54;40364:72;:::o;40442:223::-;40582:34;40578:1;40570:6;40566:14;40559:58;40651:6;40646:2;40638:6;40634:15;40627:31;40548:117;:::o;40671:175::-;40811:27;40807:1;40799:6;40795:14;40788:51;40777:69;:::o;40852:231::-;40992:34;40988:1;40980:6;40976:14;40969:58;41061:14;41056:2;41048:6;41044:15;41037:39;40958:125;:::o;41089:243::-;41229:34;41225:1;41217:6;41213:14;41206:58;41298:26;41293:2;41285:6;41281:15;41274:51;41195:137;:::o;41338:229::-;41478:34;41474:1;41466:6;41462:14;41455:58;41547:12;41542:2;41534:6;41530:15;41523:37;41444:123;:::o;41573:228::-;41713:34;41709:1;41701:6;41697:14;41690:58;41782:11;41777:2;41769:6;41765:15;41758:36;41679:122;:::o;41807:233::-;41947:34;41943:1;41935:6;41931:14;41924:58;42016:16;42011:2;42003:6;41999:15;41992:41;41913:127;:::o;42046:182::-;42186:34;42182:1;42174:6;42170:14;42163:58;42152:76;:::o;42234:181::-;42374:33;42370:1;42362:6;42358:14;42351:57;42340:75;:::o;42421:236::-;42561:34;42557:1;42549:6;42545:14;42538:58;42630:19;42625:2;42617:6;42613:15;42606:44;42527:130;:::o;42663:231::-;42803:34;42799:1;42791:6;42787:14;42780:58;42872:14;42867:2;42859:6;42855:15;42848:39;42769:125;:::o;42900:182::-;43040:34;43036:1;43028:6;43024:14;43017:58;43006:76;:::o;43088:234::-;43228:34;43224:1;43216:6;43212:14;43205:58;43297:17;43292:2;43284:6;43280:15;43273:42;43194:128;:::o;43328:220::-;43468:34;43464:1;43456:6;43452:14;43445:58;43537:3;43532:2;43524:6;43520:15;43513:28;43434:114;:::o;43554:236::-;43694:34;43690:1;43682:6;43678:14;43671:58;43763:19;43758:2;43750:6;43746:15;43739:44;43660:130;:::o;43796:122::-;43869:24;43887:5;43869:24;:::i;:::-;43862:5;43859:35;43849:2;;43908:1;43905;43898:12;43849:2;43839:79;:::o;43924:116::-;43994:21;44009:5;43994:21;:::i;:::-;43987:5;43984:32;43974:2;;44030:1;44027;44020:12;43974:2;43964:76;:::o;44046:120::-;44118:23;44135:5;44118:23;:::i;:::-;44111:5;44108:34;44098:2;;44156:1;44153;44146:12;44098:2;44088:78;:::o;44172:122::-;44245:24;44263:5;44245:24;:::i;:::-;44238:5;44235:35;44225:2;;44284:1;44281;44274:12;44225:2;44215:79;:::o

Swarm Source

ipfs://63323ac57d60f207b0761248ab47a92d7291d7915f2906dd74af70387291b1b7
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.