Address Details
contract
token

0xCd58b4544d75CDA2f1F02CC4B423867689A3601A

Token
0xcd58b4-a3601a
Creator
0x6c9679–3b6aa3 at 0x37a43a–bde485
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
4 Transactions
Transfers
6 Transfers
Gas Used
749,024
Last Balance Update
18923982
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:28:57.621476Z

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

0x60c06040523480156200001157600080fd5b5060405162002d7438038062002d74833981810160405281019062000037919062000111565b8173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050505062000158565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000d982620000ac565b9050919050565b620000eb81620000cc565b8114620000f757600080fd5b50565b6000815190506200010b81620000e0565b92915050565b600080604083850312156200012b576200012a620000a7565b5b60006200013b85828601620000fa565b92505060206200014e85828601620000fa565b9150509250929050565b60805160a051612bbe620001b6600039600081816103390152818161078201528181610e1b015281816111e3015281816113aa0152818161144e0152611918015260008181610e5701528181610f3a01526111bf0152612bbe6000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80639d9206881161008c578063d955bdc911610066578063d955bdc91461027d578063ddbf07f9146102ad578063f90ef4ac146102dd578063fc0c546a146102fb576100ea565b80639d920688146101f6578063a601c2c614610230578063aaec77e51461024c576100ea565b80634e581547116100c85780634e5815471461015757806385fcc9a2146101735780638818e165146101a357806390513e1a146101da576100ea565b80630cf9e555146100ef578063223f83e21461010b5780632b06fa741461013b575b600080fd5b61010960048036038101906101049190611b8a565b610319565b005b61012560048036038101906101209190611bb7565b610325565b6040516101329190611c2d565b60405180910390f35b61015560048036038101906101509190611c48565b610708565b005b610171600480360381019061016c9190611de1565b6108da565b005b61018d60048036038101906101889190611c48565b610920565b60405161019a9190611c2d565b60405180910390f35b6101bd60048036038101906101b89190611b8a565b610abb565b6040516101d1989796959493929190611e86565b60405180910390f35b6101f460048036038101906101ef9190611b8a565b610b30565b005b610210600480360381019061020b9190611b8a565b610c41565b6040516102279b9a99989796959493929190611f04565b60405180910390f35b61024a60048036038101906102459190611c48565b610cc8565b005b61026660048036038101906102619190611faf565b610fc2565b60405161027492919061202a565b60405180910390f35b61029760048036038101906102929190611b8a565b610fe9565b6040516102a49190612161565b60405180910390f35b6102c760048036038101906102c29190611b8a565b6110e2565b6040516102d4919061221f565b60405180910390f35b6102e56111bd565b6040516102f2919061223b565b60405180910390f35b6103036111e1565b60405161031091906122b5565b60405180910390f35b61032281611205565b50565b600080838561033491906122ff565b9050807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401610392929190612341565b602060405180830381865afa1580156103af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d3919061237f565b1015610414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040b90612409565b60405180910390fd5b600060026000888152602001908152602001600020604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900460ff16151515158152505090508681602001511461052a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052190612475565b60405180910390fd5b600060016000815461053b90612495565b9190508190559050604051806101600160405280898152602001828152602001888861056791906122ff565b81526020016000815260200188815260200187815260200160008152602001600081526020018681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020016001151581525060036000838152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801556101208201518160090160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101408201518160090160146101000a81548160ff021916908315150217905550905050610699816115a1565b3373ffffffffffffffffffffffffffffffffffffffff16817ffd671f7182c83d1e07d1bd1748354402aa8a9193629cad7a0fbaac5c8ffe2818600360008581526020019081526020016000206040516106f291906126ce565b60405180910390a3809350505050949350505050565b600060026000848152602001908152602001600020905082816001015414610765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075c90612475565b60405180910390fd5b8181600401600082825461077991906126ea565b925050819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016107dd9392919061271e565b6020604051808303816000875af11580156107fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108209190612781565b503373ffffffffffffffffffffffffffffffffffffffff16837f20c5b66cd5e4a4148323852541307bd30d5674f62e2247aefbd3dbae8be5e918846040516108689190611c2d565b60405180910390a33073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108cd9190611c2d565b60405180910390a3505050565b60005b815181101561091c576109098282815181106108fc576108fb6127ae565b5b6020026020010151611205565b808061091490612495565b9150506108dd565b5050565b6000600160008082825461093491906126ea565b925050819055506040518061010001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020016000548152602001848152602001838152602001600081526020014281526020016000815260200160001515815250600260008054815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff0219169083151502179055509050503373ffffffffffffffffffffffffffffffffffffffff166000547f71acf40162e8307c5fd5ec4e08cd622f5e5d29c2b1982af5421d95c0b1d117cf6002600080548152602001908152602001600020604051610aa891906128f3565b60405180910390a3600054905092915050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154908060060154908060070160009054906101000a900460ff16905088565b6003600082815260200190815260200160002060090160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9061295b565b60405180910390fd5b610bdd81611729565b3373ffffffffffffffffffffffffffffffffffffffff16817f1508b4f1d043dd53494e9f162026083edd68e32aa1e6e2d8818021c384fe080a60036000858152602001908152602001600020604051610c3691906126ce565b60405180910390a350565b60036020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060080154908060090160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060090160149054906101000a900460ff1690508b565b600060026000848152602001908152602001600020905082816001015414610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c90612475565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae906129c7565b60405180910390fd5b8181600401541015610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590612a33565b60405180910390fd5b81816004016000828254610e129190612a53565b925050819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f0000000000000000000000000000000000000000000000000000000000000000846040518363ffffffff1660e01b8152600401610e94929190612a87565b6020604051808303816000875af1158015610eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed79190612781565b5060018160070160006101000a81548160ff021916908315150217905550428160060181905550827f486095ee3674fb24bd0a2fcf31db414056448c4f6e206484eae4bcbb17fea35a3384604051610f30929190612a87565b60405180910390a27f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610fb59190611c2d565b60405180910390a3505050565b600080610fcf8787610920565b9150610fdd82868686610325565b90509550959350505050565b610ff1611a71565b60036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff1615151515815250509050919050565b6110ea611ae3565b60026000838152602001908152602001600020604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900460ff1615151515815250509050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600060036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff161515151581525050905060008160800151905060008261012001519050600060018460c0015161131991906126ea565b9050428460e001511115611362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135990612afc565b60405180910390fd5b8361014001516113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e90612b68565b60405180910390fd5b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611401919061223b565b602060405180830381865afa15801561141e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611442919061237f565b101580156114eb5750827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84306040518363ffffffff1660e01b81526004016114a7929190612341565b602060405180830381865afa1580156114c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e8919061237f565b10155b1561159a576114ff8460000151848461189e565b8260036000878152602001908152602001600020600301600082825461152591906126ea565b9250508190555080600360008781526020019081526020016000206006018190555080857fbec3f63cb2d17ab9edd65a1a7ab167efd9802d37681c490ed1b215c6995bb3cb60405160405180910390a38360a0015181101561158f5761158a856115a1565b611599565b61159885611729565b5b5b5050505050565b600060036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff161515151581525050905060004260036000858152602001908152602001600020600801546116b391906126ea565b9050600060018360c001516116c891906126ea565b9050816003600086815260200190815260200160002060070181905550826080015182857f7191b4f9ba2ec111b9ae2a916ba78702dfbfe79ca993c2ce4321ff79a52a4c9c8460405161171b9190611c2d565b60405180910390a450505050565b600060036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff161515151581525050905060006003600084815260200190815260200160002060090160146101000a81548160ff02191690831515021790555080610120015173ffffffffffffffffffffffffffffffffffffffff16827f5e2829107023b345d1e5d6a90c0485ea550de003591f622a48dd48034b80486b836040516118929190612161565b60405180910390a35050565b6000600260008581526020019081526020016000209050838160010154146118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290612475565b60405180910390fd5b8281600401600082825461190f91906126ea565b925050819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd8330866040518463ffffffff1660e01b81526004016119739392919061271e565b6020604051808303816000875af1158015611992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b69190612781565b508173ffffffffffffffffffffffffffffffffffffffff16847f20c5b66cd5e4a4148323852541307bd30d5674f62e2247aefbd3dbae8be5e918856040516119fe9190611c2d565b60405180910390a33073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051611a639190611c2d565b60405180910390a350505050565b604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581525090565b604051806101000160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b611b6781611b54565b8114611b7257600080fd5b50565b600081359050611b8481611b5e565b92915050565b600060208284031215611ba057611b9f611b4a565b5b6000611bae84828501611b75565b91505092915050565b60008060008060808587031215611bd157611bd0611b4a565b5b6000611bdf87828801611b75565b9450506020611bf087828801611b75565b9350506040611c0187828801611b75565b9250506060611c1287828801611b75565b91505092959194509250565b611c2781611b54565b82525050565b6000602082019050611c426000830184611c1e565b92915050565b60008060408385031215611c5f57611c5e611b4a565b5b6000611c6d85828601611b75565b9250506020611c7e85828601611b75565b9150509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611cd682611c8d565b810181811067ffffffffffffffff82111715611cf557611cf4611c9e565b5b80604052505050565b6000611d08611b40565b9050611d148282611ccd565b919050565b600067ffffffffffffffff821115611d3457611d33611c9e565b5b602082029050602081019050919050565b600080fd5b6000611d5d611d5884611d19565b611cfe565b90508083825260208201905060208402830185811115611d8057611d7f611d45565b5b835b81811015611da95780611d958882611b75565b845260208401935050602081019050611d82565b5050509392505050565b600082601f830112611dc857611dc7611c88565b5b8135611dd8848260208601611d4a565b91505092915050565b600060208284031215611df757611df6611b4a565b5b600082013567ffffffffffffffff811115611e1557611e14611b4f565b5b611e2184828501611db3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e5582611e2a565b9050919050565b611e6581611e4a565b82525050565b60008115159050919050565b611e8081611e6b565b82525050565b600061010082019050611e9c600083018b611e5c565b611ea9602083018a611c1e565b611eb66040830189611c1e565b611ec36060830188611c1e565b611ed06080830187611c1e565b611edd60a0830186611c1e565b611eea60c0830185611c1e565b611ef760e0830184611e77565b9998505050505050505050565b600061016082019050611f1a600083018e611c1e565b611f27602083018d611c1e565b611f34604083018c611c1e565b611f41606083018b611c1e565b611f4e608083018a611c1e565b611f5b60a0830189611c1e565b611f6860c0830188611c1e565b611f7560e0830187611c1e565b611f83610100830186611c1e565b611f91610120830185611e5c565b611f9f610140830184611e77565b9c9b505050505050505050505050565b600080600080600060a08688031215611fcb57611fca611b4a565b5b6000611fd988828901611b75565b9550506020611fea88828901611b75565b9450506040611ffb88828901611b75565b935050606061200c88828901611b75565b925050608061201d88828901611b75565b9150509295509295909350565b600060408201905061203f6000830185611c1e565b61204c6020830184611c1e565b9392505050565b61205c81611b54565b82525050565b61206b81611e4a565b82525050565b61207a81611e6b565b82525050565b610160820160008201516120976000850182612053565b5060208201516120aa6020850182612053565b5060408201516120bd6040850182612053565b5060608201516120d06060850182612053565b5060808201516120e36080850182612053565b5060a08201516120f660a0850182612053565b5060c082015161210960c0850182612053565b5060e082015161211c60e0850182612053565b50610100820151612131610100850182612053565b50610120820151612146610120850182612062565b5061014082015161215b610140850182612071565b50505050565b6000610160820190506121776000830184612080565b92915050565b610100820160008201516121946000850182612062565b5060208201516121a76020850182612053565b5060408201516121ba6040850182612053565b5060608201516121cd6060850182612053565b5060808201516121e06080850182612053565b5060a08201516121f360a0850182612053565b5060c082015161220660c0850182612053565b5060e082015161221960e0850182612071565b50505050565b600061010082019050612235600083018461217d565b92915050565b60006020820190506122506000830184611e5c565b92915050565b6000819050919050565b600061227b61227661227184611e2a565b612256565b611e2a565b9050919050565b600061228d82612260565b9050919050565b600061229f82612282565b9050919050565b6122af81612294565b82525050565b60006020820190506122ca60008301846122a6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061230a82611b54565b915061231583611b54565b925082820261232381611b54565b9150828204841483151761233a576123396122d0565b5b5092915050565b60006040820190506123566000830185611e5c565b6123636020830184611e5c565b9392505050565b60008151905061237981611b5e565b92915050565b60006020828403121561239557612394611b4a565b5b60006123a38482850161236a565b91505092915050565b600082825260208201905092915050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006123f3601d836123ac565b91506123fe826123bd565b602082019050919050565b60006020820190508181036000830152612422816123e6565b9050919050565b7f646f65736e277420657869737400000000000000000000000000000000000000600082015250565b600061245f600d836123ac565b915061246a82612429565b602082019050919050565b6000602082019050818103600083015261248e81612452565b9050919050565b60006124a082611b54565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124d2576124d16122d0565b5b600182019050919050565b60008160001c9050919050565b6000819050919050565b6000612507612502836124dd565b6124ea565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061254161253c836124dd565b61250e565b9050919050565b60008160a01c9050919050565b600060ff82169050919050565b600061257561257083612548565b612555565b9050919050565b61016082016000808301549050612592816124f4565b61259f6000860182612053565b50600183015490506125b0816124f4565b6125bd6020860182612053565b50600283015490506125ce816124f4565b6125db6040860182612053565b50600383015490506125ec816124f4565b6125f96060860182612053565b506004830154905061260a816124f4565b6126176080860182612053565b5060058301549050612628816124f4565b61263560a0860182612053565b5060068301549050612646816124f4565b61265360c0860182612053565b5060078301549050612664816124f4565b61267160e0860182612053565b5060088301549050612682816124f4565b612690610100860182612053565b50600983015490506126a18161252e565b6126af610120860182612062565b506126b981612562565b6126c7610140860182612071565b5050505050565b6000610160820190506126e4600083018461257c565b92915050565b60006126f582611b54565b915061270083611b54565b9250828201905080821115612718576127176122d0565b5b92915050565b60006060820190506127336000830186611e5c565b6127406020830185611e5c565b61274d6040830184611c1e565b949350505050565b61275e81611e6b565b811461276957600080fd5b50565b60008151905061277b81612755565b92915050565b60006020828403121561279757612796611b4a565b5b60006127a58482850161276c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006127f06127eb836124dd565b612555565b9050919050565b6101008201600080830154905061280d8161252e565b61281a6000860182612062565b506001830154905061282b816124f4565b6128386020860182612053565b5060028301549050612849816124f4565b6128566040860182612053565b5060038301549050612867816124f4565b6128746060860182612053565b5060048301549050612885816124f4565b6128926080860182612053565b50600583015490506128a3816124f4565b6128b060a0860182612053565b50600683015490506128c1816124f4565b6128ce60c0860182612053565b50600783015490506128df816127dd565b6128ec60e0860182612071565b5050505050565b60006101008201905061290960008301846127f7565b92915050565b7f6f6e6c7920706c616e206f776e65720000000000000000000000000000000000600082015250565b6000612945600f836123ac565b91506129508261290f565b602082019050919050565b6000602082019050818103600083015261297481612938565b9050919050565b7f6e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b60006129b16009836123ac565b91506129bc8261297b565b602082019050919050565b600060208201905081810360008301526129e0816129a4565b9050919050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000612a1d6012836123ac565b9150612a28826129e7565b602082019050919050565b60006020820190508181036000830152612a4c81612a10565b9050919050565b6000612a5e82611b54565b9150612a6983611b54565b9250828203905081811115612a8157612a806122d0565b5b92915050565b6000604082019050612a9c6000830185611e5c565b612aa96020830184611c1e565b9392505050565b7f746f6f206561726c790000000000000000000000000000000000000000000000600082015250565b6000612ae66009836123ac565b9150612af182612ab0565b602082019050919050565b60006020820190508181036000830152612b1581612ad9565b9050919050565b7f706c616e20656e64656400000000000000000000000000000000000000000000600082015250565b6000612b52600a836123ac565b9150612b5d82612b1c565b602082019050919050565b60006020820190508181036000830152612b8181612b45565b905091905056fea26469706673582212208687918c55af81956fd8896bd22c338b68364ea80c3e61b6fb24d2bcfc1fd54e64736f6c63430008110033000000000000000000000000d8763cba276a3738e6de85b4b3bf5fded6d6ca73000000000000000000000000702d8ef9255505378922f4a0206542a7dcf6947b

