Address Details
contract

0x9ff4EA9BebB124455cA0af44aDB92Fefb651E65A

Contract Name
MorpheusICO
Creator
0x0fc039–a608ee at 0x62b1b4–f68343
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
9 Transactions
Transfers
12 Transfers
Gas Used
612,344
Last Balance Update
7895679
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
MorpheusICO




Optimization enabled
false
Compiler version
v0.8.6+commit.11564f7e




EVM Version
berlin




Verified at
2023-02-06T10:34:11.251623Z

project:/contracts/MorpheusICO.sol

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.6;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";

/**
 * @title DiceRoll Contract
 */
contract MorpheusICO is Ownable {
    using SafeERC20 for IERC20;

    /// @notice Event emitted when contract is deployed.
    event MorpheusICODeployed();

    /// @notice Event emitted when the user bought the MORPHEUS token.
    event Bought(address user, uint256 amount);

    /// @notice Event emitted when withdrew any ERC20 tokens.
    event ERC20TokensWithdrew(address tokenAddress, uint256 amount);

    /// @notice Event emitted when buy token address is changed.
    event BuyTokenAddressChanged(address tokenAddress);

    /// @notice Event emitted when buy token price is changed.
    event TokenPriceChanged(uint256 tokenPrice);

    /// @notice Event emitted when ICO is closed.
    event ICOClosed(bool closed);

    /// @notice Event emitted when max token amount is changed.
    event MaxTokenAmountsChanged(uint256 newAmount);

    IERC20 MORPHEUS;

    address public buyTokenAddr;
    uint256 public tokenPrice = 15 * 10**16;
    uint256 public maxTokenAmountPerUser = 3 * 10**6;

    bool public isOpend;

    /**
     * @dev Constructor function
     * @param _MORPHEUS Interface of MORPHEUS
     * @param _buyTokenAddr Buy token address
     */
    constructor(IERC20 _MORPHEUS, address _buyTokenAddr) {
        buyTokenAddr = _buyTokenAddr;
        MORPHEUS = _MORPHEUS;
        isOpend = true;

        emit MorpheusICODeployed();
    }

    /**
     * @dev External function to buy the MORPHEUS token with cUSD. Current price is 0.15
     * @param _amount Token amount
     */
    function buy(uint256 _amount) external {
        require(
            _amount <= maxTokenAmountPerUser,
            "MorpheusICO: Out of token amounts"
        );
        require(isOpend, "MorpheusICO: ICO is closed");
        IERC20(buyTokenAddr).safeTransferFrom(
            msg.sender,
            address(this),
            _amount * tokenPrice
        );
        MORPHEUS.safeTransfer(msg.sender, _amount);

        emit Bought(msg.sender, _amount);
    }

    /**
     * @dev External function to withdraw any ERC20 tokens. This function can be called by only owner.
     * @param _devWallet Address of developer.
     * @param _tokenContract Address of ERC20 token.
     */
    function withdrawERC20Tokens(address _devWallet, address _tokenContract)
        external
        onlyOwner
    {
        IERC20 token = IERC20(_tokenContract);
        uint256 amount = token.balanceOf(address(this));
        token.safeTransfer(_devWallet, amount);

        emit ERC20TokensWithdrew(_tokenContract, amount);
    }

    /**
     * @dev External function to change buy token address. This function can be called by only owner.
     * @param _tokenAddr New buy token address
     */
    function changeBuyTokenAddress(address _tokenAddr) external onlyOwner {
        buyTokenAddr = _tokenAddr;

        emit BuyTokenAddressChanged(_tokenAddr);
    }

    /**
     * @dev External function to change token price. This function can be called by only owner.
     * @param _newPrice New price
     */
    function changeTokenPrice(uint256 _newPrice) external onlyOwner {
        tokenPrice = _newPrice;

        emit TokenPriceChanged(_newPrice);
    }

    /**
     * @dev External function to close the ICO. This function can be called by only owner.
     */
    function closeICO() external onlyOwner {
        isOpend = false;

        emit ICOClosed(isOpend);
    }

    /**
     * @dev External function to change max token amount per user. This function can be called by only owner.
     * @param _newAmount New token amount
     */
    function changeMaxTokenAmount(uint256 _newAmount) external onlyOwner {
        maxTokenAmountPerUser = _newAmount;

        emit MaxTokenAmountsChanged(_newAmount);
    }
}
        

