Address Details
contract
token

0x207856B02b264b7C60fdE304658d683184254330

Token
0x207856-254330
Creator
0x6c9679–3b6aa3 at 0xe98cd6–db0a2f
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
54 Transactions
Transfers
26 Transfers
Gas Used
11,930,773
Last Balance Update
18937684
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
TravelSaver




Optimization enabled
false
Compiler version
v0.8.17+commit.8df45f5f




EVM Version
london




Verified at
2023-01-20T12:27:46.274733Z

contracts/TravelSaver.sol

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

import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

// import "/home/karolsudol/flywallet/TravelSaver/node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol";

/**
 * @title Travel Saving Vault with Recurring Payments Scheduler
 */
contract TravelSaver {
    // ***** ***** EVENTS ***** *****

    /**
     * @notice Emitted when a TravelPlan is created
     *
     * @param ID uniqe plan's ID
     * @param owner user who created it
     * @param travelPlan a plan's details
     */
    event CreatedTravelPlan(
        uint256 indexed ID,
        address indexed owner,
        TravelPlan travelPlan
    );

    /**
     * @notice Emitted when a token transfer is made to each TravelPlan
     *
     * @param ID uniqe plan's ID
     * @param contributor address that made a transfer
     * @param amount an ERC20 unit as per its decimals
     */
    event ContributeToTravelPlan(
        uint256 indexed ID,
        address indexed contributor,
        uint256 amount
    );

    /**
     * @notice Emitted when a user makes a withdrawl towards a booking
     *
     * @param ID uniqe plan's ID
     * @param owner address that received a transfer
     * @param amount an ERC20 unit as per its decimals
     */
    event ClaimTravelPlan(uint256 indexed ID, address owner, uint256 amount);

    /**
     * @notice Emitted when a user makes a withdrawl towards a booking
     *
     * @param from address that made a transfer
     * @param to address that received a transfer
     * @param amount an ERC20 unit as per its decimals
     */
    event Transfer(address indexed from, address indexed to, uint256 amount);

    /**
     * @notice Emitted when a PaymentPlan is created
     *
     * @param ID uniqe plan's ID
     * @param owner user who created it
     * @param paymentPlan a plan's details
     */
    event CreatedPaymentPlan(
        uint256 indexed ID,
        address indexed owner,
        PaymentPlan paymentPlan
    );

    /**
     * @notice Emitted when a PaymentPlan is cancelled before scheduled payments are made
     *
     * @param ID uniqe plan's ID
     * @param owner user who created it
     * @param paymentPlan a plan's details
     */
    event CancelPaymentPlan(
        uint256 indexed ID,
        address indexed owner,
        PaymentPlan paymentPlan
    );

    /**
     * @notice Emitted when a PaymentPlan scheduled payment has been sucessfully made
     *
     * @param ID uniqe plan's ID
     * @param callableOn unix TS of next scheduled payment
     * @param amount an ERC20 unit as per its decimals
     * @param intervalNo sequential scheduled payment count
     */
    event StartPaymentPlanInterval(
        uint256 indexed ID,
        uint256 indexed callableOn,
        uint256 indexed amount,
        uint256 intervalNo
    );

    /**
     * @notice Emitted when a PaymentPlan scheduled payment has been sucessfully made
     *
     * @param ID uniqe plan's ID
     * @param intervalNo sequential scheduled payment count
     */
    event PaymentPlanIntervalEnded(
        uint256 indexed ID,
        uint256 indexed intervalNo
    );

    /**
     * @notice Emitted when a PaymentPlan has ended as scheduled, after last payment
     *
     * @param ID uniqe plan's ID
     * @param owner user who created it
     * @param paymentPlan a plan's details
     */
    event EndPaymentPlan(
        uint256 indexed ID,
        address indexed owner,
        PaymentPlan paymentPlan
    );
    // ***** ***** STRUCTS ***** *****

    /**
     * @notice TravelPlan is a vault where users funds are retained until the booking
     *
     * @param owner user's wallet address, plan creator, who can transfer money out to operators wallet -> make a booking
     * @param ID unique identifier within the contract generated sequencially
     * @param operatorPlanID operator's reference booking identifier
     * @param operatorUserID operator's reference user identifier
     * @param contributedAmount current ammount available for a whithdrawal
     * @param createdAt the creation date
     * @param claimedAt last clamied date
     * @param claimed true if it has been clamimed in the past
     */
    struct TravelPlan {
        address owner;
        uint256 ID;
        uint256 operatorPlanID;
        uint256 operatorUserID;
        uint256 contributedAmount;
        uint256 createdAt;
        uint256 claimedAt;
        bool claimed;
    }

    /**
     * @notice PaymentPlan is a recurring payments scheduler that must target specific TravelPlan
     *
     * @param travelPlanID id reference to a vault id where funds will be sent to
     * @param ID unique identifier within the contract generated sequencially
     * @param totalAmount the planned value of a total savings to be scheduled
     * @param amountSent the current state of all payments made
     * @param amountPerInterval unit value of a specific ERC-20 token to be sent per each scheduled payment
     * @param totalIntervals total number of scheduled payments
     * @param intervalsProcessed cuurent number of processed payments
     * @param nextTransferOn unix secs TS of a next scheduled payment due at
     * @param interval current interval count
     * @param sender the owner of the plan - might be different to the TravelPlan
     * @param alive determined whether plan is active or cancelled
     */
    struct PaymentPlan {
        uint256 travelPlanID;
        uint256 ID;
        uint256 totalAmount;
        uint256 amountSent;
        uint256 amountPerInterval;
        uint256 totalIntervals;
        uint256 intervalsProcessed;
        uint256 nextTransferOn;
        uint256 interval;
        address sender;
        bool alive;
    }

    // ***** ***** STATE-VARIABLES ***** *****

    address public immutable operatorWallet; // hardcoded address of the operator wallet where funds are send from teh travel-plan
    IERC20 public immutable token; // hardcoded address of the ERC20 stable token that serves a currency of the contract

    uint256 travelPlanCount; // current number of contract's created travel-plans
    uint256 paymentPlanCount; // current number of contract's created payment-plans

    mapping(uint256 => TravelPlan) public travelPlans; // TravelPlan reference by ID
    mapping(uint256 => PaymentPlan) public paymentPlans; // PaymentPlan referenced by ID

    // mapping(uint256 => mapping(address => uint256)) public contributedAmount; // ID

    constructor(address ERC20_, address operatorWallet_) {
        token = IERC20(ERC20_);
        operatorWallet = operatorWallet_;
    }

    /**
     ***** ***** VIEW-FUNCTIONS ***** *****
     */

    /**
     * @notice receive Plans state
     *
     * @param ID uniqe plan's ID
     */
    function getTravelPlanDetails(uint256 ID)
        external
        view
        returns (TravelPlan memory)
    {
        return travelPlans[ID];
    }

    /**
     * @notice receive plans state
     *
     * @param ID uniqe plan's ID
     */
    function getPaymentPlanDetails(uint256 ID)
        external
        view
        returns (PaymentPlan memory)
    {
        return paymentPlans[ID];
    }

    /**
     ***** ***** STATE-CHANGING-EXTERNAL-FUNCTIONS ***** *****
     */

    /**
     * @dev create Travel Plan and New Payment Plan attached to it in one go
     *
     * @param operatorPlanID_ The plan id provided by the operator.
     * @param operatorUserID_ The user id provided by the operator.
     * @param amountPerInterval unit value of a specific ERC-20 token to be sent per each scheduled payment
     * @param totalIntervals total number of payments to be scheduled
     * @param intervalLength time distance between each payments in seconds
     *
     * @return travelPlanID paymentPlanID new sequential count based UUIDs
     *
     * Emits a {CreatedTravelPlan, CreatedPaymentPlan} event.
     */
    function createTravelPaymentPlan(
        uint256 operatorPlanID_,
        uint256 operatorUserID_,
        uint256 amountPerInterval,
        uint256 totalIntervals,
        uint256 intervalLength
    ) external returns (uint256 travelPlanID, uint256 paymentPlanID) {
        travelPlanID = createTravelPlan(operatorPlanID_, operatorUserID_);
        paymentPlanID = createPaymentPlan(
            travelPlanID,
            amountPerInterval,
            totalIntervals,
            intervalLength
        );
        return (travelPlanID, paymentPlanID);
    }

    /**
     * @dev create Travel Plan where user will store his/hers savings until the booking date
     *
     * @param operatorPlanID_ The plan id provided by the operator.
     * @param operatorUserID_ The user id provided by the operator.
     *
     * @return travelPlanCount  a new sequential count based UUID
     *
     * Emits a {CreatedTravelPlan} event.
     */
    function createTravelPlan(uint256 operatorPlanID_, uint256 operatorUserID_)
        public
        returns (uint256)
    {
        travelPlanCount += 1;

        travelPlans[travelPlanCount] = TravelPlan({
            owner: msg.sender,
            ID: travelPlanCount,
            operatorPlanID: operatorPlanID_,
            operatorUserID: operatorUserID_,
            contributedAmount: 0,
            createdAt: block.timestamp,
            claimedAt: 0,
            claimed: false
        });

        emit CreatedTravelPlan(
            travelPlanCount,
            msg.sender,
            travelPlans[travelPlanCount]
        );
        return travelPlanCount;
    }

    /**
     * @dev allows to transfer ERC20 token to specific TravelPlan by anyone
     *
     * @param ID TravelPlan existing UUID
     * @param amount ERC20 token value defined by its decimals
     *
     * Emits a {ContributeToTravelPlan, Transfer} event.
     */
    function contributeToTravelPlan(uint256 ID, uint256 amount) external {
        TravelPlan storage plan = travelPlans[ID];
        require(plan.ID == ID, "doesn't exist");

        plan.contributedAmount += amount;

        token.transferFrom(msg.sender, address(this), amount);

        emit ContributeToTravelPlan(ID, msg.sender, amount);
        emit Transfer(msg.sender, address(this), amount);
    }

    /**
     * @dev allows to transfer ERC20 token from specific TravelPlan to operators wallet to make a booking only by the user/owner
     *
     * @param ID TravelPlan existing UUID
     * @param value ERC20 token value defined by its decimals
     *
     * Emits a {ClaimTravelPlan, Transfer} event.
     */
    function claimTravelPlan(uint256 ID, uint256 value) external {
        TravelPlan storage plan = travelPlans[ID];
        require(plan.ID == ID, "doesn't exist");
        require(plan.owner == msg.sender, "not owner");
        require(plan.contributedAmount >= value, "insufficient funds");
        plan.contributedAmount -= value;
        token.transfer(operatorWallet, value);
        plan.claimed = true;
        plan.claimedAt = block.timestamp;
        emit ClaimTravelPlan(ID, msg.sender, value);
        emit Transfer(address(this), operatorWallet, value);
    }

    /**
     * @dev creates a new payment plan targeting existing travel-plan along with its sheduled payments details
     *
     * @param _travelPlanID The plan id provided by the operator.
     * @param amountPerInterval unit value of a specific ERC-20 token to be sent per each scheduled payment
     * @param totalIntervals total number of payments to be scheduled
     * @param intervalLength time distance between each payments in seconds
     *
     * @return id  a new sequential count based UUID
     *
     * Emits a {CreatedPaymentPlan} event.
     */
    function createPaymentPlan(
        uint256 _travelPlanID,
        uint256 amountPerInterval,
        uint256 totalIntervals,
        uint256 intervalLength
    ) public returns (uint256) {
        uint256 totalToTransfer = amountPerInterval * totalIntervals;
        require(
            IERC20(token).allowance(msg.sender, address(this)) >=
                totalToTransfer,
            "ERC20: insufficient allowance"
        );
        TravelPlan memory plan = travelPlans[_travelPlanID];
        require(plan.ID == _travelPlanID, "doesn't exist");
        uint256 id = ++paymentPlanCount;

        paymentPlans[id] = PaymentPlan({
            travelPlanID: _travelPlanID,
            ID: id,
            totalAmount: totalIntervals * amountPerInterval,
            amountSent: 0,
            amountPerInterval: amountPerInterval,
            totalIntervals: totalIntervals,
            intervalsProcessed: 0,
            nextTransferOn: 0,
            interval: intervalLength,
            sender: msg.sender,
            alive: true
        });
        _startInterval(id);

        emit CreatedPaymentPlan(id, msg.sender, paymentPlans[id]);

        return id;
    }

    /**
     * @dev cancelPaymentPlan cancels existing payment schedule before its plannned due date
     *
     * @param ID TravelPlan existing UUID
     *
     * Emits a {CancelPaymentPlan} event.
     */
    function cancelPaymentPlan(uint256 ID) external {
        require(msg.sender == paymentPlans[ID].sender, "only plan owner");
        _endPaymentPlan(ID);

        emit CancelPaymentPlan(ID, msg.sender, paymentPlans[ID]);
    }

    /**
     * @dev runInterval executes scheduled payment
     *
     * @param ID PaymentPlan existing UUID
     */
    function runInterval(uint256 ID) external {
        _fulfillPaymentPlanInterval(ID);
    }

    /**
     * @dev runIntervals executes scheduled payment as a batch
     *
     * @param IDs PaymentPlan existing UUIDs
     */
    function runIntervals(uint256[] memory IDs) external {
        for (uint256 i = 0; i < IDs.length; i++) {
            _fulfillPaymentPlanInterval(IDs[i]);
        }
    }

    /**
     ***** ***** STATE-CHANGING-PRIVATE-FUNCTIONS ***** *****
     */

    /**
     * @dev _startInterval sets new payment schedule
     *
     * @param ID PaymentPlan existing UUIDs
     *
     * Emits a {StartPaymentPlanInterval} event.
     */
    function _startInterval(uint256 ID) internal {
        PaymentPlan memory plan = paymentPlans[ID];
        uint256 callableOn = paymentPlans[ID].interval + block.timestamp;
        uint256 intervalNumber = plan.intervalsProcessed + 1;
        paymentPlans[ID].nextTransferOn = callableOn;

        emit StartPaymentPlanInterval(
            ID,
            callableOn,
            plan.amountPerInterval,
            intervalNumber
        );
    }

    /**
     * @dev _endPaymentPlan ends payment plan
     *
     * @param ID PaymentPlan existing UUIDs
     *
     * Emits a {EndPaymentPlan} event.
     */
    function _endPaymentPlan(uint256 ID) internal {
        PaymentPlan memory plan = paymentPlans[ID];
        paymentPlans[ID].alive = false;
        emit EndPaymentPlan(ID, plan.sender, plan);
    }

    /**
     * @dev _contributeToTravelPlan executes scheduled payments internaly by transfering tokens from user to the vault - used by a off chain worker
     *
     * @param ID PaymentPlan existing UUIDs
     * @param amount ERC20 token value defined by its decimals
     * @param caller address of a contract that executes transaction on behalf of the user
     *
     * Emits a {ContributeToTravelPlan, Transfer} event.
     */
    function _contributeToTravelPlan(
        uint256 ID,
        uint256 amount,
        address caller
    ) internal {
        TravelPlan storage plan = travelPlans[ID];
        // require(block.timestamp >= plan.createdAt, "doesn't exist");
        require(plan.ID == ID, "doesn't exist");

        plan.contributedAmount += amount;

        // contributedAmount[ID][caller] += amount;
        token.transferFrom(caller, address(this), amount);

        emit ContributeToTravelPlan(ID, caller, amount);
        emit Transfer(caller, address(this), amount);
    }

    /**
     * @dev _fulfillPaymentPlanInterval executes scheduled payments internaly
     *
     * @param ID PaymentPlan existing UUIDs
     *
     * Emits a {PaymentPlanIntervalEnded} event.
     */
    function _fulfillPaymentPlanInterval(uint256 ID) internal {
        PaymentPlan memory plan = paymentPlans[ID];

        uint256 amountToTransfer = plan.amountPerInterval;
        address sender = plan.sender;
        uint256 interval = plan.intervalsProcessed + 1;
        require(plan.nextTransferOn <= block.timestamp, "too early");
        require(plan.alive, "plan ended");

        // Check conditions here with an if clause instead of require, so that integrators dont have to keep track of balances
        if (
            token.balanceOf(sender) >= amountToTransfer &&
            token.allowance(sender, address(this)) >= amountToTransfer
        ) {
            _contributeToTravelPlan(
                plan.travelPlanID,
                amountToTransfer,
                sender
            );

            paymentPlans[ID].amountSent += amountToTransfer;
            paymentPlans[ID].intervalsProcessed = interval;

            emit PaymentPlanIntervalEnded(ID, interval);

            if (interval < plan.totalIntervals) {
                _startInterval(ID);
            } else {
                _endPaymentPlan(ID);
            }
        }
    }
}
        

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"ERC20_","internalType":"address"},{"type":"address","name":"operatorWallet_","internalType":"address"}]},{"type":"event","name":"CancelPaymentPlan","inputs":[{"type":"uint256","name":"ID","internalType":"uint256","indexed":true},{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"tuple","name":"paymentPlan","internalType":"struct TravelSaver.PaymentPlan","indexed":false,"components":[{"type":"uint256","name":"travelPlanID","internalType":"uint256"},{"type":"uint256","name":"ID","internalType":"uint256"},{"type":"uint256","name":"totalAmount","internalType":"uint256"},{"type":"uint256","name":"amountSent","internalType":"uint256"},{"type":"uint256","name":"amountPerInterval","internalType":"uint256"},{"type":"uint256","name":"totalIntervals","internalType":"uint256"},{"type":"uint256","name":"intervalsProcessed","internalType":"uint256"},{"type":"uint256","name":"nextTransferOn","internalType":"uint256"},{"type":"uint256","name":"interval","internalType":"uint256"},{"type":"address","name":"sender","internalType":"address"},{"type":"bool","name":"alive","internalType":"bool"}]}],"anonymous":false},{"type":"event","name":"ClaimTravelPlan","inputs":[{"type":"uint256","name":"ID","internalType":"uint256","indexed":true},{"type":"address","name":"owner","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ContributeToTravelPlan","inputs":[{"type":"uint256","name":"ID","internalType":"uint256","indexed":true},{"type":"address","name":"contributor","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"CreatedPaymentPlan","inputs":[{"type":"uint256","name":"ID","internalType":"uint256","indexed":true},{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"tuple","name":"paymentPlan","internalType":"struct TravelSaver.PaymentPlan","indexed":false,"components":[{"type":"uint256","name":"travelPlanID","internalType":"uint256"},{"type":"uint256","name":"ID","internalType":"uint256"},{"type":"uint256","name":"totalAmount","internalType":"uint256"},{"type":"uint256","name":"amountSent","internalType":"uint256"},{"type":"uint256","name":"amountPerInterval","internalType":"uint256"},{"type":"uint256","name":"totalIntervals","internalType":"uint256"},{"type":"uint256","name":"intervalsProcessed","internalType":"uint256"},{"type":"uint256","name":"nextTransferOn","internalType":"uint256"},{"type":"uint256","name":"interval","internalType":"uint256"},{"type":"address","name":"sender","internalType":"address"},{"type":"bool","name":"alive","internalType":"bool"}]}],"anonymous":false},{"type":"event","name":"CreatedTravelPlan","inputs":[{"type":"uint256","name":"ID","internalType":"uint256","indexed":true},{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"tuple","name":"travelPlan","internalType":"struct TravelSaver.TravelPlan","indexed":false,"components":[{"type":"address","name":"owner","internalType":"address"},{"type":"uint256","name":"ID","internalType":"uint256"},{"type":"uint256","name":"operatorPlanID","internalType":"uint256"},{"type":"uint256","name":"operatorUserID","internalType":"uint256"},{"type":"uint256","name":"contributedAmount","internalType":"uint256"},{"type":"uint256","name":"createdAt","internalType":"uint256"},{"type":"uint256","name":"claimedAt","internalType":"uint256"},{"type":"bool","name":"claimed","internalType":"bool"}]}],"anonymous":false},{"type":"event","name":"EndPaymentPlan","inputs":[{"type":"uint256","name":"ID","internalType":"uint256","indexed":true},{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"tuple","name":"paymentPlan","internalType":"struct TravelSaver.PaymentPlan","indexed":false,"components":[{"type":"uint256","name":"travelPlanID","internalType":"uint256"},{"type":"uint256","name":"ID","internalType":"uint256"},{"type":"uint256","name":"totalAmount","internalType":"uint256"},{"type":"uint256","name":"amountSent","internalType":"uint256"},{"type":"uint256","name":"amountPerInterval","internalType":"uint256"},{"type":"uint256","name":"totalIntervals","internalType":"uint256"},{"type":"uint256","name":"intervalsProcessed","internalType":"uint256"},{"type":"uint256","name":"nextTransferOn","internalType":"uint256"},{"type":"uint256","name":"interval","internalType":"uint256"},{"type":"address","name":"sender","internalType":"address"},{"type":"bool","name":"alive","internalType":"bool"}]}],"anonymous":false},{"type":"event","name":"PaymentPlanIntervalEnded","inputs":[{"type":"uint256","name":"ID","internalType":"uint256","indexed":true},{"type":"uint256","name":"intervalNo","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"StartPaymentPlanInterval","inputs":[{"type":"uint256","name":"ID","internalType":"uint256","indexed":true},{"type":"uint256","name":"callableOn","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":true},{"type":"uint256","name":"intervalNo","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancelPaymentPlan","inputs":[{"type":"uint256","name":"ID","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimTravelPlan","inputs":[{"type":"uint256","name":"ID","internalType":"uint256"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"contributeToTravelPlan","inputs":[{"type":"uint256","name":"ID","internalType":"uint256"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"createPaymentPlan","inputs":[{"type":"uint256","name":"_travelPlanID","internalType":"uint256"},{"type":"uint256","name":"amountPerInterval","internalType":"uint256"},{"type":"uint256","name":"totalIntervals","internalType":"uint256"},{"type":"uint256","name":"intervalLength","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"travelPlanID","internalType":"uint256"},{"type":"uint256","name":"paymentPlanID","internalType":"uint256"}],"name":"createTravelPaymentPlan","inputs":[{"type":"uint256","name":"operatorPlanID_","internalType":"uint256"},{"type":"uint256","name":"operatorUserID_","internalType":"uint256"},{"type":"uint256","name":"amountPerInterval","internalType":"uint256"},{"type":"uint256","name":"totalIntervals","internalType":"uint256"},{"type":"uint256","name":"intervalLength","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"createTravelPlan","inputs":[{"type":"uint256","name":"operatorPlanID_","internalType":"uint256"},{"type":"uint256","name":"operatorUserID_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct TravelSaver.PaymentPlan","components":[{"type":"uint256","name":"travelPlanID","internalType":"uint256"},{"type":"uint256","name":"ID","internalType":"uint256"},{"type":"uint256","name":"totalAmount","internalType":"uint256"},{"type":"uint256","name":"amountSent","internalType":"uint256"},{"type":"uint256","name":"amountPerInterval","internalType":"uint256"},{"type":"uint256","name":"totalIntervals","internalType":"uint256"},{"type":"uint256","name":"intervalsProcessed","internalType":"uint256"},{"type":"uint256","name":"nextTransferOn","internalType":"uint256"},{"type":"uint256","name":"interval","internalType":"uint256"},{"type":"address","name":"sender","internalType":"address"},{"type":"bool","name":"alive","internalType":"bool"}]}],"name":"getPaymentPlanDetails","inputs":[{"type":"uint256","name":"ID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct TravelSaver.TravelPlan","components":[{"type":"address","name":"owner","internalType":"address"},{"type":"uint256","name":"ID","internalType":"uint256"},{"type":"uint256","name":"operatorPlanID","internalType":"uint256"},{"type":"uint256","name":"operatorUserID","internalType":"uint256"},{"type":"uint256","name":"contributedAmount","internalType":"uint256"},{"type":"uint256","name":"createdAt","internalType":"uint256"},{"type":"uint256","name":"claimedAt","internalType":"uint256"},{"type":"bool","name":"claimed","internalType":"bool"}]}],"name":"getTravelPlanDetails","inputs":[{"type":"uint256","name":"ID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"operatorWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"travelPlanID","internalType":"uint256"},{"type":"uint256","name":"ID","internalType":"uint256"},{"type":"uint256","name":"totalAmount","internalType":"uint256"},{"type":"uint256","name":"amountSent","internalType":"uint256"},{"type":"uint256","name":"amountPerInterval","internalType":"uint256"},{"type":"uint256","name":"totalIntervals","internalType":"uint256"},{"type":"uint256","name":"intervalsProcessed","internalType":"uint256"},{"type":"uint256","name":"nextTransferOn","internalType":"uint256"},{"type":"uint256","name":"interval","internalType":"uint256"},{"type":"address","name":"sender","internalType":"address"},{"type":"bool","name":"alive","internalType":"bool"}],"name":"paymentPlans","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"runInterval","inputs":[{"type":"uint256","name":"ID","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"runIntervals","inputs":[{"type":"uint256[]","name":"IDs","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC20"}],"name":"token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"uint256","name":"ID","internalType":"uint256"},{"type":"uint256","name":"operatorPlanID","internalType":"uint256"},{"type":"uint256","name":"operatorUserID","internalType":"uint256"},{"type":"uint256","name":"contributedAmount","internalType":"uint256"},{"type":"uint256","name":"createdAt","internalType":"uint256"},{"type":"uint256","name":"claimedAt","internalType":"uint256"},{"type":"bool","name":"claimed","internalType":"bool"}],"name":"travelPlans","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]}]
              

Contract Creation Code

0x60c06040523480156200001157600080fd5b5060405162002d7438038062002d74833981810160405281019062000037919062000111565b8173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050505062000158565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000d982620000ac565b9050919050565b620000eb81620000cc565b8114620000f757600080fd5b50565b6000815190506200010b81620000e0565b92915050565b600080604083850312156200012b576200012a620000a7565b5b60006200013b85828601620000fa565b92505060206200014e85828601620000fa565b9150509250929050565b60805160a051612bbe620001b6600039600081816103390152818161078201528181610e1b015281816111e3015281816113aa0152818161144e0152611918015260008181610e5701528181610f3a01526111bf0152612bbe6000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80639d9206881161008c578063d955bdc911610066578063d955bdc91461027d578063ddbf07f9146102ad578063f90ef4ac146102dd578063fc0c546a146102fb576100ea565b80639d920688146101f6578063a601c2c614610230578063aaec77e51461024c576100ea565b80634e581547116100c85780634e5815471461015757806385fcc9a2146101735780638818e165146101a357806390513e1a146101da576100ea565b80630cf9e555146100ef578063223f83e21461010b5780632b06fa741461013b575b600080fd5b61010960048036038101906101049190611b8a565b610319565b005b61012560048036038101906101209190611bb7565b610325565b6040516101329190611c2d565b60405180910390f35b61015560048036038101906101509190611c48565b610708565b005b610171600480360381019061016c9190611de1565b6108da565b005b61018d60048036038101906101889190611c48565b610920565b60405161019a9190611c2d565b60405180910390f35b6101bd60048036038101906101b89190611b8a565b610abb565b6040516101d1989796959493929190611e86565b60405180910390f35b6101f460048036038101906101ef9190611b8a565b610b30565b005b610210600480360381019061020b9190611b8a565b610c41565b6040516102279b9a99989796959493929190611f04565b60405180910390f35b61024a60048036038101906102459190611c48565b610cc8565b005b61026660048036038101906102619190611faf565b610fc2565b60405161027492919061202a565b60405180910390f35b61029760048036038101906102929190611b8a565b610fe9565b6040516102a49190612161565b60405180910390f35b6102c760048036038101906102c29190611b8a565b6110e2565b6040516102d4919061221f565b60405180910390f35b6102e56111bd565b6040516102f2919061223b565b60405180910390f35b6103036111e1565b60405161031091906122b5565b60405180910390f35b61032281611205565b50565b600080838561033491906122ff565b9050807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401610392929190612341565b602060405180830381865afa1580156103af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d3919061237f565b1015610414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040b90612409565b60405180910390fd5b600060026000888152602001908152602001600020604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900460ff16151515158152505090508681602001511461052a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052190612475565b60405180910390fd5b600060016000815461053b90612495565b9190508190559050604051806101600160405280898152602001828152602001888861056791906122ff565b81526020016000815260200188815260200187815260200160008152602001600081526020018681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020016001151581525060036000838152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801556101208201518160090160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101408201518160090160146101000a81548160ff021916908315150217905550905050610699816115a1565b3373ffffffffffffffffffffffffffffffffffffffff16817ffd671f7182c83d1e07d1bd1748354402aa8a9193629cad7a0fbaac5c8ffe2818600360008581526020019081526020016000206040516106f291906126ce565b60405180910390a3809350505050949350505050565b600060026000848152602001908152602001600020905082816001015414610765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075c90612475565b60405180910390fd5b8181600401600082825461077991906126ea565b925050819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016107dd9392919061271e565b6020604051808303816000875af11580156107fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108209190612781565b503373ffffffffffffffffffffffffffffffffffffffff16837f20c5b66cd5e4a4148323852541307bd30d5674f62e2247aefbd3dbae8be5e918846040516108689190611c2d565b60405180910390a33073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108cd9190611c2d565b60405180910390a3505050565b60005b815181101561091c576109098282815181106108fc576108fb6127ae565b5b6020026020010151611205565b808061091490612495565b9150506108dd565b5050565b6000600160008082825461093491906126ea565b925050819055506040518061010001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020016000548152602001848152602001838152602001600081526020014281526020016000815260200160001515815250600260008054815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff0219169083151502179055509050503373ffffffffffffffffffffffffffffffffffffffff166000547f71acf40162e8307c5fd5ec4e08cd622f5e5d29c2b1982af5421d95c0b1d117cf6002600080548152602001908152602001600020604051610aa891906128f3565b60405180910390a3600054905092915050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154908060060154908060070160009054906101000a900460ff16905088565b6003600082815260200190815260200160002060090160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9061295b565b60405180910390fd5b610bdd81611729565b3373ffffffffffffffffffffffffffffffffffffffff16817f1508b4f1d043dd53494e9f162026083edd68e32aa1e6e2d8818021c384fe080a60036000858152602001908152602001600020604051610c3691906126ce565b60405180910390a350565b60036020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060080154908060090160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060090160149054906101000a900460ff1690508b565b600060026000848152602001908152602001600020905082816001015414610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c90612475565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae906129c7565b60405180910390fd5b8181600401541015610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590612a33565b60405180910390fd5b81816004016000828254610e129190612a53565b925050819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000846040518363ffffffff1660e01b8152600401610e94929190612a87565b6020604051808303816000875af1158015610eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed79190612781565b5060018160070160006101000a81548160ff021916908315150217905550428160060181905550827f486095ee3674fb24bd0a2fcf31db414056448c4f6e206484eae4bcbb17fea35a3384604051610f30929190612a87565b60405180910390a27f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610fb59190611c2d565b60405180910390a3505050565b600080610fcf8787610920565b9150610fdd82868686610325565b90509550959350505050565b610ff1611a71565b60036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff1615151515815250509050919050565b6110ea611ae3565b60026000838152602001908152602001600020604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900460ff1615151515815250509050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600060036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff161515151581525050905060008160800151905060008261012001519050600060018460c0015161131991906126ea565b9050428460e001511115611362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135990612afc565b60405180910390fd5b8361014001516113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e90612b68565b60405180910390fd5b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611401919061223b565b602060405180830381865afa15801561141e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611442919061237f565b101580156114eb5750827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84306040518363ffffffff1660e01b81526004016114a7929190612341565b602060405180830381865afa1580156114c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e8919061237f565b10155b1561159a576114ff8460000151848461189e565b8260036000878152602001908152602001600020600301600082825461152591906126ea565b9250508190555080600360008781526020019081526020016000206006018190555080857fbec3f63cb2d17ab9edd65a1a7ab167efd9802d37681c490ed1b215c6995bb3cb60405160405180910390a38360a0015181101561158f5761158a856115a1565b611599565b61159885611729565b5b5b5050505050565b600060036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff161515151581525050905060004260036000858152602001908152602001600020600801546116b391906126ea565b9050600060018360c001516116c891906126ea565b9050816003600086815260200190815260200160002060070181905550826080015182857f7191b4f9ba2ec111b9ae2a916ba78702dfbfe79ca993c2ce4321ff79a52a4c9c8460405161171b9190611c2d565b60405180910390a450505050565b600060036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff161515151581525050905060006003600084815260200190815260200160002060090160146101000a81548160ff02191690831515021790555080610120015173ffffffffffffffffffffffffffffffffffffffff16827f5e2829107023b345d1e5d6a90c0485ea550de003591f622a48dd48034b80486b836040516118929190612161565b60405180910390a35050565b6000600260008581526020019081526020016000209050838160010154146118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290612475565b60405180910390fd5b8281600401600082825461190f91906126ea565b925050819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd8330866040518463ffffffff1660e01b81526004016119739392919061271e565b6020604051808303816000875af1158015611992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b69190612781565b508173ffffffffffffffffffffffffffffffffffffffff16847f20c5b66cd5e4a4148323852541307bd30d5674f62e2247aefbd3dbae8be5e918856040516119fe9190611c2d565b60405180910390a33073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051611a639190611c2d565b60405180910390a350505050565b604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581525090565b604051806101000160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b611b6781611b54565b8114611b7257600080fd5b50565b600081359050611b8481611b5e565b92915050565b600060208284031215611ba057611b9f611b4a565b5b6000611bae84828501611b75565b91505092915050565b60008060008060808587031215611bd157611bd0611b4a565b5b6000611bdf87828801611b75565b9450506020611bf087828801611b75565b9350506040611c0187828801611b75565b9250506060611c1287828801611b75565b91505092959194509250565b611c2781611b54565b82525050565b6000602082019050611c426000830184611c1e565b92915050565b60008060408385031215611c5f57611c5e611b4a565b5b6000611c6d85828601611b75565b9250506020611c7e85828601611b75565b9150509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611cd682611c8d565b810181811067ffffffffffffffff82111715611cf557611cf4611c9e565b5b80604052505050565b6000611d08611b40565b9050611d148282611ccd565b919050565b600067ffffffffffffffff821115611d3457611d33611c9e565b5b602082029050602081019050919050565b600080fd5b6000611d5d611d5884611d19565b611cfe565b90508083825260208201905060208402830185811115611d8057611d7f611d45565b5b835b81811015611da95780611d958882611b75565b845260208401935050602081019050611d82565b5050509392505050565b600082601f830112611dc857611dc7611c88565b5b8135611dd8848260208601611d4a565b91505092915050565b600060208284031215611df757611df6611b4a565b5b600082013567ffffffffffffffff811115611e1557611e14611b4f565b5b611e2184828501611db3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e5582611e2a565b9050919050565b611e6581611e4a565b82525050565b60008115159050919050565b611e8081611e6b565b82525050565b600061010082019050611e9c600083018b611e5c565b611ea9602083018a611c1e565b611eb66040830189611c1e565b611ec36060830188611c1e565b611ed06080830187611c1e565b611edd60a0830186611c1e565b611eea60c0830185611c1e565b611ef760e0830184611e77565b9998505050505050505050565b600061016082019050611f1a600083018e611c1e565b611f27602083018d611c1e565b611f34604083018c611c1e565b611f41606083018b611c1e565b611f4e608083018a611c1e565b611f5b60a0830189611c1e565b611f6860c0830188611c1e565b611f7560e0830187611c1e565b611f83610100830186611c1e565b611f91610120830185611e5c565b611f9f610140830184611e77565b9c9b505050505050505050505050565b600080600080600060a08688031215611fcb57611fca611b4a565b5b6000611fd988828901611b75565b9550506020611fea88828901611b75565b9450506040611ffb88828901611b75565b935050606061200c88828901611b75565b925050608061201d88828901611b75565b9150509295509295909350565b600060408201905061203f6000830185611c1e565b61204c6020830184611c1e565b9392505050565b61205c81611b54565b82525050565b61206b81611e4a565b82525050565b61207a81611e6b565b82525050565b610160820160008201516120976000850182612053565b5060208201516120aa6020850182612053565b5060408201516120bd6040850182612053565b5060608201516120d06060850182612053565b5060808201516120e36080850182612053565b5060a08201516120f660a0850182612053565b5060c082015161210960c0850182612053565b5060e082015161211c60e0850182612053565b50610100820151612131610100850182612053565b50610120820151612146610120850182612062565b5061014082015161215b610140850182612071565b50505050565b6000610160820190506121776000830184612080565b92915050565b610100820160008201516121946000850182612062565b5060208201516121a76020850182612053565b5060408201516121ba6040850182612053565b5060608201516121cd6060850182612053565b5060808201516121e06080850182612053565b5060a08201516121f360a0850182612053565b5060c082015161220660c0850182612053565b5060e082015161221960e0850182612071565b50505050565b600061010082019050612235600083018461217d565b92915050565b60006020820190506122506000830184611e5c565b92915050565b6000819050919050565b600061227b61227661227184611e2a565b612256565b611e2a565b9050919050565b600061228d82612260565b9050919050565b600061229f82612282565b9050919050565b6122af81612294565b82525050565b60006020820190506122ca60008301846122a6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061230a82611b54565b915061231583611b54565b925082820261232381611b54565b9150828204841483151761233a576123396122d0565b5b5092915050565b60006040820190506123566000830185611e5c565b6123636020830184611e5c565b9392505050565b60008151905061237981611b5e565b92915050565b60006020828403121561239557612394611b4a565b5b60006123a38482850161236a565b91505092915050565b600082825260208201905092915050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006123f3601d836123ac565b91506123fe826123bd565b602082019050919050565b60006020820190508181036000830152612422816123e6565b9050919050565b7f646f65736e277420657869737400000000000000000000000000000000000000600082015250565b600061245f600d836123ac565b915061246a82612429565b602082019050919050565b6000602082019050818103600083015261248e81612452565b9050919050565b60006124a082611b54565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124d2576124d16122d0565b5b600182019050919050565b60008160001c9050919050565b6000819050919050565b6000612507612502836124dd565b6124ea565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061254161253c836124dd565b61250e565b9050919050565b60008160a01c9050919050565b600060ff82169050919050565b600061257561257083612548565b612555565b9050919050565b61016082016000808301549050612592816124f4565b61259f6000860182612053565b50600183015490506125b0816124f4565b6125bd6020860182612053565b50600283015490506125ce816124f4565b6125db6040860182612053565b50600383015490506125ec816124f4565b6125f96060860182612053565b506004830154905061260a816124f4565b6126176080860182612053565b5060058301549050612628816124f4565b61263560a0860182612053565b5060068301549050612646816124f4565b61265360c0860182612053565b5060078301549050612664816124f4565b61267160e0860182612053565b5060088301549050612682816124f4565b612690610100860182612053565b50600983015490506126a18161252e565b6126af610120860182612062565b506126b981612562565b6126c7610140860182612071565b5050505050565b6000610160820190506126e4600083018461257c565b92915050565b60006126f582611b54565b915061270083611b54565b9250828201905080821115612718576127176122d0565b5b92915050565b60006060820190506127336000830186611e5c565b6127406020830185611e5c565b61274d6040830184611c1e565b949350505050565b61275e81611e6b565b811461276957600080fd5b50565b60008151905061277b81612755565b92915050565b60006020828403121561279757612796611b4a565b5b60006127a58482850161276c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006127f06127eb836124dd565b612555565b9050919050565b6101008201600080830154905061280d8161252e565b61281a6000860182612062565b506001830154905061282b816124f4565b6128386020860182612053565b5060028301549050612849816124f4565b6128566040860182612053565b5060038301549050612867816124f4565b6128746060860182612053565b5060048301549050612885816124f4565b6128926080860182612053565b50600583015490506128a3816124f4565b6128b060a0860182612053565b50600683015490506128c1816124f4565b6128ce60c0860182612053565b50600783015490506128df816127dd565b6128ec60e0860182612071565b5050505050565b60006101008201905061290960008301846127f7565b92915050565b7f6f6e6c7920706c616e206f776e65720000000000000000000000000000000000600082015250565b6000612945600f836123ac565b91506129508261290f565b602082019050919050565b6000602082019050818103600083015261297481612938565b9050919050565b7f6e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b60006129b16009836123ac565b91506129bc8261297b565b602082019050919050565b600060208201905081810360008301526129e0816129a4565b9050919050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000612a1d6012836123ac565b9150612a28826129e7565b602082019050919050565b60006020820190508181036000830152612a4c81612a10565b9050919050565b6000612a5e82611b54565b9150612a6983611b54565b9250828203905081811115612a8157612a806122d0565b5b92915050565b6000604082019050612a9c6000830185611e5c565b612aa96020830184611c1e565b9392505050565b7f746f6f206561726c790000000000000000000000000000000000000000000000600082015250565b6000612ae66009836123ac565b9150612af182612ab0565b602082019050919050565b60006020820190508181036000830152612b1581612ad9565b9050919050565b7f706c616e20656e64656400000000000000000000000000000000000000000000600082015250565b6000612b52600a836123ac565b9150612b5d82612b1c565b602082019050919050565b60006020820190508181036000830152612b8181612b45565b905091905056fea26469706673582212208687918c55af81956fd8896bd22c338b68364ea80c3e61b6fb24d2bcfc1fd54e64736f6c63430008110033000000000000000000000000765de816845861e75a25fca122bb6898b8b1282a000000000000000000000000702d8ef9255505378922f4a0206542a7dcf6947b

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c80639d9206881161008c578063d955bdc911610066578063d955bdc91461027d578063ddbf07f9146102ad578063f90ef4ac146102dd578063fc0c546a146102fb576100ea565b80639d920688146101f6578063a601c2c614610230578063aaec77e51461024c576100ea565b80634e581547116100c85780634e5815471461015757806385fcc9a2146101735780638818e165146101a357806390513e1a146101da576100ea565b80630cf9e555146100ef578063223f83e21461010b5780632b06fa741461013b575b600080fd5b61010960048036038101906101049190611b8a565b610319565b005b61012560048036038101906101209190611bb7565b610325565b6040516101329190611c2d565b60405180910390f35b61015560048036038101906101509190611c48565b610708565b005b610171600480360381019061016c9190611de1565b6108da565b005b61018d60048036038101906101889190611c48565b610920565b60405161019a9190611c2d565b60405180910390f35b6101bd60048036038101906101b89190611b8a565b610abb565b6040516101d1989796959493929190611e86565b60405180910390f35b6101f460048036038101906101ef9190611b8a565b610b30565b005b610210600480360381019061020b9190611b8a565b610c41565b6040516102279b9a99989796959493929190611f04565b60405180910390f35b61024a60048036038101906102459190611c48565b610cc8565b005b61026660048036038101906102619190611faf565b610fc2565b60405161027492919061202a565b60405180910390f35b61029760048036038101906102929190611b8a565b610fe9565b6040516102a49190612161565b60405180910390f35b6102c760048036038101906102c29190611b8a565b6110e2565b6040516102d4919061221f565b60405180910390f35b6102e56111bd565b6040516102f2919061223b565b60405180910390f35b6103036111e1565b60405161031091906122b5565b60405180910390f35b61032281611205565b50565b600080838561033491906122ff565b9050807f000000000000000000000000765de816845861e75a25fca122bb6898b8b1282a73ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401610392929190612341565b602060405180830381865afa1580156103af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d3919061237f565b1015610414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040b90612409565b60405180910390fd5b600060026000888152602001908152602001600020604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900460ff16151515158152505090508681602001511461052a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052190612475565b60405180910390fd5b600060016000815461053b90612495565b9190508190559050604051806101600160405280898152602001828152602001888861056791906122ff565b81526020016000815260200188815260200187815260200160008152602001600081526020018681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020016001151581525060036000838152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801556101208201518160090160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101408201518160090160146101000a81548160ff021916908315150217905550905050610699816115a1565b3373ffffffffffffffffffffffffffffffffffffffff16817ffd671f7182c83d1e07d1bd1748354402aa8a9193629cad7a0fbaac5c8ffe2818600360008581526020019081526020016000206040516106f291906126ce565b60405180910390a3809350505050949350505050565b600060026000848152602001908152602001600020905082816001015414610765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075c90612475565b60405180910390fd5b8181600401600082825461077991906126ea565b925050819055507f000000000000000000000000765de816845861e75a25fca122bb6898b8b1282a73ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016107dd9392919061271e565b6020604051808303816000875af11580156107fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108209190612781565b503373ffffffffffffffffffffffffffffffffffffffff16837f20c5b66cd5e4a4148323852541307bd30d5674f62e2247aefbd3dbae8be5e918846040516108689190611c2d565b60405180910390a33073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108cd9190611c2d565b60405180910390a3505050565b60005b815181101561091c576109098282815181106108fc576108fb6127ae565b5b6020026020010151611205565b808061091490612495565b9150506108dd565b5050565b6000600160008082825461093491906126ea565b925050819055506040518061010001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020016000548152602001848152602001838152602001600081526020014281526020016000815260200160001515815250600260008054815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff0219169083151502179055509050503373ffffffffffffffffffffffffffffffffffffffff166000547f71acf40162e8307c5fd5ec4e08cd622f5e5d29c2b1982af5421d95c0b1d117cf6002600080548152602001908152602001600020604051610aa891906128f3565b60405180910390a3600054905092915050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154908060060154908060070160009054906101000a900460ff16905088565b6003600082815260200190815260200160002060090160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9061295b565b60405180910390fd5b610bdd81611729565b3373ffffffffffffffffffffffffffffffffffffffff16817f1508b4f1d043dd53494e9f162026083edd68e32aa1e6e2d8818021c384fe080a60036000858152602001908152602001600020604051610c3691906126ce565b60405180910390a350565b60036020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060080154908060090160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060090160149054906101000a900460ff1690508b565b600060026000848152602001908152602001600020905082816001015414610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c90612475565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae906129c7565b60405180910390fd5b8181600401541015610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590612a33565b60405180910390fd5b81816004016000828254610e129190612a53565b925050819055507f000000000000000000000000765de816845861e75a25fca122bb6898b8b1282a73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f000000000000000000000000702d8ef9255505378922f4a0206542a7dcf6947b846040518363ffffffff1660e01b8152600401610e94929190612a87565b6020604051808303816000875af1158015610eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed79190612781565b5060018160070160006101000a81548160ff021916908315150217905550428160060181905550827f486095ee3674fb24bd0a2fcf31db414056448c4f6e206484eae4bcbb17fea35a3384604051610f30929190612a87565b60405180910390a27f000000000000000000000000702d8ef9255505378922f4a0206542a7dcf6947b73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610fb59190611c2d565b60405180910390a3505050565b600080610fcf8787610920565b9150610fdd82868686610325565b90509550959350505050565b610ff1611a71565b60036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff1615151515815250509050919050565b6110ea611ae3565b60026000838152602001908152602001600020604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900460ff1615151515815250509050919050565b7f000000000000000000000000702d8ef9255505378922f4a0206542a7dcf6947b81565b7f000000000000000000000000765de816845861e75a25fca122bb6898b8b1282a81565b600060036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff161515151581525050905060008160800151905060008261012001519050600060018460c0015161131991906126ea565b9050428460e001511115611362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135990612afc565b60405180910390fd5b8361014001516113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e90612b68565b60405180910390fd5b827f000000000000000000000000765de816845861e75a25fca122bb6898b8b1282a73ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611401919061223b565b602060405180830381865afa15801561141e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611442919061237f565b101580156114eb5750827f000000000000000000000000765de816845861e75a25fca122bb6898b8b1282a73ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84306040518363ffffffff1660e01b81526004016114a7929190612341565b602060405180830381865afa1580156114c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e8919061237f565b10155b1561159a576114ff8460000151848461189e565b8260036000878152602001908152602001600020600301600082825461152591906126ea565b9250508190555080600360008781526020019081526020016000206006018190555080857fbec3f63cb2d17ab9edd65a1a7ab167efd9802d37681c490ed1b215c6995bb3cb60405160405180910390a38360a0015181101561158f5761158a856115a1565b611599565b61159885611729565b5b5b5050505050565b600060036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff161515151581525050905060004260036000858152602001908152602001600020600801546116b391906126ea565b9050600060018360c001516116c891906126ea565b9050816003600086815260200190815260200160002060070181905550826080015182857f7191b4f9ba2ec111b9ae2a916ba78702dfbfe79ca993c2ce4321ff79a52a4c9c8460405161171b9190611c2d565b60405180910390a450505050565b600060036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff161515151581525050905060006003600084815260200190815260200160002060090160146101000a81548160ff02191690831515021790555080610120015173ffffffffffffffffffffffffffffffffffffffff16827f5e2829107023b345d1e5d6a90c0485ea550de003591f622a48dd48034b80486b836040516118929190612161565b60405180910390a35050565b6000600260008581526020019081526020016000209050838160010154146118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290612475565b60405180910390fd5b8281600401600082825461190f91906126ea565b925050819055507f000000000000000000000000765de816845861e75a25fca122bb6898b8b1282a73ffffffffffffffffffffffffffffffffffffffff166323b872dd8330866040518463ffffffff1660e01b81526004016119739392919061271e565b6020604051808303816000875af1158015611992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b69190612781565b508173ffffffffffffffffffffffffffffffffffffffff16847f20c5b66cd5e4a4148323852541307bd30d5674f62e2247aefbd3dbae8be5e918856040516119fe9190611c2d565b60405180910390a33073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051611a639190611c2d565b60405180910390a350505050565b604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581525090565b604051806101000160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b611b6781611b54565b8114611b7257600080fd5b50565b600081359050611b8481611b5e565b92915050565b600060208284031215611ba057611b9f611b4a565b5b6000611bae84828501611b75565b91505092915050565b60008060008060808587031215611bd157611bd0611b4a565b5b6000611bdf87828801611b75565b9450506020611bf087828801611b75565b9350506040611c0187828801611b75565b9250506060611c1287828801611b75565b91505092959194509250565b611c2781611b54565b82525050565b6000602082019050611c426000830184611c1e565b92915050565b60008060408385031215611c5f57611c5e611b4a565b5b6000611c6d85828601611b75565b9250506020611c7e85828601611b75565b9150509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611cd682611c8d565b810181811067ffffffffffffffff82111715611cf557611cf4611c9e565b5b80604052505050565b6000611d08611b40565b9050611d148282611ccd565b919050565b600067ffffffffffffffff821115611d3457611d33611c9e565b5b602082029050602081019050919050565b600080fd5b6000611d5d611d5884611d19565b611cfe565b90508083825260208201905060208402830185811115611d8057611d7f611d45565b5b835b81811015611da95780611d958882611b75565b845260208401935050602081019050611d82565b5050509392505050565b600082601f830112611dc857611dc7611c88565b5b8135611dd8848260208601611d4a565b91505092915050565b600060208284031215611df757611df6611b4a565b5b600082013567ffffffffffffffff811115611e1557611e14611b4f565b5b611e2184828501611db3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e5582611e2a565b9050919050565b611e6581611e4a565b82525050565b60008115159050919050565b611e8081611e6b565b82525050565b600061010082019050611e9c600083018b611e5c565b611ea9602083018a611c1e565b611eb66040830189611c1e565b611ec36060830188611c1e565b611ed06080830187611c1e565b611edd60a0830186611c1e565b611eea60c0830185611c1e565b611ef760e0830184611e77565b9998505050505050505050565b600061016082019050611f1a600083018e611c1e565b611f27602083018d611c1e565b611f34604083018c611c1e565b611f41606083018b611c1e565b611f4e608083018a611c1e565b611f5b60a0830189611c1e565b611f6860c0830188611c1e565b611f7560e0830187611c1e565b611f83610100830186611c1e565b611f91610120830185611e5c565b611f9f610140830184611e77565b9c9b505050505050505050505050565b600080600080600060a08688031215611fcb57611fca611b4a565b5b6000611fd988828901611b75565b9550506020611fea88828901611b75565b9450506040611ffb88828901611b75565b935050606061200c88828901611b75565b925050608061201d88828901611b75565b9150509295509295909350565b600060408201905061203f6000830185611c1e565b61204c6020830184611c1e565b9392505050565b61205c81611b54565b82525050565b61206b81611e4a565b82525050565b61207a81611e6b565b82525050565b610160820160008201516120976000850182612053565b5060208201516120aa6020850182612053565b5060408201516120bd6040850182612053565b5060608201516120d06060850182612053565b5060808201516120e36080850182612053565b5060a08201516120f660a0850182612053565b5060c082015161210960c0850182612053565b5060e082015161211c60e0850182612053565b50610100820151612131610100850182612053565b50610120820151612146610120850182612062565b5061014082015161215b610140850182612071565b50505050565b6000610160820190506121776000830184612080565b92915050565b610100820160008201516121946000850182612062565b5060208201516121a76020850182612053565b5060408201516121ba6040850182612053565b5060608201516121cd6060850182612053565b5060808201516121e06080850182612053565b5060a08201516121f360a0850182612053565b5060c082015161220660c0850182612053565b5060e082015161221960e0850182612071565b50505050565b600061010082019050612235600083018461217d565b92915050565b60006020820190506122506000830184611e5c565b92915050565b6000819050919050565b600061227b61227661227184611e2a565b612256565b611e2a565b9050919050565b600061228d82612260565b9050919050565b600061229f82612282565b9050919050565b6122af81612294565b82525050565b60006020820190506122ca60008301846122a6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061230a82611b54565b915061231583611b54565b925082820261232381611b54565b9150828204841483151761233a576123396122d0565b5b5092915050565b60006040820190506123566000830185611e5c565b6123636020830184611e5c565b9392505050565b60008151905061237981611b5e565b92915050565b60006020828403121561239557612394611b4a565b5b60006123a38482850161236a565b91505092915050565b600082825260208201905092915050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006123f3601d836123ac565b91506123fe826123bd565b602082019050919050565b60006020820190508181036000830152612422816123e6565b9050919050565b7f646f65736e277420657869737400000000000000000000000000000000000000600082015250565b600061245f600d836123ac565b915061246a82612429565b602082019050919050565b6000602082019050818103600083015261248e81612452565b9050919050565b60006124a082611b54565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124d2576124d16122d0565b5b600182019050919050565b60008160001c9050919050565b6000819050919050565b6000612507612502836124dd565b6124ea565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061254161253c836124dd565b61250e565b9050919050565b60008160a01c9050919050565b600060ff82169050919050565b600061257561257083612548565b612555565b9050919050565b61016082016000808301549050612592816124f4565b61259f6000860182612053565b50600183015490506125b0816124f4565b6125bd6020860182612053565b50600283015490506125ce816124f4565b6125db6040860182612053565b50600383015490506125ec816124f4565b6125f96060860182612053565b506004830154905061260a816124f4565b6126176080860182612053565b5060058301549050612628816124f4565b61263560a0860182612053565b5060068301549050612646816124f4565b61265360c0860182612053565b5060078301549050612664816124f4565b61267160e0860182612053565b5060088301549050612682816124f4565b612690610100860182612053565b50600983015490506126a18161252e565b6126af610120860182612062565b506126b981612562565b6126c7610140860182612071565b5050505050565b6000610160820190506126e4600083018461257c565b92915050565b60006126f582611b54565b915061270083611b54565b9250828201905080821115612718576127176122d0565b5b92915050565b60006060820190506127336000830186611e5c565b6127406020830185611e5c565b61274d6040830184611c1e565b949350505050565b61275e81611e6b565b811461276957600080fd5b50565b60008151905061277b81612755565b92915050565b60006020828403121561279757612796611b4a565b5b60006127a58482850161276c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006127f06127eb836124dd565b612555565b9050919050565b6101008201600080830154905061280d8161252e565b61281a6000860182612062565b506001830154905061282b816124f4565b6128386020860182612053565b5060028301549050612849816124f4565b6128566040860182612053565b5060038301549050612867816124f4565b6128746060860182612053565b5060048301549050612885816124f4565b6128926080860182612053565b50600583015490506128a3816124f4565b6128b060a0860182612053565b50600683015490506128c1816124f4565b6128ce60c0860182612053565b50600783015490506128df816127dd565b6128ec60e0860182612071565b5050505050565b60006101008201905061290960008301846127f7565b92915050565b7f6f6e6c7920706c616e206f776e65720000000000000000000000000000000000600082015250565b6000612945600f836123ac565b91506129508261290f565b602082019050919050565b6000602082019050818103600083015261297481612938565b9050919050565b7f6e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b60006129b16009836123ac565b91506129bc8261297b565b602082019050919050565b600060208201905081810360008301526129e0816129a4565b9050919050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000612a1d6012836123ac565b9150612a28826129e7565b602082019050919050565b60006020820190508181036000830152612a4c81612a10565b9050919050565b6000612a5e82611b54565b9150612a6983611b54565b9250828203905081811115612a8157612a806122d0565b5b92915050565b6000604082019050612a9c6000830185611e5c565b612aa96020830184611c1e565b9392505050565b7f746f6f206561726c790000000000000000000000000000000000000000000000600082015250565b6000612ae66009836123ac565b9150612af182612ab0565b602082019050919050565b60006020820190508181036000830152612b1581612ad9565b9050919050565b7f706c616e20656e64656400000000000000000000000000000000000000000000600082015250565b6000612b52600a836123ac565b9150612b5d82612b1c565b602082019050919050565b60006020820190508181036000830152612b8181612b45565b905091905056fea26469706673582212208687918c55af81956fd8896bd22c338b68364ea80c3e61b6fb24d2bcfc1fd54e64736f6c63430008110033