Contract Address Details

0x05d1A1b76cC47A89E1D5D71d431A79C930bFfb3F

Contract Name
EgonConversionV2
Creator
0x1cf840–376b39 at 0xc1b100–32b2f5
Balance
1,242,778.189267808668675153 EGON
Tokens
Fetching tokens...
Transactions
49,883 Transactions
Transfers
187,889 Transfers
Gas Used
9,067,551,476
Last Balance Update
13687870
Contract name:
EgonConversionV2




Optimization enabled
false
Compiler version
v0.8.26+commit.8a97fa7a




EVM Version
london




Verified at
2024-07-05T07:12:48.340434Z

Constructor Arguments

0000000000000000000000001cf840ceb2f0f01a721c44b271e61988cd376b390000000000000000000000000000000000000000000000000000000000000005

Arg [0] (address) : 0x1cf840ceb2f0f01a721c44b271e61988cd376b39
Arg [1] (uint8) : 5

              

Contract source code

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

interface IERC20 {
    function balanceOf(address account) external view returns (uint256);

    function transfer(
        address recipient,
        uint256 amount
    ) external returns (bool);

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

interface OldEgonConversion {
    struct Deposit {
        uint256 depositAmount1;
        uint256 depositAmount2;
        uint256 startTime;
        uint256 withdrawAmount1;
        uint256 withdrawAmount2;
        uint256 token3Amount;
        uint256 token4Amount;
        uint256 lastWithdraw;
        uint256 endTime;
    }