/_openzeppelin/contracts/access/Ownable.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @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() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
          

/_openzeppelin/contracts/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

/_openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC20.sol";
import "../../../utils/Address.sol";

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

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

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

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

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

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

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

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

/_openzeppelin/contracts/utils/Address.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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);
            }
        }
    }
}
          

/_openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT

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;
    }
}
          

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_MORPHEUS","internalType":"contract IERC20"},{"type":"address","name":"_buyTokenAddr","internalType":"address"}]},{"type":"event","name":"Bought","inputs":[{"type":"address","name":"user","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"BuyTokenAddressChanged","inputs":[{"type":"address","name":"tokenAddress","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"ERC20TokensWithdrew","inputs":[{"type":"address","name":"tokenAddress","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ICOClosed","inputs":[{"type":"bool","name":"closed","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"MaxTokenAmountsChanged","inputs":[{"type":"uint256","name":"newAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MorpheusICODeployed","inputs":[],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"TokenPriceChanged","inputs":[{"type":"uint256","name":"tokenPrice","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"buy","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"buyTokenAddr","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeBuyTokenAddress","inputs":[{"type":"address","name":"_tokenAddr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeMaxTokenAmount","inputs":[{"type":"uint256","name":"_newAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeTokenPrice","inputs":[{"type":"uint256","name":"_newPrice","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"closeICO","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOpend","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxTokenAmountPerUser","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tokenPrice","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawERC20Tokens","inputs":[{"type":"address","name":"_devWallet","internalType":"address"},{"type":"address","name":"_tokenContract","internalType":"address"}]}]
              

Contract Creation Code

0x6080604052670214e8348c4f0000600355622dc6c06004553480156200002457600080fd5b50604051620019c6380380620019c683398181016040528101906200004a919062000235565b6200006a6200005e6200013b60201b60201c565b6200014360201b60201c565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600560006101000a81548160ff0219169083151502179055507f1a0ae285d7857b71784f2393966bd6698c56d9451d006d38b9855250ff9deeb760405160405180910390a15050620002fd565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000815190506200021881620002c9565b92915050565b6000815190506200022f81620002e3565b92915050565b600080604083850312156200024f576200024e620002c4565b5b60006200025f858286016200021e565b9250506020620002728582860162000207565b9150509250929050565b60006200028982620002a4565b9050919050565b60006200029d826200027c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600080fd5b620002d4816200027c565b8114620002e057600080fd5b50565b620002ee8162000290565b8114620002fa57600080fd5b50565b6116b9806200030d6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638098c2d11161008c578063b6e1f63211610066578063b6e1f632146101b4578063d96a094a146101d2578063f2fde38b146101ee578063fbc94f241461020a576100cf565b80638098c2d11461015c5780638da5cb5b1461017a5780639c6293d514610198576100cf565b80631308d9f4146100d457806338ad2e55146100f0578063542386451461010c57806361ebf53114610116578063715018a6146101345780637ff9b5961461013e575b600080fd5b6100ee60048036038101906100e99190610f8b565b610226565b005b61010a60048036038101906101059190610f1e565b6102e3565b005b61011461045b565b005b61011e61053a565b60405161012b9190611320565b60405180910390f35b61013c610540565b005b6101466105c8565b6040516101539190611320565b60405180910390f35b6101646105ce565b6040516101719190611203565b60405180910390f35b6101826105e1565b60405161018f9190611188565b60405180910390f35b6101b260048036038101906101ad9190610ef1565b61060a565b005b6101bc610701565b6040516101c99190611188565b60405180910390f35b6101ec60048036038101906101e79190610f8b565b610727565b005b61020860048036038101906102039190610ef1565b6108a0565b005b610224600480360381019061021f9190610f8b565b610998565b005b61022e610a55565b73ffffffffffffffffffffffffffffffffffffffff1661024c6105e1565b73ffffffffffffffffffffffffffffffffffffffff16146102a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610299906112c0565b60405180910390fd5b806004819055507f0f87594bf9b95df8745c9a0293c381fab28736c2cf29959552e8231931b30452816040516102d89190611320565b60405180910390a150565b6102eb610a55565b73ffffffffffffffffffffffffffffffffffffffff166103096105e1565b73ffffffffffffffffffffffffffffffffffffffff161461035f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610356906112c0565b60405180910390fd5b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161039f9190611188565b60206040518083038186803b1580156103b757600080fd5b505afa1580156103cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ef9190610fb8565b905061041c84828473ffffffffffffffffffffffffffffffffffffffff16610a5d9092919063ffffffff16565b7fbea80160556933fefc2dc7c94fc4fb00066e4fb00d4de1bb17e4a8fcd14218c2838260405161044d9291906111da565b60405180910390a150505050565b610463610a55565b73ffffffffffffffffffffffffffffffffffffffff166104816105e1565b73ffffffffffffffffffffffffffffffffffffffff16146104d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ce906112c0565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f9b8b56b38290aada0e4d2635f5153bc3f13aae2416937576aa2e9809e6333c06600560009054906101000a900460ff166040516105309190611203565b60405180910390a1565b60045481565b610548610a55565b73ffffffffffffffffffffffffffffffffffffffff166105666105e1565b73ffffffffffffffffffffffffffffffffffffffff16146105bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b3906112c0565b60405180910390fd5b6105c66000610ae3565b565b60035481565b600560009054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610612610a55565b73ffffffffffffffffffffffffffffffffffffffff166106306105e1565b73ffffffffffffffffffffffffffffffffffffffff1614610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067d906112c0565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ffc42e75628f57fbb516578285f391c3f1763e9674e40b81dfa29f540e15aca77816040516106f69190611188565b60405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481111561076c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076390611260565b60405180910390fd5b600560009054906101000a900460ff166107bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b2906112a0565b60405180910390fd5b6108173330600354846107ce919061136d565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610ba7909392919063ffffffff16565b6108643382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610a5d9092919063ffffffff16565b7fc55650ccda1011e1cdc769b1fbf546ebb8c97800b6072b49e06cd560305b1d6733826040516108959291906111da565b60405180910390a150565b6108a8610a55565b73ffffffffffffffffffffffffffffffffffffffff166108c66105e1565b73ffffffffffffffffffffffffffffffffffffffff161461091c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610913906112c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561098c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098390611240565b60405180910390fd5b61099581610ae3565b50565b6109a0610a55565b73ffffffffffffffffffffffffffffffffffffffff166109be6105e1565b73ffffffffffffffffffffffffffffffffffffffff1614610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b906112c0565b60405180910390fd5b806003819055507fac21bacd333b316c6640fca5086322638b0a7aa4367179afd5dfcbe0a5427bc781604051610a4a9190611320565b60405180910390a150565b600033905090565b610ade8363a9059cbb60e01b8484604051602401610a7c9291906111da565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610c30565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610c2a846323b872dd60e01b858585604051602401610bc8939291906111a3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610c30565b50505050565b6000610c92826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610cf79092919063ffffffff16565b9050600081511115610cf25780806020019051810190610cb29190610f5e565b610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce890611300565b60405180910390fd5b5b505050565b6060610d068484600085610d0f565b90509392505050565b606082471015610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b90611280565b60405180910390fd5b610d5d85610e23565b610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d93906112e0565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610dc59190611171565b60006040518083038185875af1925050503d8060008114610e02576040519150601f19603f3d011682016040523d82523d6000602084013e610e07565b606091505b5091509150610e17828286610e36565b92505050949350505050565b600080823b905060008111915050919050565b60608315610e4657829050610e96565b600083511115610e595782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d919061121e565b60405180910390fd5b9392505050565b600081359050610eac8161163e565b92915050565b600081519050610ec181611655565b92915050565b600081359050610ed68161166c565b92915050565b600081519050610eeb8161166c565b92915050565b600060208284031215610f0757610f06611471565b5b6000610f1584828501610e9d565b91505092915050565b60008060408385031215610f3557610f34611471565b5b6000610f4385828601610e9d565b9250506020610f5485828601610e9d565b9150509250929050565b600060208284031215610f7457610f73611471565b5b6000610f8284828501610eb2565b91505092915050565b600060208284031215610fa157610fa0611471565b5b6000610faf84828501610ec7565b91505092915050565b600060208284031215610fce57610fcd611471565b5b6000610fdc84828501610edc565b91505092915050565b610fee816113c7565b82525050565b610ffd816113d9565b82525050565b600061100e8261133b565b6110188185611351565b935061102881856020860161140f565b80840191505092915050565b600061103f82611346565b611049818561135c565b935061105981856020860161140f565b61106281611476565b840191505092915050565b600061107a60268361135c565b915061108582611487565b604082019050919050565b600061109d60218361135c565b91506110a8826114d6565b604082019050919050565b60006110c060268361135c565b91506110cb82611525565b604082019050919050565b60006110e3601a8361135c565b91506110ee82611574565b602082019050919050565b600061110660208361135c565b91506111118261159d565b602082019050919050565b6000611129601d8361135c565b9150611134826115c6565b602082019050919050565b600061114c602a8361135c565b9150611157826115ef565b604082019050919050565b61116b81611405565b82525050565b600061117d8284611003565b915081905092915050565b600060208201905061119d6000830184610fe5565b92915050565b60006060820190506111b86000830186610fe5565b6111c56020830185610fe5565b6111d26040830184611162565b949350505050565b60006040820190506111ef6000830185610fe5565b6111fc6020830184611162565b9392505050565b60006020820190506112186000830184610ff4565b92915050565b600060208201905081810360008301526112388184611034565b905092915050565b600060208201905081810360008301526112598161106d565b9050919050565b6000602082019050818103600083015261127981611090565b9050919050565b60006020820190508181036000830152611299816110b3565b9050919050565b600060208201905081810360008301526112b9816110d6565b9050919050565b600060208201905081810360008301526112d9816110f9565b9050919050565b600060208201905081810360008301526112f98161111c565b9050919050565b600060208201905081810360008301526113198161113f565b9050919050565b60006020820190506113356000830184611162565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600061137882611405565b915061138383611405565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156113bc576113bb611442565b5b828202905092915050565b60006113d2826113e5565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101561142d578082015181840152602081019050611412565b8381111561143c576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d6f72706865757349434f3a204f7574206f6620746f6b656e20616d6f756e7460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4d6f72706865757349434f3a2049434f20697320636c6f736564000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b611647816113c7565b811461165257600080fd5b50565b61165e816113d9565b811461166957600080fd5b50565b61167581611405565b811461168057600080fd5b5056fea264697066735822122039b7353c80ba8f76d57ea04544aacd70ba9d5d826c4ebfb8043bc95cb51bd4e464736f6c6343000806003300000000000000000000000027f1b217dbc57ecdbdb346d20fb57fa34cbbb3ac000000000000000000000000874069fa1eb16d44d622f2e0ca25eea172369bc1

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638098c2d11161008c578063b6e1f63211610066578063b6e1f632146101b4578063d96a094a146101d2578063f2fde38b146101ee578063fbc94f241461020a576100cf565b80638098c2d11461015c5780638da5cb5b1461017a5780639c6293d514610198576100cf565b80631308d9f4146100d457806338ad2e55146100f0578063542386451461010c57806361ebf53114610116578063715018a6146101345780637ff9b5961461013e575b600080fd5b6100ee60048036038101906100e99190610f8b565b610226565b005b61010a60048036038101906101059190610f1e565b6102e3565b005b61011461045b565b005b61011e61053a565b60405161012b9190611320565b60405180910390f35b61013c610540565b005b6101466105c8565b6040516101539190611320565b60405180910390f35b6101646105ce565b6040516101719190611203565b60405180910390f35b6101826105e1565b60405161018f9190611188565b60405180910390f35b6101b260048036038101906101ad9190610ef1565b61060a565b005b6101bc610701565b6040516101c99190611188565b60405180910390f35b6101ec60048036038101906101e79190610f8b565b610727565b005b61020860048036038101906102039190610ef1565b6108a0565b005b610224600480360381019061021f9190610f8b565b610998565b005b61022e610a55565b73ffffffffffffffffffffffffffffffffffffffff1661024c6105e1565b73ffffffffffffffffffffffffffffffffffffffff16146102a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610299906112c0565b60405180910390fd5b806004819055507f0f87594bf9b95df8745c9a0293c381fab28736c2cf29959552e8231931b30452816040516102d89190611320565b60405180910390a150565b6102eb610a55565b73ffffffffffffffffffffffffffffffffffffffff166103096105e1565b73ffffffffffffffffffffffffffffffffffffffff161461035f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610356906112c0565b60405180910390fd5b600081905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161039f9190611188565b60206040518083038186803b1580156103b757600080fd5b505afa1580156103cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103ef9190610fb8565b905061041c84828473ffffffffffffffffffffffffffffffffffffffff16610a5d9092919063ffffffff16565b7fbea80160556933fefc2dc7c94fc4fb00066e4fb00d4de1bb17e4a8fcd14218c2838260405161044d9291906111da565b60405180910390a150505050565b610463610a55565b73ffffffffffffffffffffffffffffffffffffffff166104816105e1565b73ffffffffffffffffffffffffffffffffffffffff16146104d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ce906112c0565b60405180910390fd5b6000600560006101000a81548160ff0219169083151502179055507f9b8b56b38290aada0e4d2635f5153bc3f13aae2416937576aa2e9809e6333c06600560009054906101000a900460ff166040516105309190611203565b60405180910390a1565b60045481565b610548610a55565b73ffffffffffffffffffffffffffffffffffffffff166105666105e1565b73ffffffffffffffffffffffffffffffffffffffff16146105bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b3906112c0565b60405180910390fd5b6105c66000610ae3565b565b60035481565b600560009054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610612610a55565b73ffffffffffffffffffffffffffffffffffffffff166106306105e1565b73ffffffffffffffffffffffffffffffffffffffff1614610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067d906112c0565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ffc42e75628f57fbb516578285f391c3f1763e9674e40b81dfa29f540e15aca77816040516106f69190611188565b60405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481111561076c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076390611260565b60405180910390fd5b600560009054906101000a900460ff166107bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b2906112a0565b60405180910390fd5b6108173330600354846107ce919061136d565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610ba7909392919063ffffffff16565b6108643382600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610a5d9092919063ffffffff16565b7fc55650ccda1011e1cdc769b1fbf546ebb8c97800b6072b49e06cd560305b1d6733826040516108959291906111da565b60405180910390a150565b6108a8610a55565b73ffffffffffffffffffffffffffffffffffffffff166108c66105e1565b73ffffffffffffffffffffffffffffffffffffffff161461091c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610913906112c0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561098c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098390611240565b60405180910390fd5b61099581610ae3565b50565b6109a0610a55565b73ffffffffffffffffffffffffffffffffffffffff166109be6105e1565b73ffffffffffffffffffffffffffffffffffffffff1614610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b906112c0565b60405180910390fd5b806003819055507fac21bacd333b316c6640fca5086322638b0a7aa4367179afd5dfcbe0a5427bc781604051610a4a9190611320565b60405180910390a150565b600033905090565b610ade8363a9059cbb60e01b8484604051602401610a7c9291906111da565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610c30565b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b610c2a846323b872dd60e01b858585604051602401610bc8939291906111a3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050610c30565b50505050565b6000610c92826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16610cf79092919063ffffffff16565b9050600081511115610cf25780806020019051810190610cb29190610f5e565b610cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce890611300565b60405180910390fd5b5b505050565b6060610d068484600085610d0f565b90509392505050565b606082471015610d54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4b90611280565b60405180910390fd5b610d5d85610e23565b610d9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d93906112e0565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051610dc59190611171565b60006040518083038185875af1925050503d8060008114610e02576040519150601f19603f3d011682016040523d82523d6000602084013e610e07565b606091505b5091509150610e17828286610e36565b92505050949350505050565b600080823b905060008111915050919050565b60608315610e4657829050610e96565b600083511115610e595782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d919061121e565b60405180910390fd5b9392505050565b600081359050610eac8161163e565b92915050565b600081519050610ec181611655565b92915050565b600081359050610ed68161166c565b92915050565b600081519050610eeb8161166c565b92915050565b600060208284031215610f0757610f06611471565b5b6000610f1584828501610e9d565b91505092915050565b60008060408385031215610f3557610f34611471565b5b6000610f4385828601610e9d565b9250506020610f5485828601610e9d565b9150509250929050565b600060208284031215610f7457610f73611471565b5b6000610f8284828501610eb2565b91505092915050565b600060208284031215610fa157610fa0611471565b5b6000610faf84828501610ec7565b91505092915050565b600060208284031215610fce57610fcd611471565b5b6000610fdc84828501610edc565b91505092915050565b610fee816113c7565b82525050565b610ffd816113d9565b82525050565b600061100e8261133b565b6110188185611351565b935061102881856020860161140f565b80840191505092915050565b600061103f82611346565b611049818561135c565b935061105981856020860161140f565b61106281611476565b840191505092915050565b600061107a60268361135c565b915061108582611487565b604082019050919050565b600061109d60218361135c565b91506110a8826114d6565b604082019050919050565b60006110c060268361135c565b91506110cb82611525565b604082019050919050565b60006110e3601a8361135c565b91506110ee82611574565b602082019050919050565b600061110660208361135c565b91506111118261159d565b602082019050919050565b6000611129601d8361135c565b9150611134826115c6565b602082019050919050565b600061114c602a8361135c565b9150611157826115ef565b604082019050919050565b61116b81611405565b82525050565b600061117d8284611003565b915081905092915050565b600060208201905061119d6000830184610fe5565b92915050565b60006060820190506111b86000830186610fe5565b6111c56020830185610fe5565b6111d26040830184611162565b949350505050565b60006040820190506111ef6000830185610fe5565b6111fc6020830184611162565b9392505050565b60006020820190506112186000830184610ff4565b92915050565b600060208201905081810360008301526112388184611034565b905092915050565b600060208201905081810360008301526112598161106d565b9050919050565b6000602082019050818103600083015261127981611090565b9050919050565b60006020820190508181036000830152611299816110b3565b9050919050565b600060208201905081810360008301526112b9816110d6565b9050919050565b600060208201905081810360008301526112d9816110f9565b9050919050565b600060208201905081810360008301526112f98161111c565b9050919050565b600060208201905081810360008301526113198161113f565b9050919050565b60006020820190506113356000830184611162565b92915050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600061137882611405565b915061138383611405565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156113bc576113bb611442565b5b828202905092915050565b60006113d2826113e5565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101561142d578082015181840152602081019050611412565b8381111561143c576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d6f72706865757349434f3a204f7574206f6620746f6b656e20616d6f756e7460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4d6f72706865757349434f3a2049434f20697320636c6f736564000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b611647816113c7565b811461165257600080fd5b50565b61165e816113d9565b811461166957600080fd5b50565b61167581611405565b811461168057600080fd5b5056fea264697066735822122039b7353c80ba8f76d57ea04544aacd70ba9d5d826c4ebfb8043bc95cb51bd4e464736f6c63430008060033