Deployed ByteCode

0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c80639d9206881161008c578063d955bdc911610066578063d955bdc91461027d578063ddbf07f9146102ad578063f90ef4ac146102dd578063fc0c546a146102fb576100ea565b80639d920688146101f6578063a601c2c614610230578063aaec77e51461024c576100ea565b80634e581547116100c85780634e5815471461015757806385fcc9a2146101735780638818e165146101a357806390513e1a146101da576100ea565b80630cf9e555146100ef578063223f83e21461010b5780632b06fa741461013b575b600080fd5b61010960048036038101906101049190611b8a565b610319565b005b61012560048036038101906101209190611bb7565b610325565b6040516101329190611c2d565b60405180910390f35b61015560048036038101906101509190611c48565b610708565b005b610171600480360381019061016c9190611de1565b6108da565b005b61018d60048036038101906101889190611c48565b610920565b60405161019a9190611c2d565b60405180910390f35b6101bd60048036038101906101b89190611b8a565b610abb565b6040516101d1989796959493929190611e86565b60405180910390f35b6101f460048036038101906101ef9190611b8a565b610b30565b005b610210600480360381019061020b9190611b8a565b610c41565b6040516102279b9a99989796959493929190611f04565b60405180910390f35b61024a60048036038101906102459190611c48565b610cc8565b005b61026660048036038101906102619190611faf565b610fc2565b60405161027492919061202a565b60405180910390f35b61029760048036038101906102929190611b8a565b610fe9565b6040516102a49190612161565b60405180910390f35b6102c760048036038101906102c29190611b8a565b6110e2565b6040516102d4919061221f565b60405180910390f35b6102e56111bd565b6040516102f2919061223b565b60405180910390f35b6103036111e1565b60405161031091906122b5565b60405180910390f35b61032281611205565b50565b600080838561033491906122ff565b9050807f000000000000000000000000d8763cba276a3738e6de85b4b3bf5fded6d6ca7373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e33306040518363ffffffff1660e01b8152600401610392929190612341565b602060405180830381865afa1580156103af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103d3919061237f565b1015610414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040b90612409565b60405180910390fd5b600060026000888152602001908152602001600020604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900460ff16151515158152505090508681602001511461052a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161052190612475565b60405180910390fd5b600060016000815461053b90612495565b9190508190559050604051806101600160405280898152602001828152602001888861056791906122ff565b81526020016000815260200188815260200187815260200160008152602001600081526020018681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020016001151581525060036000838152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e0820151816007015561010082015181600801556101208201518160090160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101408201518160090160146101000a81548160ff021916908315150217905550905050610699816115a1565b3373ffffffffffffffffffffffffffffffffffffffff16817ffd671f7182c83d1e07d1bd1748354402aa8a9193629cad7a0fbaac5c8ffe2818600360008581526020019081526020016000206040516106f291906126ce565b60405180910390a3809350505050949350505050565b600060026000848152602001908152602001600020905082816001015414610765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075c90612475565b60405180910390fd5b8181600401600082825461077991906126ea565b925050819055507f000000000000000000000000d8763cba276a3738e6de85b4b3bf5fded6d6ca7373ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b81526004016107dd9392919061271e565b6020604051808303816000875af11580156107fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108209190612781565b503373ffffffffffffffffffffffffffffffffffffffff16837f20c5b66cd5e4a4148323852541307bd30d5674f62e2247aefbd3dbae8be5e918846040516108689190611c2d565b60405180910390a33073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108cd9190611c2d565b60405180910390a3505050565b60005b815181101561091c576109098282815181106108fc576108fb6127ae565b5b6020026020010151611205565b808061091490612495565b9150506108dd565b5050565b6000600160008082825461093491906126ea565b925050819055506040518061010001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020016000548152602001848152602001838152602001600081526020014281526020016000815260200160001515815250600260008054815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e08201518160070160006101000a81548160ff0219169083151502179055509050503373ffffffffffffffffffffffffffffffffffffffff166000547f71acf40162e8307c5fd5ec4e08cd622f5e5d29c2b1982af5421d95c0b1d117cf6002600080548152602001908152602001600020604051610aa891906128f3565b60405180910390a3600054905092915050565b60026020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154908060050154908060060154908060070160009054906101000a900460ff16905088565b6003600082815260200190815260200160002060090160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bcb9061295b565b60405180910390fd5b610bdd81611729565b3373ffffffffffffffffffffffffffffffffffffffff16817f1508b4f1d043dd53494e9f162026083edd68e32aa1e6e2d8818021c384fe080a60036000858152602001908152602001600020604051610c3691906126ce565b60405180910390a350565b60036020528060005260406000206000915090508060000154908060010154908060020154908060030154908060040154908060050154908060060154908060070154908060080154908060090160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060090160149054906101000a900460ff1690508b565b600060026000848152602001908152602001600020905082816001015414610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c90612475565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dae906129c7565b60405180910390fd5b8181600401541015610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df590612a33565b60405180910390fd5b81816004016000828254610e129190612a53565b925050819055507f000000000000000000000000d8763cba276a3738e6de85b4b3bf5fded6d6ca7373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb7f000000000000000000000000702d8ef9255505378922f4a0206542a7dcf6947b846040518363ffffffff1660e01b8152600401610e94929190612a87565b6020604051808303816000875af1158015610eb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed79190612781565b5060018160070160006101000a81548160ff021916908315150217905550428160060181905550827f486095ee3674fb24bd0a2fcf31db414056448c4f6e206484eae4bcbb17fea35a3384604051610f30929190612a87565b60405180910390a27f000000000000000000000000702d8ef9255505378922f4a0206542a7dcf6947b73ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610fb59190611c2d565b60405180910390a3505050565b600080610fcf8787610920565b9150610fdd82868686610325565b90509550959350505050565b610ff1611a71565b60036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff1615151515815250509050919050565b6110ea611ae3565b60026000838152602001908152602001600020604051806101000160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481526020016007820160009054906101000a900460ff1615151515815250509050919050565b7f000000000000000000000000702d8ef9255505378922f4a0206542a7dcf6947b81565b7f000000000000000000000000d8763cba276a3738e6de85b4b3bf5fded6d6ca7381565b600060036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff161515151581525050905060008160800151905060008261012001519050600060018460c0015161131991906126ea565b9050428460e001511115611362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135990612afc565b60405180910390fd5b8361014001516113a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139e90612b68565b60405180910390fd5b827f000000000000000000000000d8763cba276a3738e6de85b4b3bf5fded6d6ca7373ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611401919061223b565b602060405180830381865afa15801561141e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611442919061237f565b101580156114eb5750827f000000000000000000000000d8763cba276a3738e6de85b4b3bf5fded6d6ca7373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e84306040518363ffffffff1660e01b81526004016114a7929190612341565b602060405180830381865afa1580156114c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e8919061237f565b10155b1561159a576114ff8460000151848461189e565b8260036000878152602001908152602001600020600301600082825461152591906126ea565b9250508190555080600360008781526020019081526020016000206006018190555080857fbec3f63cb2d17ab9edd65a1a7ab167efd9802d37681c490ed1b215c6995bb3cb60405160405180910390a38360a0015181101561158f5761158a856115a1565b611599565b61159885611729565b5b5b5050505050565b600060036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff161515151581525050905060004260036000858152602001908152602001600020600801546116b391906126ea565b9050600060018360c001516116c891906126ea565b9050816003600086815260200190815260200160002060070181905550826080015182857f7191b4f9ba2ec111b9ae2a916ba78702dfbfe79ca993c2ce4321ff79a52a4c9c8460405161171b9190611c2d565b60405180910390a450505050565b600060036000838152602001908152602001600020604051806101600160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481526020016009820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016009820160149054906101000a900460ff161515151581525050905060006003600084815260200190815260200160002060090160146101000a81548160ff02191690831515021790555080610120015173ffffffffffffffffffffffffffffffffffffffff16827f5e2829107023b345d1e5d6a90c0485ea550de003591f622a48dd48034b80486b836040516118929190612161565b60405180910390a35050565b6000600260008581526020019081526020016000209050838160010154146118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290612475565b60405180910390fd5b8281600401600082825461190f91906126ea565b925050819055507f000000000000000000000000d8763cba276a3738e6de85b4b3bf5fded6d6ca7373ffffffffffffffffffffffffffffffffffffffff166323b872dd8330866040518463ffffffff1660e01b81526004016119739392919061271e565b6020604051808303816000875af1158015611992573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b69190612781565b508173ffffffffffffffffffffffffffffffffffffffff16847f20c5b66cd5e4a4148323852541307bd30d5674f62e2247aefbd3dbae8be5e918856040516119fe9190611c2d565b60405180910390a33073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051611a639190611c2d565b60405180910390a350505050565b604051806101600160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000151581525090565b604051806101000160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b611b6781611b54565b8114611b7257600080fd5b50565b600081359050611b8481611b5e565b92915050565b600060208284031215611ba057611b9f611b4a565b5b6000611bae84828501611b75565b91505092915050565b60008060008060808587031215611bd157611bd0611b4a565b5b6000611bdf87828801611b75565b9450506020611bf087828801611b75565b9350506040611c0187828801611b75565b9250506060611c1287828801611b75565b91505092959194509250565b611c2781611b54565b82525050565b6000602082019050611c426000830184611c1e565b92915050565b60008060408385031215611c5f57611c5e611b4a565b5b6000611c6d85828601611b75565b9250506020611c7e85828601611b75565b9150509250929050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611cd682611c8d565b810181811067ffffffffffffffff82111715611cf557611cf4611c9e565b5b80604052505050565b6000611d08611b40565b9050611d148282611ccd565b919050565b600067ffffffffffffffff821115611d3457611d33611c9e565b5b602082029050602081019050919050565b600080fd5b6000611d5d611d5884611d19565b611cfe565b90508083825260208201905060208402830185811115611d8057611d7f611d45565b5b835b81811015611da95780611d958882611b75565b845260208401935050602081019050611d82565b5050509392505050565b600082601f830112611dc857611dc7611c88565b5b8135611dd8848260208601611d4a565b91505092915050565b600060208284031215611df757611df6611b4a565b5b600082013567ffffffffffffffff811115611e1557611e14611b4f565b5b611e2184828501611db3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611e5582611e2a565b9050919050565b611e6581611e4a565b82525050565b60008115159050919050565b611e8081611e6b565b82525050565b600061010082019050611e9c600083018b611e5c565b611ea9602083018a611c1e565b611eb66040830189611c1e565b611ec36060830188611c1e565b611ed06080830187611c1e565b611edd60a0830186611c1e565b611eea60c0830185611c1e565b611ef760e0830184611e77565b9998505050505050505050565b600061016082019050611f1a600083018e611c1e565b611f27602083018d611c1e565b611f34604083018c611c1e565b611f41606083018b611c1e565b611f4e608083018a611c1e565b611f5b60a0830189611c1e565b611f6860c0830188611c1e565b611f7560e0830187611c1e565b611f83610100830186611c1e565b611f91610120830185611e5c565b611f9f610140830184611e77565b9c9b505050505050505050505050565b600080600080600060a08688031215611fcb57611fca611b4a565b5b6000611fd988828901611b75565b9550506020611fea88828901611b75565b9450506040611ffb88828901611b75565b935050606061200c88828901611b75565b925050608061201d88828901611b75565b9150509295509295909350565b600060408201905061203f6000830185611c1e565b61204c6020830184611c1e565b9392505050565b61205c81611b54565b82525050565b61206b81611e4a565b82525050565b61207a81611e6b565b82525050565b610160820160008201516120976000850182612053565b5060208201516120aa6020850182612053565b5060408201516120bd6040850182612053565b5060608201516120d06060850182612053565b5060808201516120e36080850182612053565b5060a08201516120f660a0850182612053565b5060c082015161210960c0850182612053565b5060e082015161211c60e0850182612053565b50610100820151612131610100850182612053565b50610120820151612146610120850182612062565b5061014082015161215b610140850182612071565b50505050565b6000610160820190506121776000830184612080565b92915050565b610100820160008201516121946000850182612062565b5060208201516121a76020850182612053565b5060408201516121ba6040850182612053565b5060608201516121cd6060850182612053565b5060808201516121e06080850182612053565b5060a08201516121f360a0850182612053565b5060c082015161220660c0850182612053565b5060e082015161221960e0850182612071565b50505050565b600061010082019050612235600083018461217d565b92915050565b60006020820190506122506000830184611e5c565b92915050565b6000819050919050565b600061227b61227661227184611e2a565b612256565b611e2a565b9050919050565b600061228d82612260565b9050919050565b600061229f82612282565b9050919050565b6122af81612294565b82525050565b60006020820190506122ca60008301846122a6565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061230a82611b54565b915061231583611b54565b925082820261232381611b54565b9150828204841483151761233a576123396122d0565b5b5092915050565b60006040820190506123566000830185611e5c565b6123636020830184611e5c565b9392505050565b60008151905061237981611b5e565b92915050565b60006020828403121561239557612394611b4a565b5b60006123a38482850161236a565b91505092915050565b600082825260208201905092915050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b60006123f3601d836123ac565b91506123fe826123bd565b602082019050919050565b60006020820190508181036000830152612422816123e6565b9050919050565b7f646f65736e277420657869737400000000000000000000000000000000000000600082015250565b600061245f600d836123ac565b915061246a82612429565b602082019050919050565b6000602082019050818103600083015261248e81612452565b9050919050565b60006124a082611b54565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124d2576124d16122d0565b5b600182019050919050565b60008160001c9050919050565b6000819050919050565b6000612507612502836124dd565b6124ea565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061254161253c836124dd565b61250e565b9050919050565b60008160a01c9050919050565b600060ff82169050919050565b600061257561257083612548565b612555565b9050919050565b61016082016000808301549050612592816124f4565b61259f6000860182612053565b50600183015490506125b0816124f4565b6125bd6020860182612053565b50600283015490506125ce816124f4565b6125db6040860182612053565b50600383015490506125ec816124f4565b6125f96060860182612053565b506004830154905061260a816124f4565b6126176080860182612053565b5060058301549050612628816124f4565b61263560a0860182612053565b5060068301549050612646816124f4565b61265360c0860182612053565b5060078301549050612664816124f4565b61267160e0860182612053565b5060088301549050612682816124f4565b612690610100860182612053565b50600983015490506126a18161252e565b6126af610120860182612062565b506126b981612562565b6126c7610140860182612071565b5050505050565b6000610160820190506126e4600083018461257c565b92915050565b60006126f582611b54565b915061270083611b54565b9250828201905080821115612718576127176122d0565b5b92915050565b60006060820190506127336000830186611e5c565b6127406020830185611e5c565b61274d6040830184611c1e565b949350505050565b61275e81611e6b565b811461276957600080fd5b50565b60008151905061277b81612755565b92915050565b60006020828403121561279757612796611b4a565b5b60006127a58482850161276c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006127f06127eb836124dd565b612555565b9050919050565b6101008201600080830154905061280d8161252e565b61281a6000860182612062565b506001830154905061282b816124f4565b6128386020860182612053565b5060028301549050612849816124f4565b6128566040860182612053565b5060038301549050612867816124f4565b6128746060860182612053565b5060048301549050612885816124f4565b6128926080860182612053565b50600583015490506128a3816124f4565b6128b060a0860182612053565b50600683015490506128c1816124f4565b6128ce60c0860182612053565b50600783015490506128df816127dd565b6128ec60e0860182612071565b5050505050565b60006101008201905061290960008301846127f7565b92915050565b7f6f6e6c7920706c616e206f776e65720000000000000000000000000000000000600082015250565b6000612945600f836123ac565b91506129508261290f565b602082019050919050565b6000602082019050818103600083015261297481612938565b9050919050565b7f6e6f74206f776e65720000000000000000000000000000000000000000000000600082015250565b60006129b16009836123ac565b91506129bc8261297b565b602082019050919050565b600060208201905081810360008301526129e0816129a4565b9050919050565b7f696e73756666696369656e742066756e64730000000000000000000000000000600082015250565b6000612a1d6012836123ac565b9150612a28826129e7565b602082019050919050565b60006020820190508181036000830152612a4c81612a10565b9050919050565b6000612a5e82611b54565b9150612a6983611b54565b9250828203905081811115612a8157612a806122d0565b5b92915050565b6000604082019050612a9c6000830185611e5c565b612aa96020830184611c1e565b9392505050565b7f746f6f206561726c790000000000000000000000000000000000000000000000600082015250565b6000612ae66009836123ac565b9150612af182612ab0565b602082019050919050565b60006020820190508181036000830152612b1581612ad9565b9050919050565b7f706c616e20656e64656400000000000000000000000000000000000000000000600082015250565b6000612b52600a836123ac565b9150612b5d82612b1c565b602082019050919050565b60006020820190508181036000830152612b8181612b45565b905091905056fea26469706673582212208687918c55af81956fd8896bd22c338b68364ea80c3e61b6fb24d2bcfc1fd54e64736f6c63430008110033