    function getUserDeposits(
        address _user
    ) external view returns (Deposit[] memory);
}

contract EgonConversionV2 {
    uint8 public dailyPercentage;
    address public admin;
    uint256 public timeStep = 1 days;
    address public ECT = 0xd658aC518592ba80E4Fe60Bcd5d70D2cb8545b61;
    address public CST = 0x98024988142679feBd6D6D38daFe6A5E055B35D2;
    address public CPT = 0x80E356A9308A3A261992DEAc6599582aa80aE6E3;
    address public ENU = 0xBA5b8FaD9f3F1122dD6308be95de8F2fafD0ef69;
    address oldEgonConversion = 0x00d00B87569d447291F0F13608B5d204F2A02177;
    bool settlementDone;

    struct User {
        uint256 depositId;
        mapping(uint256 => Deposit) deposits;
        uint256 totalDeposit1;
        uint256 totalDeposit2;
        uint256 totalWithdraw;
        uint256 totalToken3;
        uint256 totalToken4;
        uint256 endedDeposits;
        bool isWhitelisted;
    }

    struct Deposit {
        uint256 depositAmount1;
        uint256 depositAmount2;
        uint256 startTime;
        uint256 withdrawAmount1;
        uint256 withdrawAmount2;
        uint256 token3Amount;
        uint256 token4Amount;
        uint256 lastWithdraw;
        uint256 endTime;
    }

    mapping(address => User) public users;
    mapping(address => bool) isSettled;

    event Deposited(
        uint256 depositId,
        address user,
        uint256 amount1,
        uint256 amount2,
        uint256 startTime
    );
    event Withdraw(
        address user,
        uint256 amount,
        uint256 withdrawAmount1,
        uint256 withdrawAmount2,
        uint256 token3Amount,
        uint256 token4Amount,
        uint256 multiplier
    );

    constructor(address _admin, uint8 _dailyPercentage) {
        admin = _admin;
        dailyPercentage = _dailyPercentage;
    }

    function deposit() public {
        User storage user = users[msg.sender];
        require(user.isWhitelisted, "Blocked user");
        uint256 _depositAmount1 = IERC20(ECT).balanceOf(msg.sender);
        uint256 _depositAmount2 = IERC20(CST).balanceOf(msg.sender);
        require(
            _depositAmount1 > 0 || _depositAmount2 > 0,
            "Insufficient user balance"
        );
        if (_depositAmount1 > 0)
            IERC20(ECT).transferFrom(
                msg.sender,
                address(this),
                _depositAmount1
            );

        if (_depositAmount2 > 0)
            IERC20(CST).transferFrom(
                msg.sender,
                address(this),
                _depositAmount2
            );
        user.deposits[user.depositId].depositAmount1 = _depositAmount1;
        user.deposits[user.depositId].depositAmount2 = _depositAmount2;
        user.deposits[user.depositId].lastWithdraw = block.timestamp;
        user.deposits[user.depositId].startTime = block.timestamp;
        user.deposits[user.depositId].endTime =
            block.timestamp +
            (timeStep * 200);
        user.totalDeposit1 += _depositAmount1;
        user.totalDeposit2 += _depositAmount2;
        emit Deposited(
            user.depositId,
            msg.sender,
            _depositAmount1,
            _depositAmount2,
            block.timestamp
        );
        user.depositId++;
    }

    function withdraw() external {
        User storage user = users[msg.sender];
        require(user.isWhitelisted, "User blocked");
        uint256 totalAmount;
        uint256 releaseAmount3;
        uint256 releaseAmount4;
        for (uint256 i = user.endedDeposits; i < user.depositId; i++) {
            uint256 multiplier = (block.timestamp <= user.deposits[i].endTime)
                ? (block.timestamp - user.deposits[i].lastWithdraw)
                : (user.deposits[i].endTime > user.deposits[i].lastWithdraw)
                ? (user.deposits[i].endTime - user.deposits[i].lastWithdraw)
                : 0;
            if (multiplier > 0) {
                uint256 amount1 = (user.deposits[i].depositAmount1 *
                    dailyPercentage *
                    multiplier) / (timeStep * 1000);
                uint256 amount2 = (11 *
                    (user.deposits[i].depositAmount2 *
                        dailyPercentage *
                        multiplier)) / (timeStep * 10000);
                uint256 amount3 = amount1 * 100;
                uint256 amount4 = amount1 * 500;
                uint256 releaseAmount = amount1 + amount2;
                user.deposits[i].withdrawAmount1 += amount1;
                user.deposits[i].withdrawAmount2 += amount2;
                user.deposits[i].lastWithdraw = block.timestamp;
                user.deposits[i].token3Amount += amount3;
                user.deposits[i].token4Amount += amount4;
                emit Withdraw(
                    msg.sender,
                    releaseAmount,
                    amount1,
                    amount2,
                    amount3,
                    amount4,
                    multiplier
                );
                totalAmount += releaseAmount;
                releaseAmount3 += amount3;
                releaseAmount4 += amount4;
            }
            if (
                user.deposits[i].withdrawAmount1 +
                    (user.deposits[i].withdrawAmount2 * 10) /
                    11 >=
                user.deposits[i].depositAmount1 +
                    user.deposits[i].depositAmount2
            ) user.endedDeposits++;
        }
        user.totalWithdraw += totalAmount;
        user.totalToken3 += releaseAmount3;
        user.totalToken4 += releaseAmount4;
        require(
            totalAmount > 0 && address(this).balance >= totalAmount,
            "Invalid withdraw"
        );
        if (releaseAmount3 > 0) {
            IERC20(CPT).transfer(msg.sender, releaseAmount3);
            IERC20(ENU).transfer(msg.sender, releaseAmount4 / 1e9);
        }
        payable(msg.sender).transfer(totalAmount);
    }

    function getReleaseAmount(
        address _user
    ) external view returns (uint256, uint256, uint256) {
        User storage user = users[_user];
        uint256 totalAmount;
        uint256 totalAmount3;
        uint256 totalAmount4;
        for (uint256 i = user.endedDeposits; i < user.depositId; i++) {
            uint256 multiplier = (block.timestamp <= user.deposits[i].endTime)
                ? (block.timestamp - user.deposits[i].lastWithdraw)
                : (user.deposits[i].endTime > user.deposits[i].lastWithdraw)
                ? (user.deposits[i].endTime - user.deposits[i].lastWithdraw)
                : 0;
            if (multiplier > 0) {
                uint256 amount1 = (user.deposits[i].depositAmount1 *
                    dailyPercentage *
                    multiplier) / (timeStep * 1000);
                uint256 amount2 = (11 *
                    (user.deposits[i].depositAmount2 *
                        dailyPercentage *
                        multiplier)) / (timeStep * 10000);
                uint256 releaseAmount = amount1 + amount2;
                totalAmount3 += amount1 * 100;
                totalAmount4 += amount1 * 500;
                totalAmount += releaseAmount;
            }
        }
        return (totalAmount, totalAmount3, totalAmount4);
    }

    function getUserDeposits(
        address _user
    ) external view returns (Deposit[] memory) {
        User storage user = users[_user];
        Deposit[] memory deposits = new Deposit[](user.depositId);
        for (uint256 i = 0; i < user.depositId; i++) {
            deposits[i] = user.deposits[i];
        }
        return deposits;
    }

    function changeAdmin(address _admin) external onlyAdmin {
        admin = _admin;
    }

    function withdrawTokens(
        address _token,
        uint256 _amount
    ) external onlyAdmin {
        IERC20(_token).transfer(admin, _amount);
    }

    function withdrawFunds(uint256 _amount) external onlyAdmin {
        payable(admin).transfer(_amount);
    }

    function whitelistUsers(address[] memory _users) external onlyAdmin {
        for (uint256 i = 0; i < _users.length; i++) {
            users[_users[i]].isWhitelisted = true;
        }
    }

    function blacklistUsers(address[] memory _users) external onlyAdmin {
        for (uint256 i = 0; i < _users.length; i++) {
            users[_users[i]].isWhitelisted = false;
        }
    }

    function depositSettlement(address[] memory _users) external onlyAdmin {
        require(!(settlementDone), "Settlement done");
        for (uint256 i = 0; i < _users.length; i++) {
            if (!(isSettled[_users[i]])) {
                User storage user = users[_users[i]];
                OldEgonConversion.Deposit[] memory deposits = OldEgonConversion(
                    oldEgonConversion
                ).getUserDeposits(_users[i]);
                isSettled[_users[i]] = true;
                for (uint256 j = 0; j < deposits.length; j++) {
                    if (
                        deposits[j].depositAmount1 > 0 ||
                        deposits[j].depositAmount2 > 0
                    ) {
                        user.deposits[user.depositId].depositAmount1 = deposits[j]
                            .depositAmount1;
                        user.deposits[user.depositId].depositAmount2 = deposits[j]
                            .depositAmount2;
                        user.deposits[user.depositId].lastWithdraw = deposits[j]
                            .lastWithdraw;
                        user.deposits[user.depositId].startTime = deposits[j]
                            .startTime;
                        user.deposits[user.depositId].endTime =
                            deposits[j].startTime +
                            (timeStep * 200);
                        user.deposits[user.depositId].withdrawAmount1 = deposits[j]
                            .withdrawAmount1;
                        user.deposits[user.depositId].withdrawAmount2 = deposits[j]
                            .withdrawAmount2;
                        user.deposits[user.depositId].token3Amount = deposits[j]
                            .token3Amount;
                        user.deposits[user.depositId].token4Amount = deposits[j]
                            .token4Amount;
                        user.totalDeposit1 += deposits[j].depositAmount1;
                        user.totalDeposit2 += deposits[j].depositAmount2;
                        user.totalWithdraw += (deposits[j].withdrawAmount1 +
                            deposits[j].withdrawAmount2);
                        user.totalToken3 += deposits[j].token3Amount;
                        user.totalToken4 += deposits[j].token4Amount;
                        emit Deposited(
                            user.depositId,
                            _users[i],
                            deposits[j].depositAmount1,
                            deposits[j].depositAmount2,
                            block.timestamp
                        );
                        user.depositId++;
                    }
                }
            }
        }
    }

    function endSettlement() external onlyAdmin {
        require(!(settlementDone), "Already ended");
        settlementDone = true;
    }

    modifier onlyAdmin() {
        require(msg.sender == admin, "Not admin");
        _;
    }

    receive() external payable {}
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_admin","internalType":"address"},{"type":"uint8","name":"_dailyPercentage","internalType":"uint8"}]},{"type":"event","name":"Deposited","inputs":[{"type":"uint256","name":"depositId","internalType":"uint256","indexed":false},{"type":"address","name":"user","internalType":"address","indexed":false},{"type":"uint256","name":"amount1","internalType":"uint256","indexed":false},{"type":"uint256","name":"amount2","internalType":"uint256","indexed":false},{"type":"uint256","name":"startTime","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"user","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"withdrawAmount1","internalType":"uint256","indexed":false},{"type":"uint256","name":"withdrawAmount2","internalType":"uint256","indexed":false},{"type":"uint256","name":"token3Amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"token4Amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"multiplier","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"CPT","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"CST","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ECT","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ENU","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"blacklistUsers","inputs":[{"type":"address[]","name":"_users","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"changeAdmin","inputs":[{"type":"address","name":"_admin","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"dailyPercentage","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deposit","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"depositSettlement","inputs":[{"type":"address[]","name":"_users","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"endSettlement","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getReleaseAmount","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple[]","name":"","internalType":"struct EgonConversionV2.Deposit[]","components":[{"type":"uint256","name":"depositAmount1","internalType":"uint256"},{"type":"uint256","name":"depositAmount2","internalType":"uint256"},{"type":"uint256","name":"startTime","internalType":"uint256"},{"type":"uint256","name":"withdrawAmount1","internalType":"uint256"},{"type":"uint256","name":"withdrawAmount2","internalType":"uint256"},{"type":"uint256","name":"token3Amount","internalType":"uint256"},{"type":"uint256","name":"token4Amount","internalType":"uint256"},{"type":"uint256","name":"lastWithdraw","internalType":"uint256"},{"type":"uint256","name":"endTime","internalType":"uint256"}]}],"name":"getUserDeposits","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"timeStep","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"depositId","internalType":"uint256"},{"type":"uint256","name":"totalDeposit1","internalType":"uint256"},{"type":"uint256","name":"totalDeposit2","internalType":"uint256"},{"type":"uint256","name":"totalWithdraw","internalType":"uint256"},{"type":"uint256","name":"totalToken3","internalType":"uint256"},{"type":"uint256","name":"totalToken4","internalType":"uint256"},{"type":"uint256","name":"endedDeposits","internalType":"uint256"},{"type":"bool","name":"isWhitelisted","internalType":"bool"}],"name":"users","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"whitelistUsers","inputs":[{"type":"address[]","name":"_users","internalType":"address[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawFunds","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawTokens","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
            

Deployed ByteCode

0x6080604052600436106101185760003560e01c80633ccfd60b116100a0578063d0e30db011610064578063d0e30db01461039f578063edec5f27146103b6578063f191c26d146103df578063f851a4401461040a578063fa2dcd93146104355761011f565b80633ccfd60b146102c75780638f283970146102de578063a0ad67d614610307578063a87430ba14610332578063bb3d676a146103765761011f565b806317d24edb116100e757806317d24edb146101cc578063194c050c146101f75780632a5bf6d21461022057806332ad29821461025d578063370255501461029c5761011f565b806306b091f9146101245780631502906d1461014d578063150c414314610178578063155dd5ee146101a35761011f565b3661011f57005b600080fd5b34801561013057600080fd5b5061014b600480360381019061014691906123cf565b61044c565b005b34801561015957600080fd5b50610162610581565b60405161016f919061241e565b60405180910390f35b34801561018457600080fd5b5061018d610587565b60405161019a9190612448565b60405180910390f35b3480156101af57600080fd5b506101ca60048036038101906101c59190612463565b6105ad565b005b3480156101d857600080fd5b506101e16106a9565b6040516101ee9190612448565b60405180910390f35b34801561020357600080fd5b5061021e600480360381019061021991906125e9565b6106cf565b005b34801561022c57600080fd5b5061024760048036038101906102429190612632565b610e7c565b60405161025491906127d5565b60405180910390f35b34801561026957600080fd5b50610284600480360381019061027f9190612632565b610fdd565b604051610293939291906127f7565b60405180910390f35b3480156102a857600080fd5b506102b1611250565b6040516102be919061284a565b60405180910390f35b3480156102d357600080fd5b506102dc611261565b005b3480156102ea57600080fd5b5061030560048036038101906103009190612632565b61192d565b005b34801561031357600080fd5b5061031c611a01565b6040516103299190612448565b60405180910390f35b34801561033e57600080fd5b5061035960048036038101906103549190612632565b611a27565b60405161036d989796959493929190612880565b60405180910390f35b34801561038257600080fd5b5061039d600480360381019061039891906125e9565b611a7c565b005b3480156103ab57600080fd5b506103b4611b9e565b005b3480156103c257600080fd5b506103dd60048036038101906103d891906125e9565b612070565b005b3480156103eb57600080fd5b506103f4612192565b6040516104019190612448565b60405180910390f35b34801561041657600080fd5b5061041f6121b8565b60405161042c9190612448565b60405180910390f35b34801561044157600080fd5b5061044a6121de565b005b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d39061295b565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b815260040161053992919061297b565b6020604051808303816000875af1158015610558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061057c91906129d0565b505050565b60015481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461063d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106349061295b565b60405180910390fd5b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156106a5573d6000803e3d6000fd5b5050565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461075f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107569061295b565b60405180910390fd5b600660149054906101000a900460ff16156107af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a690612a49565b60405180910390fd5b60005b8151811015610e7857600860008383815181106107d2576107d1612a69565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e6b5760006007600084848151811061083f5761083e612a69565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632a5bf6d28585815181106108d6576108d5612a69565b5b60200260200101516040518263ffffffff1660e01b81526004016108fa9190612448565b600060405180830381865afa158015610917573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109409190612c57565b905060016008600086868151811061095b5761095a612a69565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060005b8151811015610e675760008282815181106109d5576109d4612a69565b5b6020026020010151600001511180610a0b575060008282815181106109fd576109fc612a69565b5b602002602001015160200151115b15610e5a57818181518110610a2357610a22612a69565b5b6020026020010151600001518360010160008560000154815260200190815260200160002060000181905550818181518110610a6257610a61612a69565b5b6020026020010151602001518360010160008560000154815260200190815260200160002060010181905550818181518110610aa157610aa0612a69565b5b602002602001015160e001518360010160008560000154815260200190815260200160002060070181905550818181518110610ae057610adf612a69565b5b602002602001015160400151836001016000856000015481526020019081526020016000206002018190555060c8600154610b1b9190612ccf565b828281518110610b2e57610b2d612a69565b5b602002602001015160400151610b449190612d11565b8360010160008560000154815260200190815260200160002060080181905550818181518110610b7757610b76612a69565b5b6020026020010151606001518360010160008560000154815260200190815260200160002060030181905550818181518110610bb657610bb5612a69565b5b6020026020010151608001518360010160008560000154815260200190815260200160002060040181905550818181518110610bf557610bf4612a69565b5b602002602001015160a001518360010160008560000154815260200190815260200160002060050181905550818181518110610c3457610c33612a69565b5b602002602001015160c001518360010160008560000154815260200190815260200160002060060181905550818181518110610c7357610c72612a69565b5b602002602001015160000151836002016000828254610c929190612d11565b92505081905550818181518110610cac57610cab612a69565b5b602002602001015160200151836003016000828254610ccb9190612d11565b92505081905550818181518110610ce557610ce4612a69565b5b602002602001015160800151828281518110610d0457610d03612a69565b5b602002602001015160600151610d1a9190612d11565b836004016000828254610d2d9190612d11565b92505081905550818181518110610d4757610d46612a69565b5b602002602001015160a00151836005016000828254610d669190612d11565b92505081905550818181518110610d8057610d7f612a69565b5b602002602001015160c00151836006016000828254610d9f9190612d11565b925050819055507f893e8a14c42d0303c66e296f4c3e4ed772edf8097f8d41ab8d08099654172ec08360000154868681518110610ddf57610dde612a69565b5b6020026020010151848481518110610dfa57610df9612a69565b5b602002602001015160000151858581518110610e1957610e18612a69565b5b60200260200101516020015142604051610e37959493929190612d45565b60405180910390a1826000016000815480929190610e5490612d98565b91905055505b80806001019150506109b7565b5050505b80806001019150506107b2565b5050565b60606000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015467ffffffffffffffff811115610ee157610ee06124a6565b5b604051908082528060200260200182016040528015610f1a57816020015b610f076122db565b815260200190600190039081610eff5790505b50905060005b8260000154811015610fd257826001016000828152602001908152602001600020604051806101200160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481526020016006820154815260200160078201548152602001600882015481525050828281518110610fba57610fb9612a69565b5b60200260200101819052508080600101915050610f20565b508092505050919050565b600080600080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600080600080846007015490505b846000015481101561123b576000856001016000838152602001908152602001600020600801544211156110e05785600101600083815260200190815260200160002060070154866001016000848152602001908152602001600020600801541161109e5760006110db565b85600101600083815260200190815260200160002060070154866001016000848152602001908152602001600020600801546110da9190612de0565b5b611105565b85600101600083815260200190815260200160002060070154426111049190612de0565b5b9050600081111561122d5760006103e86001546111229190612ccf565b8260008054906101000a900460ff1660ff16896001016000878152602001908152602001600020600001546111579190612ccf565b6111619190612ccf565b61116b9190612e43565b9050600061271060015461117f9190612ccf565b8360008054906101000a900460ff1660ff168a6001016000888152602001908152602001600020600101546111b49190612ccf565b6111be9190612ccf565b600b6111ca9190612ccf565b6111d49190612e43565b9050600081836111e49190612d11565b90506064836111f39190612ccf565b876111fe9190612d11565b96506101f48361120e9190612ccf565b866112199190612d11565b955080886112279190612d11565b97505050505b508080600101915050611032565b50828282965096509650505050509193909250565b60008054906101000a900460ff1681565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060080160009054906101000a900460ff166112f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ec90612ec0565b60405180910390fd5b600080600080846007015490505b84600001548110156116e4576000856001016000838152602001908152602001600020600801544211156113b15785600101600083815260200190815260200160002060070154866001016000848152602001908152602001600020600801541161136f5760006113ac565b85600101600083815260200190815260200160002060070154866001016000848152602001908152602001600020600801546113ab9190612de0565b5b6113d6565b85600101600083815260200190815260200160002060070154426113d59190612de0565b5b905060008111156116265760006103e86001546113f39190612ccf565b8260008054906101000a900460ff1660ff16896001016000878152602001908152602001600020600001546114289190612ccf565b6114329190612ccf565b61143c9190612e43565b905060006127106001546114509190612ccf565b8360008054906101000a900460ff1660ff168a6001016000888152602001908152602001600020600101546114859190612ccf565b61148f9190612ccf565b600b61149b9190612ccf565b6114a59190612e43565b905060006064836114b69190612ccf565b905060006101f4846114c89190612ccf565b9050600083856114d89190612d11565b9050848b600101600089815260200190815260200160002060030160008282546115029190612d11565b92505081905550838b600101600089815260200190815260200160002060040160008282546115319190612d11565b92505081905550428b600101600089815260200190815260200160002060070181905550828b6001016000898152602001908152602001600020600501600082825461157d9190612d11565b92505081905550818b600101600089815260200190815260200160002060060160008282546115ac9190612d11565b925050819055507f194c8d0132d20112211dfa71bb87a92766fde4f4318e08efd2cc4a6e188e509d3382878787878c6040516115ee9796959493929190612ee0565b60405180910390a1808a6116029190612d11565b995082896116109190612d11565b9850818861161e9190612d11565b975050505050505b85600101600083815260200190815260200160002060010154866001016000848152602001908152602001600020600001546116629190612d11565b600b600a886001016000868152602001908152602001600020600401546116899190612ccf565b6116939190612e43565b876001016000858152602001908152602001600020600301546116b69190612d11565b106116d6578560070160008154809291906116d090612d98565b91905055505b508080600101915050611303565b50828460040160008282546116f99190612d11565b92505081905550818460050160008282546117149190612d11565b925050819055508084600601600082825461172f9190612d11565b925050819055506000831180156117465750824710155b611785576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177c90612f9b565b60405180910390fd5b60008211156118e057600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff1660e01b81526004016117eb92919061297b565b6020604051808303816000875af115801561180a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061182e91906129d0565b50600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33633b9aca008461187e9190612e43565b6040518363ffffffff1660e01b815260040161189b92919061297b565b6020604051808303816000875af11580156118ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118de91906129d0565b505b3373ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611926573d6000803e3d6000fd5b5050505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b49061295b565b60405180910390fd5b80600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915090508060000154908060020154908060030154908060040154908060050154908060060154908060070154908060080160009054906101000a900460ff16905088565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b039061295b565b60405180910390fd5b60005b8151811015611b9a57600060076000848481518110611b3157611b30612a69565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060080160006101000a81548160ff0219169083151502179055508080600101915050611b0f565b5050565b6000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060080160009054906101000a900460ff16611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2990613007565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611c8f9190612448565b602060405180830381865afa158015611cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd09190613027565b90506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401611d2f9190612448565b602060405180830381865afa158015611d4c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d709190613027565b90506000821180611d815750600081115b611dc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db7906130a0565b60405180910390fd5b6000821115611e6d57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330856040518463ffffffff1660e01b8152600401611e28939291906130c0565b6020604051808303816000875af1158015611e47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6b91906129d0565b505b6000811115611f1a57600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330846040518463ffffffff1660e01b8152600401611ed5939291906130c0565b6020604051808303816000875af1158015611ef4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f1891906129d0565b505b81836001016000856000015481526020019081526020016000206000018190555080836001016000856000015481526020019081526020016000206001018190555042836001016000856000015481526020019081526020016000206007018190555042836001016000856000015481526020019081526020016000206002018190555060c8600154611fad9190612ccf565b42611fb89190612d11565b836001016000856000015481526020019081526020016000206008018190555081836002016000828254611fec9190612d11565b92505081905550808360030160008282546120079190612d11565b925050819055507f893e8a14c42d0303c66e296f4c3e4ed772edf8097f8d41ab8d08099654172ec0836000015433848442604051612049959493929190612d45565b60405180910390a182600001600081548092919061206690612d98565b9190505550505050565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612100576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f79061295b565b60405180910390fd5b60005b815181101561218e5760016007600084848151811061212557612124612a69565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060080160006101000a81548160ff0219169083151502179055508080600101915050612103565b5050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461226e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122659061295b565b60405180910390fd5b600660149054906101000a900460ff16156122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b590613143565b60405180910390fd5b6001600660146101000a81548160ff021916908315150217905550565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006123668261233b565b9050919050565b6123768161235b565b811461238157600080fd5b50565b6000813590506123938161236d565b92915050565b6000819050919050565b6123ac81612399565b81146123b757600080fd5b50565b6000813590506123c9816123a3565b92915050565b600080604083850312156123e6576123e5612331565b5b60006123f485828601612384565b9250506020612405858286016123ba565b9150509250929050565b61241881612399565b82525050565b6000602082019050612433600083018461240f565b92915050565b6124428161235b565b82525050565b600060208201905061245d6000830184612439565b92915050565b60006020828403121561247957612478612331565b5b6000612487848285016123ba565b91505092915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6124de82612495565b810181811067ffffffffffffffff821117156124fd576124fc6124a6565b5b80604052505050565b6000612510612327565b905061251c82826124d5565b919050565b600067ffffffffffffffff82111561253c5761253b6124a6565b5b602082029050602081019050919050565b600080fd5b600061256561256084612521565b612506565b905080838252602082019050602084028301858111156125885761258761254d565b5b835b818110156125b1578061259d8882612384565b84526020840193505060208101905061258a565b5050509392505050565b600082601f8301126125d0576125cf612490565b5b81356125e0848260208601612552565b91505092915050565b6000602082840312156125ff576125fe612331565b5b600082013567ffffffffffffffff81111561261d5761261c612336565b5b612629848285016125bb565b91505092915050565b60006020828403121561264857612647612331565b5b600061265684828501612384565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61269481612399565b82525050565b610120820160008201516126b1600085018261268b565b5060208201516126c4602085018261268b565b5060408201516126d7604085018261268b565b5060608201516126ea606085018261268b565b5060808201516126fd608085018261268b565b5060a082015161271060a085018261268b565b5060c082015161272360c085018261268b565b5060e082015161273660e085018261268b565b5061010082015161274b61010085018261268b565b50505050565b600061275d838361269a565b6101208301905092915050565b6000602082019050919050565b60006127828261265f565b61278c818561266a565b93506127978361267b565b8060005b838110156127c85781516127af8882612751565b97506127ba8361276a565b92505060018101905061279b565b5085935050505092915050565b600060208201905081810360008301526127ef8184612777565b905092915050565b600060608201905061280c600083018661240f565b612819602083018561240f565b612826604083018461240f565b949350505050565b600060ff82169050919050565b6128448161282e565b82525050565b600060208201905061285f600083018461283b565b92915050565b60008115159050919050565b61287a81612865565b82525050565b600061010082019050612896600083018b61240f565b6128a3602083018a61240f565b6128b0604083018961240f565b6128bd606083018861240f565b6128ca608083018761240f565b6128d760a083018661240f565b6128e460c083018561240f565b6128f160e0830184612871565b9998505050505050505050565b600082825260208201905092915050565b7f4e6f742061646d696e0000000000000000000000000000000000000000000000600082015250565b60006129456009836128fe565b91506129508261290f565b602082019050919050565b6000602082019050818103600083015261297481612938565b9050919050565b60006040820190506129906000830185612439565b61299d602083018461240f565b9392505050565b6129ad81612865565b81146129b857600080fd5b50565b6000815190506129ca816129a4565b92915050565b6000602082840312156129e6576129e5612331565b5b60006129f4848285016129bb565b91505092915050565b7f536574746c656d656e7420646f6e650000000000000000000000000000000000600082015250565b6000612a33600f836128fe565b9150612a3e826129fd565b602082019050919050565b60006020820190508181036000830152612a6281612a26565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600067ffffffffffffffff821115612ab357612ab26124a6565b5b602082029050602081019050919050565b600080fd5b600081519050612ad8816123a3565b92915050565b60006101208284031215612af557612af4612ac4565b5b612b00610120612506565b90506000612b1084828501612ac9565b6000830152506020612b2484828501612ac9565b6020830152506040612b3884828501612ac9565b6040830152506060612b4c84828501612ac9565b6060830152506080612b6084828501612ac9565b60808301525060a0612b7484828501612ac9565b60a08301525060c0612b8884828501612ac9565b60c08301525060e0612b9c84828501612ac9565b60e083015250610100612bb184828501612ac9565b6101008301525092915050565b6000612bd1612bcc84612a98565b612506565b9050808382526020820190506101208402830185811115612bf557612bf461254d565b5b835b81811015612c1f5780612c0a8882612ade565b84526020840193505061012081019050612bf7565b5050509392505050565b600082601f830112612c3e57612c3d612490565b5b8151612c4e848260208601612bbe565b91505092915050565b600060208284031215612c6d57612c6c612331565b5b600082015167ffffffffffffffff811115612c8b57612c8a612336565b5b612c9784828501612c29565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612cda82612399565b9150612ce583612399565b9250828202612cf381612399565b91508282048414831517612d0a57612d09612ca0565b5b5092915050565b6000612d1c82612399565b9150612d2783612399565b9250828201905080821115612d3f57612d3e612ca0565b5b92915050565b600060a082019050612d5a600083018861240f565b612d676020830187612439565b612d74604083018661240f565b612d81606083018561240f565b612d8e608083018461240f565b9695505050505050565b6000612da382612399565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612dd557612dd4612ca0565b5b600182019050919050565b6000612deb82612399565b9150612df683612399565b9250828203905081811115612e0e57612e0d612ca0565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612e4e82612399565b9150612e5983612399565b925082612e6957612e68612e14565b5b828204905092915050565b7f5573657220626c6f636b65640000000000000000000000000000000000000000600082015250565b6000612eaa600c836128fe565b9150612eb582612e74565b602082019050919050565b60006020820190508181036000830152612ed981612e9d565b9050919050565b600060e082019050612ef5600083018a612439565b612f02602083018961240f565b612f0f604083018861240f565b612f1c606083018761240f565b612f29608083018661240f565b612f3660a083018561240f565b612f4360c083018461240f565b98975050505050505050565b7f496e76616c696420776974686472617700000000000000000000000000000000600082015250565b6000612f856010836128fe565b9150612f9082612f4f565b602082019050919050565b60006020820190508181036000830152612fb481612f78565b9050919050565b7f426c6f636b656420757365720000000000000000000000000000000000000000600082015250565b6000612ff1600c836128fe565b9150612ffc82612fbb565b602082019050919050565b6000602082019050818103600083015261302081612fe4565b9050919050565b60006020828403121561303d5761303c612331565b5b600061304b84828501612ac9565b91505092915050565b7f496e73756666696369656e7420757365722062616c616e636500000000000000600082015250565b600061308a6019836128fe565b915061309582613054565b602082019050919050565b600060208201905081810360008301526130b98161307d565b9050919050565b60006060820190506130d56000830186612439565b6130e26020830185612439565b6130ef604083018461240f565b949350505050565b7f416c726561647920656e64656400000000000000000000000000000000000000600082015250565b600061312d600d836128fe565b9150613138826130f7565b602082019050919050565b6000602082019050818103600083015261315c81613120565b905091905056fea264697066735822122098ffde05762cfe8b28e946c4bb5ca8177b4279c1b39cba7477645f83787d4b6764736f6c634300081a0033