MATIC Price: $1.02 (+0.11%)
Gas: 134 GWei
 

Overview

MATIC Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 MATIC

MATIC Value

$0.00

Token Holdings

Sponsored

Transaction Hash
Method
Block
From
To
Value
Create Stake237535072022-01-15 16:28:02802 days ago1642264082IN
0x8E410fa2...5C4eb2F2a
0 MATIC0.00775530
Transfer Ownersh...213187842021-11-13 10:37:55865 days ago1636799875IN
0x8E410fa2...5C4eb2F2a
0 MATIC0.0008593530
0x60806040212237302021-11-10 22:08:56868 days ago1636582136IN
 Create: NexenStakingPool
0 MATIC0.1390309550

Parent Txn Hash Block From To Value
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NexenStakingPool

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 4: NexenStaking.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.10;

import "./Ownable.sol";
import "./IERC20.sol";


library Date {
    struct _Date {
        uint16 year;
        uint8 month;
        uint8 day;
    }

    uint constant DAY_IN_SECONDS = 86400;
    uint constant YEAR_IN_SECONDS = 31536000;
    uint constant LEAP_YEAR_IN_SECONDS = 31622400;

    uint16 constant ORIGIN_YEAR = 1970;

    function isLeapYear(uint16 year) public pure returns (bool) {
        if (year % 4 != 0) {
                return false;
        }
        if (year % 100 != 0) {
                return true;
        }
        if (year % 400 != 0) {
                return false;
        }
        return true;
    }

    function leapYearsBefore(uint year) public pure returns (uint) {
        year -= 1;
        return year / 4 - year / 100 + year / 400;
    }

    function getDaysInMonth(uint8 month, uint16 year) public pure returns (uint8) {
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
                return 31;
        }
        else if (month == 4 || month == 6 || month == 9 || month == 11) {
                return 30;
        }
        else if (isLeapYear(year)) {
                return 29;
        }
        else {
                return 28;
        }
    }

    function parseTimestamp(uint timestamp) internal pure returns (_Date memory dt) {
        uint secondsAccountedFor = 0;
        uint buf;
        uint8 i;

        // Year
        dt.year = getYear(timestamp);
        buf = leapYearsBefore(dt.year) - leapYearsBefore(ORIGIN_YEAR);

        secondsAccountedFor += LEAP_YEAR_IN_SECONDS * buf;
        secondsAccountedFor += YEAR_IN_SECONDS * (dt.year - ORIGIN_YEAR - buf);

        // Month
        uint secondsInMonth;
        for (i = 1; i <= 12; i++) {
                secondsInMonth = DAY_IN_SECONDS * getDaysInMonth(i, dt.year);
                if (secondsInMonth + secondsAccountedFor > timestamp) {
                        dt.month = i;
                        break;
                }
                secondsAccountedFor += secondsInMonth;
        }

        // Day
        for (i = 1; i <= getDaysInMonth(dt.month, dt.year); i++) {
                if (DAY_IN_SECONDS + secondsAccountedFor > timestamp) {
                        dt.day = i;
                        break;
                }
                secondsAccountedFor += DAY_IN_SECONDS;
        }
    }

    function getYear(uint timestamp) public pure returns (uint16) {
        uint secondsAccountedFor = 0;
        uint16 year;
        uint numLeapYears;

        // Year
        year = uint16(ORIGIN_YEAR + timestamp / YEAR_IN_SECONDS);
        numLeapYears = leapYearsBefore(year) - leapYearsBefore(ORIGIN_YEAR);

        secondsAccountedFor += LEAP_YEAR_IN_SECONDS * numLeapYears;
        secondsAccountedFor += YEAR_IN_SECONDS * (year - ORIGIN_YEAR - numLeapYears);

        while (secondsAccountedFor > timestamp) {
                if (isLeapYear(uint16(year - 1))) {
                        secondsAccountedFor -= LEAP_YEAR_IN_SECONDS;
                }
                else {
                        secondsAccountedFor -= YEAR_IN_SECONDS;
                }
                year -= 1;
        }
        return year;
    }

    function getMonth(uint timestamp) public pure returns (uint8) {
        return parseTimestamp(timestamp).month;
    }

    function getDay(uint timestamp) public pure returns (uint8) {
        return parseTimestamp(timestamp).day;
    }

    function toTimestamp(uint16 year, uint8 month, uint8 day) public pure returns (uint timestamp) {
        uint16 i;

        // Year
        for (i = ORIGIN_YEAR; i < year; i++) {
                if (isLeapYear(i)) {
                        timestamp += LEAP_YEAR_IN_SECONDS;
                }
                else {
                        timestamp += YEAR_IN_SECONDS;
                }
        }

        // Month
        uint8[12] memory monthDayCounts;
        monthDayCounts[0] = 31;
        if (isLeapYear(year)) {
                monthDayCounts[1] = 29;
        }
        else {
                monthDayCounts[1] = 28;
        }
        monthDayCounts[2] = 31;
        monthDayCounts[3] = 30;
        monthDayCounts[4] = 31;
        monthDayCounts[5] = 30;
        monthDayCounts[6] = 31;
        monthDayCounts[7] = 31;
        monthDayCounts[8] = 30;
        monthDayCounts[9] = 31;
        monthDayCounts[10] = 30;
        monthDayCounts[11] = 31;

        for (i = 1; i < month; i++) {
                timestamp += DAY_IN_SECONDS * monthDayCounts[i - 1];
        }

        // Day
        timestamp += DAY_IN_SECONDS * (day - 1);

        return timestamp;
    }
}



contract NexenStakingPool is Ownable {
    IERC20 token = IERC20(0xb32e335B798A1Ac07007390683A128f134aa6e25);
    uint256 decimals = 18;
    uint256 minimumStakeAmount = 1000;
    address ZERO_ADDRESS = 0x0000000000000000000000000000000000000000;

    //Stats
    uint256 public totalStakes = 0;
    uint256 public totalStaked = 0;
    uint256 public adminCanWithdraw = 0;
    mapping(uint8 => uint256) public totalByLockup;
    uint256 public totalCompounding = 0;
    uint256 public totalNotCompounding = 0;

    struct Stake {
        bool exists;
        uint256 createdOn;
        uint256 initialAmount;
        bool compound;
        uint8 lockupPeriod;
        uint256 withdrawn;
        address referrer;
    }
    
    mapping(address => Stake) public stakes;
    
    uint256 DEFAULT_ROI1 = 13; //0.13% daily ROI, equivalent to 4% monthly
    uint256 DEFAULT_ROI2 = 15; //0.15% daily ROI
    uint256 DEFAULT_ROI3 = 17; //0.17% daily ROI
    uint256 DEFAULT_ROI6 = 19; //0.19% daily ROI
    
    bool isValidLockup1 = true;
    bool isValidLockup2 = false;
    bool isValidLockup3 = false;
    bool isValidLockup6 = false;

    struct ROI {
        bool exists;
        uint256 roi1;   
        uint256 roi2;
        uint256 roi3;
        uint256 roi6;
    }

    //Year to Month to ROI
    mapping (uint256 => mapping (uint256 => ROI)) private rois;
    
    event NewStake(address indexed staker, uint256 totalStaked, uint8 lockupPeriod, bool compound, address referrer);
    event StakeIncreasedForReferral(address indexed staker, uint256 initialAmount, uint256 delta);
    event RewardsWithdrawn(address indexed staker, uint256 total);
    event StakeFinished(address indexed staker, uint256 totalReturned, uint256 totalDeducted);
    
    function createStake(uint256 _amount, uint8 _lockupPeriod, bool _compound, address _referrer) public {
        require(!stakes[msg.sender].exists, "You already have a stake");
        require(_isValidLockupPeriod(_lockupPeriod), "Invalid lockup period");
        require(_amount >= getMinimumStakeAmount(), "Invalid minimum");
        
        require(IERC20(token).transferFrom(msg.sender, address(this), calculateTotalWithDecimals(_amount)), "Couldn't take the tokens");
        
        if (_referrer != address(0) && stakes[_referrer].exists) {
            uint256 amountToIncrease = stakes[_referrer].initialAmount / 100;
            emit StakeIncreasedForReferral(_referrer, stakes[_referrer].initialAmount, amountToIncrease);
            stakes[_referrer].initialAmount += amountToIncrease;
            totalStaked += amountToIncrease; 
        }
        else {
            _referrer = ZERO_ADDRESS;
        }

        Stake memory stake = Stake({exists:true,
                                    createdOn: block.timestamp, 
                                    initialAmount:_amount, 
                                    compound:_compound, 
                                    lockupPeriod:_lockupPeriod, 
                                    withdrawn:0,
                                    referrer:_referrer
        });
                                    
        stakes[msg.sender] = stake;
        totalStakes += 1;
        totalStaked += _amount;
        totalByLockup[_lockupPeriod] += 1;
        if (_compound) {
            totalCompounding += 1;
        } else {
            totalNotCompounding += 1;
        }
        
        emit NewStake(msg.sender, _amount, _lockupPeriod, _compound, _referrer);
    }
    
    function withdraw() public {
        require(stakes[msg.sender].exists, "Invalid stake");
        require(!stakes[msg.sender].compound, "Compounders can't withdraw before they finish their stake");

        Stake storage stake = stakes[msg.sender];
        uint256 total = getPartialToWidthdrawForNotCompounders(msg.sender, block.timestamp);
        stake.withdrawn += total;
        
        require(token.transfer(msg.sender, calculateTotalWithDecimals(total)), "Couldn't withdraw");

        emit RewardsWithdrawn(msg.sender, total);
    }
    
    function finishStake() public {
        require(stakes[msg.sender].exists, "Invalid stake");
        
        Stake memory stake = stakes[msg.sender];
        
        uint256 finishesOn = _calculateFinishTimestamp(stake.createdOn, stake.lockupPeriod);
        require(block.timestamp > finishesOn || !stake.compound, "Can't be finished yet");
        
        uint256 totalRewards;
        uint256 totalFees;
        uint256 totalPenalty;
        
        if (stake.compound) {
            totalRewards = getTotalToWidthdrawForCompounders(msg.sender); //This includes the initial amount
            totalRewards -= stake.initialAmount;
            totalFees = totalRewards * 5 / 100; //Flat fee of 5%
        }
        else {
            if (block.timestamp > finishesOn) {
                totalRewards = getTotalToWidthdrawForNotCompounders(msg.sender);
            }  
            else {
                totalRewards = getPartialToWidthdrawForNotCompounders(msg.sender, block.timestamp);
                //As it didn't finish, pay a fee of 10% (before first half) or 5% (after first half)
                uint8 penalty = _isFirstHalf(stake.createdOn, stake.lockupPeriod) ? 10 : 5;
                totalPenalty = totalRewards * penalty / 100;
            }
            totalFees = totalRewards * 2 / 100; //Flat fee of 2%
        }
        
        uint256 totalToDeduct = totalFees + totalPenalty;
        uint256 totalToTransfer = totalRewards + stake.initialAmount - totalToDeduct;
        adminCanWithdraw += totalToDeduct;

        totalStakes -= 1;
        totalStaked -= stake.initialAmount;
        totalByLockup[stake.lockupPeriod] -= 1;
        if (stake.compound) {
            totalCompounding -= 1;
        } else {
            totalNotCompounding -= 1;
        }
        delete stakes[msg.sender];

        require(token.transfer(msg.sender, calculateTotalWithDecimals(totalToTransfer)), "Couldn't transfer the tokens");
        
        emit StakeFinished(msg.sender, totalToTransfer, totalToDeduct);
    }
    
    function calculateTotalWithDecimals(uint256 _amount) internal view returns (uint256) {
        return _amount * 10 ** decimals;
    }
    
    function _isFirstHalf(uint256 _createdOn, uint8 _lockupPeriod) internal view returns (bool) {
        uint256 day = 60 * 60 * 24;
        
        if (_lockupPeriod == 1) {
            return _createdOn + day + 15 > block.timestamp;
        }
        if (_lockupPeriod == 2) {
            return _createdOn + day + 30 > block.timestamp;
        }
        if (_lockupPeriod == 3) {
            return _createdOn + day + 45 > block.timestamp;
        }
        return _createdOn + day + 90 > block.timestamp;
    }
    
    function calcPartialRewardsForInitialMonth(Stake memory stake, uint8 _todayDay, Date._Date memory _initial, bool compounding) internal view returns (uint256) {
        uint256 roi = getRoi(_initial.month, _initial.year, stake.lockupPeriod);
        uint8 totalDays = _todayDay - _initial.day;
        return calculateRewards(stake.initialAmount, totalDays, roi, compounding);
    }

    function calcFullRewardsForInitialMonth(Stake memory stake, Date._Date memory _initial, bool compounding) internal view returns (uint256) {
        uint8 totalDays = Date.getDaysInMonth(_initial.month, _initial.year);
        uint256 roi = getRoi(_initial.month, _initial.year, stake.lockupPeriod);
        uint8 countDays = totalDays - _initial.day;
        return calculateRewards(stake.initialAmount, countDays, roi, compounding);
    }
    
    function calcFullRewardsForMonth(uint256 _currentTotal, uint256 _roi, uint16 _year, uint8 _month, bool compounding) internal pure returns (uint256) {
        uint256 totalDays = Date.getDaysInMonth(_month, _year);
        return calculateRewards(_currentTotal, totalDays, _roi, compounding);
    }
    
    function calculateRewards(uint256 currentTotal, uint256 totalDays, uint256 roi, bool compounding) internal pure returns (uint256) {
        if (compounding) {
            uint256 divFactor = 10000 ** 10;
            while(totalDays > 10) {
                currentTotal = currentTotal * ((roi + 10000) ** 10) / divFactor;
                totalDays -= 10;
            }
            return currentTotal = currentTotal * ((roi + 10000) ** totalDays) / (10000 ** totalDays);
        }
        
        //Not compounding
        return currentTotal * totalDays * roi / 10000;
    }
    
    //This function is meant to be called internally when finishing your stake
    function getTotalToWidthdrawForNotCompounders(address _account) internal view returns (uint256) {
        Stake memory stake = stakes[_account];
        
        Date._Date memory initial = Date.parseTimestamp(stake.createdOn);
        
        uint256 total = calcFullRewardsForInitialMonth(stake, initial, false);
        
        uint256 finishTimestamp = _calculateFinishTimestamp(stake.createdOn, stake.lockupPeriod);
        Date._Date memory finishes = Date.parseTimestamp(finishTimestamp);
        
        for(uint8 i=1;i<=stake.lockupPeriod;i++) {
            uint8 currentMonth = initial.month + i;
            uint16 currentYear = initial.year;
            if (currentMonth > 12) {
                currentYear += 1;
                currentMonth = currentMonth % 12;
            }

            uint256 roi = getRoi(currentMonth, currentYear ,stake.lockupPeriod);

            //This is the month it finishes on
            if (currentMonth == finishes.month) {
                //Calculates partial rewards for month
                total += calculateRewards(stake.initialAmount, finishes.day, roi, false);
                break;
            }
            
            //This is a complete month I need to add
            total += calcFullRewardsForMonth(stake.initialAmount, roi, currentYear, currentMonth, false);
        }
        
        total -= stake.withdrawn;
        return total;
    }
    
    //This function is meant to be called internally when withdrawing as much as you can, or by the UI
    function getPartialToWidthdrawForNotCompounders(address _account, uint256 _now) public view returns (uint256) {
        Stake memory stake = stakes[_account];
        
        Date._Date memory initial = Date.parseTimestamp(stake.createdOn);
        Date._Date memory today = Date.parseTimestamp(_now);
        
        //I am still in my first month of staking
        if (initial.month == today.month) {
            return calcPartialRewardsForInitialMonth(stake, today.day, initial, false) - stake.withdrawn;
        }
        
        //I am in a month after my first month of staking
        uint256 total = calcFullRewardsForInitialMonth(stake, initial, false);
        
        uint256 finishTimestamp = _calculateFinishTimestamp(stake.createdOn, stake.lockupPeriod);
        Date._Date memory finishes = Date.parseTimestamp(finishTimestamp);
        
        for(uint8 i=1;i<=stake.lockupPeriod;i++) {
            uint8 currentMonth = initial.month + i;
            uint16 currentYear = initial.year;
            if (currentMonth > 12) {
                currentYear += 1;
                currentMonth = currentMonth % 12;
            }

            uint256 roi = getRoi(currentMonth, currentYear, stake.lockupPeriod);

            //This is the month it finishes
            if (currentMonth == finishes.month) {
                uint8 upToDay = _getMin(finishes.day, today.day);
                //Calculates partial rewards for month
                total += calculateRewards(stake.initialAmount, upToDay, roi, false);
                break;
            }
            else if (currentMonth == today.month) { // We reached the current month
                //Calculates partial rewards for month
                total += calculateRewards(stake.initialAmount, today.day, roi, false);
                break;
            }
            
            //This is a complete month I need to add
            total += calcFullRewardsForMonth(stake.initialAmount, roi, currentYear, currentMonth, false);
        }
        
        total -= stake.withdrawn;
        return total;
    }
    
    //This function is meant to be called internally on finishing your stake
    function getTotalToWidthdrawForCompounders(address _account) internal view returns (uint256) {
        Stake memory stake = stakes[_account];
        
        Date._Date memory initial = Date.parseTimestamp(stake.createdOn);
        
        uint256 total = calcFullRewardsForInitialMonth(stake, initial, true);
        
        uint256 finishTimestamp = _calculateFinishTimestamp(stake.createdOn, stake.lockupPeriod);
        Date._Date memory finishes = Date.parseTimestamp(finishTimestamp);
        
        for(uint8 i=1;i<=stake.lockupPeriod;i++) {
            uint8 currentMonth = initial.month + i;
            uint16 currentYear = initial.year;
            if (currentMonth > 12) {
                currentYear += 1;
                currentMonth = currentMonth % 12;
            }

            uint256 roi = getRoi(currentMonth, currentYear, stake.lockupPeriod);

            //This is the month it finishes on
            if (currentMonth == finishes.month) {
                //Calculates partial rewards for month
                return calculateRewards(total, finishes.day, roi, true);
            }
            
            //This is a complete month I need to add
            total = calcFullRewardsForMonth(total, roi, currentYear, currentMonth, true);
        }
        
        return total;
    }
    
    //This function is meant to be called from the UI
    function getPartialRewardsForCompounders(address _account, uint256 _now) public view returns (uint256) {
        Stake memory stake = stakes[_account];
        
        Date._Date memory initial = Date.parseTimestamp(stake.createdOn);
        Date._Date memory today = Date.parseTimestamp(_now);
        
        //I am still in my first month of staking
        if (initial.month == today.month) {
            return calcPartialRewardsForInitialMonth(stake, today.day, initial, true) - stake.withdrawn;
        }
        
        //I am in a month after my first month of staking
        uint256 total = calcFullRewardsForInitialMonth(stake, initial, true);
        
        uint256 finishTimestamp = _calculateFinishTimestamp(stake.createdOn, stake.lockupPeriod);
        Date._Date memory finishes = Date.parseTimestamp(finishTimestamp);
        
        for(uint8 i=1;i<=stake.lockupPeriod;i++) {
            uint8 currentMonth = initial.month + i;
            uint16 currentYear = initial.year;
            if (currentMonth > 12) {
                currentYear += 1;
                currentMonth = currentMonth % 12;
            }

            uint256 roi = getRoi(currentMonth, currentYear, stake.lockupPeriod);

            //This is the month it finishes
            if (currentMonth == finishes.month) {
                uint8 upToDay = _getMin(finishes.day, today.day);
                //Calculates partial rewards for month
                return calculateRewards(total, upToDay, roi, true);
            }
            else if (currentMonth == today.month) { // We reached the current month
                //Calculates partial rewards for month
                return calculateRewards(total, today.day, roi, true);
            }
            
            //This is a complete month I need to add
            total = calcFullRewardsForMonth(total, roi, currentYear, currentMonth, true);
        }
        
        return total;
    }
    
    function _getMin(uint8 num1, uint8 num2) internal pure returns (uint8) {
        if (num1 < num2) {
            return num1;
        }
        
        return num2;
    }
    
    function calculateFinishTimestamp(address account) public view returns (uint256) {
        return _calculateFinishTimestamp(stakes[account].createdOn, stakes[account].lockupPeriod);
    }
    
    function _calculateFinishTimestamp(uint256 _timestamp, uint8 _lockupPeriod) internal pure returns (uint256) {
        uint16 year = Date.getYear(_timestamp);
        uint8 month = Date.getMonth(_timestamp);
        month += _lockupPeriod;
        if (month > 12) {
            year += 1;
            month = month % 12;
        }
        uint8 day = Date.getDay(_timestamp);
        return Date.toTimestamp(year, month, day);
    }
    
    function _isValidLockupPeriod(uint8 n) public view returns (bool) {
        return (isValidLockup1 && n == 1) || (isValidLockup2 && n == 2) || (isValidLockup3 && n == 3) || (isValidLockup6 && n == 6);
    }
    
    function _setValidLockups(bool _isValidLockup1, bool _isValidLockup2, bool _isValidLockup3, bool _isValidLockup6) public onlyOwner {
        isValidLockup1 = _isValidLockup1;
        isValidLockup2 = _isValidLockup2;
        isValidLockup3 = _isValidLockup3;
        isValidLockup6 = _isValidLockup6;
    }
    
    function _adminWithdraw() public onlyOwner {
        uint256 amount = adminCanWithdraw;
        adminCanWithdraw = 0;
        require(token.transfer(msg.sender, calculateTotalWithDecimals(amount)), "Couldn't withdraw");
    }

    function _extractNXN(uint256 amount, address _sendTo) public onlyOwner {
        require(token.transfer(_sendTo, amount));
    }
    
    function _updateToken(IERC20 _token) public onlyOwner {
        token = _token;
    }
    
    function _setMinimumStakeAmount(uint256 _minimumStakeAmount) public onlyOwner {
        minimumStakeAmount = _minimumStakeAmount;
    }

    function getMinimumStakeAmount() public view returns (uint256) {
        return minimumStakeAmount;
    }
    
    function _setRoi(uint256 _month, uint256 _year, uint256 _roi1, uint256 _roi2, uint256 _roi3, uint256 _roi6) public onlyOwner {
        uint256 today_year = Date.getYear(block.timestamp);
        uint256 today_month = Date.getMonth(block.timestamp);
        
        require((_month >= today_month  && _year == today_year) || _year > today_year, "You can only set it for this month or a future month");
        
        rois[_year][_month].exists = true;
        rois[_year][_month].roi1 = _roi1;
        rois[_year][_month].roi2 = _roi2;
        rois[_year][_month].roi3 = _roi3;
        rois[_year][_month].roi6 = _roi6;
    }
    
    function _setDefaultRoi(uint256 _roi1, uint256 _roi2, uint256 _roi3, uint256 _roi6) public onlyOwner {
        DEFAULT_ROI1 = _roi1;
        DEFAULT_ROI2 = _roi2;
        DEFAULT_ROI3 = _roi3;
        DEFAULT_ROI6 = _roi6;
    }
    
    function getRoi(uint256 month, uint256 year, uint8 lockupPeriod) public view returns (uint256) {
        if (rois[year][month].exists) {
            if (lockupPeriod == 1) {
                return rois[year][month].roi1;
            }
            else if (lockupPeriod == 2) {
                return rois[year][month].roi2;
            }
            else if (lockupPeriod == 3) {
                return rois[year][month].roi3;
            }
            else if (lockupPeriod == 6) {
                return rois[year][month].roi6;
            }
        }
        
        if (lockupPeriod == 1) {
            return DEFAULT_ROI1;
        }
        else if (lockupPeriod == 2) {
            return DEFAULT_ROI2;
        }
        else if (lockupPeriod == 3) {
            return DEFAULT_ROI3;
        }
        else if (lockupPeriod == 6) {
            return DEFAULT_ROI6;
        }
        
        return 0;
    }
}

File 1 of 4: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

File 2 of 4: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

File 4 of 4: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "Context.sol";

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

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStaked","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"lockupPeriod","type":"uint8"},{"indexed":false,"internalType":"bool","name":"compound","type":"bool"},{"indexed":false,"internalType":"address","name":"referrer","type":"address"}],"name":"NewStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"total","type":"uint256"}],"name":"RewardsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalReturned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalDeducted","type":"uint256"}],"name":"StakeFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"initialAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"delta","type":"uint256"}],"name":"StakeIncreasedForReferral","type":"event"},{"inputs":[],"name":"_adminWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_sendTo","type":"address"}],"name":"_extractNXN","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"n","type":"uint8"}],"name":"_isValidLockupPeriod","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_roi1","type":"uint256"},{"internalType":"uint256","name":"_roi2","type":"uint256"},{"internalType":"uint256","name":"_roi3","type":"uint256"},{"internalType":"uint256","name":"_roi6","type":"uint256"}],"name":"_setDefaultRoi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minimumStakeAmount","type":"uint256"}],"name":"_setMinimumStakeAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_month","type":"uint256"},{"internalType":"uint256","name":"_year","type":"uint256"},{"internalType":"uint256","name":"_roi1","type":"uint256"},{"internalType":"uint256","name":"_roi2","type":"uint256"},{"internalType":"uint256","name":"_roi3","type":"uint256"},{"internalType":"uint256","name":"_roi6","type":"uint256"}],"name":"_setRoi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isValidLockup1","type":"bool"},{"internalType":"bool","name":"_isValidLockup2","type":"bool"},{"internalType":"bool","name":"_isValidLockup3","type":"bool"},{"internalType":"bool","name":"_isValidLockup6","type":"bool"}],"name":"_setValidLockups","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"name":"_updateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminCanWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"calculateFinishTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_lockupPeriod","type":"uint8"},{"internalType":"bool","name":"_compound","type":"bool"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"createStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMinimumStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_now","type":"uint256"}],"name":"getPartialRewardsForCompounders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_now","type":"uint256"}],"name":"getPartialToWidthdrawForNotCompounders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"month","type":"uint256"},{"internalType":"uint256","name":"year","type":"uint256"},{"internalType":"uint8","name":"lockupPeriod","type":"uint8"}],"name":"getRoi","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakes","outputs":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"uint256","name":"createdOn","type":"uint256"},{"internalType":"uint256","name":"initialAmount","type":"uint256"},{"internalType":"bool","name":"compound","type":"bool"},{"internalType":"uint8","name":"lockupPeriod","type":"uint8"},{"internalType":"uint256","name":"withdrawn","type":"uint256"},{"internalType":"address","name":"referrer","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"totalByLockup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCompounding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNotCompounding","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600180546001600160a01b031990811673b32e335b798a1ac07007390683a128f134aa6e2517825560126002556103e860035560048054909116905560006005819055600681905560078190556009819055600a55600d600c819055600f908190556011600e55601390556010805463ffffffff1916909117905534801561008b57600080fd5b506100953361009a565b6100ea565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612d6880620000fa6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063817b1cd2116100de578063b219ed0f11610097578063c81bf2b111610071578063c81bf2b1146103a8578063d830d27c146103b1578063f2b519bc146103c4578063f2fde38b146103cc57600080fd5b8063b219ed0f14610379578063b85cf43e1461038c578063bf9befb11461039f57600080fd5b8063817b1cd2146102f95780638da5cb5b146103025780639ebdaa6d1461031d578063a284150714610330578063a56a30ec14610343578063b1a6043d1461036657600080fd5b806324db2c861161014b578063644315b711610125578063644315b7146102b8578063705142b8146102cb57806370fe9538146102de578063715018a6146102f157600080fd5b806324db2c86146102955780633765cf02146102a85780633ccfd60b146102b057600080fd5b806308a37f31146101935780630ad3c7651461019d5780630ff3f6c6146101b95780631600ec4b146101c257806316934fc4146101d55780631d71b85014610275575b600080fd5b61019b6103df565b005b6101a660095481565b6040519081526020015b60405180910390f35b6101a6600a5481565b6101a66101d03660046127e7565b610822565b6102326101e3366004612813565b600b6020526000908152604090208054600182015460028301546003840154600485015460059095015460ff94851695939492938284169361010090930490921691906001600160a01b031687565b604080519715158852602088019690965294860193909352901515606085015260ff16608084015260a08301526001600160a01b031660c082015260e0016101b0565b6101a661028336600461283f565b60086020526000908152604090205481565b6101a66102a3366004612813565b610a4d565b6003546101a6565b61019b610a82565b61019b6102c6366004612813565b610c92565b61019b6102d936600461286a565b610cde565b61019b6102ec3660046128bd565b61117d565b61019b61122b565b6101a660065481565b6000546040516001600160a01b0390911681526020016101b0565b61019b61032b3660046128ed565b611261565b61019b61033e36600461291f565b61129f565b61035661035136600461283f565b6112ce565b60405190151581526020016101b0565b6101a6610374366004612938565b61134b565b6101a66103873660046127e7565b611488565b61019b61039a366004612971565b6116c8565b6101a660055481565b6101a660075481565b61019b6103bf3660046129b4565b6118b4565b61019b61192c565b61019b6103da366004612813565b611a2c565b336000908152600b602052604090205460ff166104335760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964207374616b6560981b60448201526064015b60405180910390fd5b336000908152600b60209081526040808320815160e081018352815460ff908116151582526001830154948201859052600283015493820193909352600382015480841615156060830152610100900490921660808301819052600482015460a08401526005909101546001600160a01b031660c08301529092916104b791611ac4565b9050804211806104c957508160600151155b61050d5760405162461bcd60e51b815260206004820152601560248201527410d85b89dd08189948199a5b9a5cda1959081e595d605a1b604482015260640161042a565b60008060008460600151156105575761052533611cf8565b92508460400151836105379190612a1b565b92506064610546846005612a32565b6105509190612a67565b91506105d6565b8342111561056f5761056833611e86565b92506105bc565b6105793342611488565b9250600061058f8660200151876080015161203a565b61059a57600561059d565b600a5b905060646105ae60ff831686612a32565b6105b89190612a67565b9150505b60646105c9846002612a32565b6105d39190612a67565b91505b60006105e28284612a7b565b90506000818760400151866105f79190612a7b565b6106019190612a1b565b905081600760008282546106159190612a7b565b9250508190555060016005600082825461062f9190612a1b565b909155505060408701516006805460009061064b908490612a1b565b9091555050608087015160ff166000908152600860205260408120805460019290610677908490612a1b565b90915550506060870151156106a4576001600960008282546106999190612a1b565b909155506106bd9050565b6001600a60008282546106b79190612a1b565b90915550505b336000818152600b60205260408120805460ff1916815560018082018390556002820183905560038201805461ffff19169055600482019290925560050180546001600160a01b0319169055546001600160a01b03169063a9059cbb90610723846120ce565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561076e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107929190612a93565b6107de5760405162461bcd60e51b815260206004820152601c60248201527f436f756c646e2774207472616e736665722074686520746f6b656e7300000000604482015260640161042a565b604080518281526020810184905233917fa287afc36219422479b90fe9ac2672e28735d1bdd05d78553521159f9f525f6d910160405180910390a250505050505050565b6001600160a01b038083166000908152600b60209081526040808320815160e081018352815460ff90811615158252600183015494820185905260028301549382019390935260038201548084161515606083015261010090049092166080830152600481015460a08301526005015490931660c084015290919082906108a8906120e9565b905060006108b5856120e9565b9050806020015160ff16826020015160ff1614156108f7578260a001516108e3848360400151856001612270565b6108ed9190612a1b565b9350505050610a47565b6000610905848460016122c7565b9050600061091b85602001518660800151611ac4565b90506000610928826120e9565b905060015b866080015160ff168160ff1611610a3d5760008187602001516109509190612ab0565b8751909150600c60ff8316111561097c5761096c600182612ad5565b9050610979600c83612afb565b91505b60006109948360ff168361ffff168c6080015161134b565b9050846020015160ff168360ff1614156109e05760006109bc86604001518a6040015161239e565b90506109ce888260ff168460016123bb565b9b505050505050505050505050610a47565b876020015160ff168360ff161415610a1757610a0687896040015160ff168360016123bb565b9a5050505050505050505050610a47565b610a2587828486600161248d565b96505050508080610a3590612b1d565b91505061092d565b5091955050505050505b92915050565b6001600160a01b0381166000908152600b602052604081206001810154600390910154610a479190610100900460ff16611ac4565b336000908152600b602052604090205460ff16610ad15760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964207374616b6560981b604482015260640161042a565b336000908152600b602052604090206003015460ff1615610b5a5760405162461bcd60e51b815260206004820152603960248201527f436f6d706f756e646572732063616e2774207769746864726177206265666f7260448201527f6520746865792066696e697368207468656972207374616b6500000000000000606482015260840161042a565b336000818152600b6020526040812091610b749042611488565b905080826004016000828254610b8a9190612a7b565b90915550506001546001600160a01b031663a9059cbb33610baa846120ce565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610bf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c199190612a93565b610c595760405162461bcd60e51b8152602060048201526011602482015270436f756c646e277420776974686472617760781b604482015260640161042a565b60405181815233907f8a43c4352486ec339f487f64af78ca5cbf06cd47833f073d3baf3a193e5031619060200160405180910390a25050565b6000546001600160a01b03163314610cbc5760405162461bcd60e51b815260040161042a90612b3d565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b336000908152600b602052604090205460ff1615610d3e5760405162461bcd60e51b815260206004820152601860248201527f596f7520616c726561647920686176652061207374616b650000000000000000604482015260640161042a565b610d47836112ce565b610d8b5760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b1bd8dadd5c081c195c9a5bd9605a1b604482015260640161042a565b600354841015610dcf5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206d696e696d756d60881b604482015260640161042a565b6001546001600160a01b03166323b872dd3330610deb886120ce565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e639190612a93565b610eaf5760405162461bcd60e51b815260206004820152601860248201527f436f756c646e27742074616b652074686520746f6b656e730000000000000000604482015260640161042a565b6001600160a01b03811615801590610edf57506001600160a01b0381166000908152600b602052604090205460ff165b15610fb7576001600160a01b0381166000908152600b6020526040812060020154610f0c90606490612a67565b6001600160a01b0383166000818152600b602090815260409182902060020154825190815290810184905292935090917f137164f93582d8b617ea3f6901a1d521e2610ec8397fe92459e6cf85a9dc83e8910160405180910390a26001600160a01b0382166000908152600b602052604081206002018054839290610f92908490612a7b565b925050819055508060066000828254610fab9190612a7b565b90915550610fc5915050565b506004546001600160a01b03165b6040805160e08101825260018082524260208084019182528385018981528715156060860190815260ff808b1660808801908152600060a089018181526001600160a01b03808d1660c08c01908152338452600b9098529a82208a51815490151560ff199091161781559751888a015594516002880155925160038701805492519093166101000261ff00199115159190911661ffff199092169190911717905590516004840155905160059283018054919096166001600160a01b03199091161790945580549293919290919061109e908490612a7b565b9250508190555084600660008282546110b79190612a7b565b909155505060ff841660009081526008602052604081208054600192906110df908490612a7b565b90915550508215611108576001600960008282546110fd9190612a7b565b909155506111219050565b6001600a600082825461111b9190612a7b565b90915550505b6040805186815260ff86166020820152841515818301526001600160a01b0384166060820152905133917f400e171aacda0e3d4172b349f5580803cee665adbac7a82751db1de4e8985309919081900360800190a25050505050565b6000546001600160a01b031633146111a75760405162461bcd60e51b815260040161042a90612b3d565b60015460405163a9059cbb60e01b81526001600160a01b038381166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af11580156111fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121e9190612a93565b61122757600080fd5b5050565b6000546001600160a01b031633146112555760405162461bcd60e51b815260040161042a90612b3d565b61125f6000612523565b565b6000546001600160a01b0316331461128b5760405162461bcd60e51b815260040161042a90612b3d565b600c93909355600d91909155600e55600f55565b6000546001600160a01b031633146112c95760405162461bcd60e51b815260040161042a90612b3d565b600355565b60105460009060ff1680156112e657508160ff166001145b806113065750601054610100900460ff16801561130657508160ff166002145b80611327575060105462010000900460ff16801561132757508160ff166003145b80610a4757506010546301000000900460ff168015610a4757505060ff1660061490565b600082815260116020908152604080832086845290915281205460ff1615611429578160ff166001141561139c57506000828152601160209081526040808320868452909152902060010154611481565b8160ff16600214156113cb57506000828152601160209081526040808320868452909152902060020154611481565b8160ff16600314156113fa57506000828152601160209081526040808320868452909152902060030154611481565b8160ff166006141561142957506000828152601160209081526040808320868452909152902060040154611481565b8160ff166001141561143e5750600c54611481565b8160ff16600214156114535750600d54611481565b8160ff16600314156114685750600e54611481565b8160ff166006141561147d5750600f54611481565b5060005b9392505050565b6001600160a01b038083166000908152600b60209081526040808320815160e081018352815460ff90811615158252600183015494820185905260028301549382019390935260038201548084161515606083015261010090049092166080830152600481015460a08301526005015490931660c0840152909190829061150e906120e9565b9050600061151b856120e9565b9050806020015160ff16826020015160ff161415611549578260a001516108e3848360400151856000612270565b6000611557848460006122c7565b9050600061156d85602001518660800151611ac4565b9050600061157a826120e9565b905060015b866080015160ff168160ff16116116ab5760008187602001516115a29190612ab0565b8751909150600c60ff831611156115ce576115be600182612ad5565b90506115cb600c83612afb565b91505b60006115e68360ff168361ffff168c6080015161134b565b9050846020015160ff168360ff16141561163957600061160e86604001518a6040015161239e565b90506116248b604001518260ff168460006123bb565b61162e9089612a7b565b9750505050506116ab565b876020015160ff168360ff161415611677576116638a60400151896040015160ff168360006123bb565b61166d9088612a7b565b96505050506116ab565b6116898a60400151828486600061248d565b6116939088612a7b565b965050505080806116a390612b1d565b91505061157f565b5060a08601516116bb9084612a1b565b9998505050505050505050565b6000546001600160a01b031633146116f25760405162461bcd60e51b815260040161042a90612b3d565b6040516392d6631360e01b8152426004820152600090737d702a2eb335758426d102bd5db25c12da1825c4906392d6631390602401602060405180830381865af4158015611744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117689190612b72565b61ffff1690506000737d702a2eb335758426d102bd5db25c12da1825c463a324ad24426040518263ffffffff1660e01b81526004016117a991815260200190565b602060405180830381865af41580156117c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ea9190612b96565b60ff1690508088101580156117fe57508187145b8061180857508187115b6118715760405162461bcd60e51b815260206004820152603460248201527f596f752063616e206f6e6c792073657420697420666f722074686973206d6f6e6044820152730e8d040dee440c240cceae8eae4ca40dadedce8d60631b606482015260840161042a565b5050600094855260116020908152604080872097875296905294909320805460ff1916600190811782558101929092556002820155600381019190915560040155565b6000546001600160a01b031633146118de5760405162461bcd60e51b815260040161042a90612b3d565b6010805461ffff191694151561ff00191694909417610100931515939093029290921763ffff00001916620100009115159190910263ff000000191617630100000091151591909102179055565b6000546001600160a01b031633146119565760405162461bcd60e51b815260040161042a90612b3d565b6007805460009091556001546001600160a01b031663a9059cbb3361197a846120ce565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156119c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e99190612a93565b611a295760405162461bcd60e51b8152602060048201526011602482015270436f756c646e277420776974686472617760781b604482015260640161042a565b50565b6000546001600160a01b03163314611a565760405162461bcd60e51b815260040161042a90612b3d565b6001600160a01b038116611abb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042a565b611a2981612523565b6040516392d6631360e01b8152600481018390526000908190737d702a2eb335758426d102bd5db25c12da1825c4906392d6631390602401602060405180830381865af4158015611b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3d9190612b72565b6040516328c92b4960e21b815260048101869052909150600090737d702a2eb335758426d102bd5db25c12da1825c49063a324ad2490602401602060405180830381865af4158015611b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb79190612b96565b9050611bc38482612ab0565b9050600c8160ff161115611bec57611bdc600183612ad5565b9150611be9600c82612afb565b90505b6040516301971ca160e61b815260048101869052600090737d702a2eb335758426d102bd5db25c12da1825c4906365c7284090602401602060405180830381865af4158015611c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c639190612b96565b6040516304646cc560e51b815261ffff8516600482015260ff808516602483015282166044820152909150737d702a2eb335758426d102bd5db25c12da1825c490638c8d98a090606401602060405180830381865af4158015611cca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cee9190612bb3565b9695505050505050565b6001600160a01b038082166000908152600b60209081526040808320815160e081018352815460ff90811615158252600183015494820185905260028301549382019390935260038201548084161515606083015261010090049092166080830152600481015460a08301526005015490931660c08401529091908290611d7e906120e9565b90506000611d8e838360016122c7565b90506000611da484602001518560800151611ac4565b90506000611db1826120e9565b905060015b856080015160ff168160ff1611611e7a576000818660200151611dd99190612ab0565b8651909150600c60ff83161115611e0557611df5600182612ad5565b9050611e02600c83612afb565b91505b6000611e1d8360ff168361ffff168b6080015161134b565b9050846020015160ff168360ff161415611e5457611e4587866040015160ff168360016123bb565b9b9a5050505050505050505050565b611e6287828486600161248d565b96505050508080611e7290612b1d565b915050611db6565b50919695505050505050565b6001600160a01b038082166000908152600b60209081526040808320815160e081018352815460ff90811615158252600183015494820185905260028301549382019390935260038201548084161515606083015261010090049092166080830152600481015460a08301526005015490931660c08401529091908290611f0c906120e9565b90506000611f1c838360006122c7565b90506000611f3284602001518560800151611ac4565b90506000611f3f826120e9565b905060015b856080015160ff168160ff161161201f576000818660200151611f679190612ab0565b8651909150600c60ff83161115611f9357611f83600182612ad5565b9050611f90600c83612afb565b91505b6000611fab8360ff168361ffff168b6080015161134b565b9050846020015160ff168360ff161415611feb57611fd78960400151866040015160ff168360006123bb565b611fe19088612a7b565b965050505061201f565b611ffd8960400151828486600061248d565b6120079088612a7b565b9650505050808061201790612b1d565b915050611f44565b5060a085015161202f9084612a1b565b979650505050505050565b600062015180600160ff8416141561206b57426120578286612a7b565b61206290600f612a7b565b11915050610a47565b8260ff166002141561208d57426120828286612a7b565b61206290601e612a7b565b8260ff16600314156120af57426120a48286612a7b565b61206290602d612a7b565b426120ba8286612a7b565b6120c590605a612a7b565b11949350505050565b6000600254600a6120df9190612cb0565b610a479083612a32565b6040805160608101825260008082526020820181905291810182905290808061211185612573565b61ffff1684526121226107b2612668565b84516121319061ffff16612668565b61213b9190612a1b565b915061214b826301e28500612a32565b6121559084612a7b565b9250816107b2856000015161216a9190612cbc565b61ffff166121789190612a1b565b612186906301e13380612a32565b6121909084612a7b565b92506000600191505b600c8260ff1611612201576121b28286600001516126ad565b6121c29060ff1662015180612a32565b9050856121cf8583612a7b565b11156121e35760ff82166020860152612201565b6121ed8185612a7b565b9350816121f981612b1d565b925050612199565b600191505b612218856020015186600001516126ad565b60ff168260ff161161226757856122328562015180612a7b565b11156122465760ff82166040860152612267565b6122536201518085612a7b565b93508161225f81612b1d565b925050612206565b50505050919050565b600080612291846020015160ff16856000015161ffff16886080015161134b565b905060008460400151866122a59190612cdf565b90506122ba87604001518260ff1684876123bb565b925050505b949350505050565b6020820151825160405163591c568760e11b815260ff909216600483015261ffff1660248201526000908190737d702a2eb335758426d102bd5db25c12da1825c49063b238ad0e90604401602060405180830381865af415801561232f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123539190612b96565b90506000612375856020015160ff16866000015161ffff16886080015161134b565b905060008560400151836123899190612cdf565b905061202f87604001518260ff1684886123bb565b60008160ff168360ff1610156123b5575081610a47565b50919050565b6000811561246257701d6329f1c35ca4bfabb9f56100000000005b600a8511156124205780600a6123ee86612710612a7b565b6123f89190612d02565b6124029088612a32565b61240c9190612a67565b9550612419600a86612a1b565b94506123d6565b61242c85612710612cb0565b8561243986612710612a7b565b6124439190612cb0565b61244d9088612a32565b6124579190612a67565b9550859150506122bf565b612710836124708688612a32565b61247a9190612a32565b6124849190612a67565b95945050505050565b60405163591c568760e11b815260ff8316600482015261ffff841660248201526000908190737d702a2eb335758426d102bd5db25c12da1825c49063b238ad0e90604401602060405180830381865af41580156124ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125129190612b96565b60ff16905061202f878288866123bb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008080806125866301e1338086612a67565b612592906107b2612a7b565b915061259f6107b2612668565b6125ac8361ffff16612668565b6125b69190612a1b565b90506125c6816301e28500612a32565b6125d09084612a7b565b9250806125df6107b284612cbc565b61ffff166125ed9190612a1b565b6125fb906301e13380612a32565b6126059084612a7b565b92505b848311156126605761262361261e600184612cbc565b612773565b1561263d576126366301e2850084612a1b565b925061264e565b61264b6301e1338084612a1b565b92505b612659600183612cbc565b9150612608565b509392505050565b6000612675600183612a1b565b915061268361019083612a67565b61268e606484612a67565b612699600485612a67565b6126a39190612a1b565b610a479190612a7b565b60008260ff16600114806126c457508260ff166003145b806126d257508260ff166005145b806126e057508260ff166007145b806126ee57508260ff166008145b806126fc57508260ff16600a145b8061270a57508260ff16600c145b156127175750601f610a47565b8260ff166004148061272c57508260ff166006145b8061273a57508260ff166009145b8061274857508260ff16600b145b156127555750601e610a47565b61275e82612773565b1561276b5750601d610a47565b50601c610a47565b6000612780600483612d11565b61ffff161561279157506000919050565b61279c606483612d11565b61ffff16156127ad57506001919050565b6127b961019083612d11565b61ffff16156127ca57506000919050565b506001919050565b6001600160a01b0381168114611a2957600080fd5b600080604083850312156127fa57600080fd5b8235612805816127d2565b946020939093013593505050565b60006020828403121561282557600080fd5b8135611481816127d2565b60ff81168114611a2957600080fd5b60006020828403121561285157600080fd5b813561148181612830565b8015158114611a2957600080fd5b6000806000806080858703121561288057600080fd5b84359350602085013561289281612830565b925060408501356128a28161285c565b915060608501356128b2816127d2565b939692955090935050565b600080604083850312156128d057600080fd5b8235915060208301356128e2816127d2565b809150509250929050565b6000806000806080858703121561290357600080fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561293157600080fd5b5035919050565b60008060006060848603121561294d57600080fd5b8335925060208401359150604084013561296681612830565b809150509250925092565b60008060008060008060c0878903121561298a57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b600080600080608085870312156129ca57600080fd5b84356129d58161285c565b935060208501356129e58161285c565b925060408501356129f58161285c565b915060608501356128b28161285c565b634e487b7160e01b600052601160045260246000fd5b600082821015612a2d57612a2d612a05565b500390565b6000816000190483118215151615612a4c57612a4c612a05565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612a7657612a76612a51565b500490565b60008219821115612a8e57612a8e612a05565b500190565b600060208284031215612aa557600080fd5b81516114818161285c565b600060ff821660ff84168060ff03821115612acd57612acd612a05565b019392505050565b600061ffff808316818516808303821115612af257612af2612a05565b01949350505050565b600060ff831680612b0e57612b0e612a51565b8060ff84160691505092915050565b600060ff821660ff811415612b3457612b34612a05565b60010192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215612b8457600080fd5b815161ffff8116811461148157600080fd5b600060208284031215612ba857600080fd5b815161148181612830565b600060208284031215612bc557600080fd5b5051919050565b600181815b80851115612c07578160001904821115612bed57612bed612a05565b80851615612bfa57918102915b93841c9390800290612bd1565b509250929050565b600082612c1e57506001610a47565b81612c2b57506000610a47565b8160018114612c415760028114612c4b57612c67565b6001915050610a47565b60ff841115612c5c57612c5c612a05565b50506001821b610a47565b5060208310610133831016604e8410600b8410161715612c8a575081810a610a47565b612c948383612bcc565b8060001904821115612ca857612ca8612a05565b029392505050565b60006114818383612c0f565b600061ffff83811690831681811015612cd757612cd7612a05565b039392505050565b600060ff821660ff841680821015612cf957612cf9612a05565b90039392505050565b600061148160ff841683612c0f565b600061ffff80841680612d2657612d26612a51565b9216919091069291505056fea2646970667358221220fed1db0635b2f04cf43dad1bcaaaeb85f56dfa5fa5ea20b36f9c18b636fc81e664736f6c634300080a0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063817b1cd2116100de578063b219ed0f11610097578063c81bf2b111610071578063c81bf2b1146103a8578063d830d27c146103b1578063f2b519bc146103c4578063f2fde38b146103cc57600080fd5b8063b219ed0f14610379578063b85cf43e1461038c578063bf9befb11461039f57600080fd5b8063817b1cd2146102f95780638da5cb5b146103025780639ebdaa6d1461031d578063a284150714610330578063a56a30ec14610343578063b1a6043d1461036657600080fd5b806324db2c861161014b578063644315b711610125578063644315b7146102b8578063705142b8146102cb57806370fe9538146102de578063715018a6146102f157600080fd5b806324db2c86146102955780633765cf02146102a85780633ccfd60b146102b057600080fd5b806308a37f31146101935780630ad3c7651461019d5780630ff3f6c6146101b95780631600ec4b146101c257806316934fc4146101d55780631d71b85014610275575b600080fd5b61019b6103df565b005b6101a660095481565b6040519081526020015b60405180910390f35b6101a6600a5481565b6101a66101d03660046127e7565b610822565b6102326101e3366004612813565b600b6020526000908152604090208054600182015460028301546003840154600485015460059095015460ff94851695939492938284169361010090930490921691906001600160a01b031687565b604080519715158852602088019690965294860193909352901515606085015260ff16608084015260a08301526001600160a01b031660c082015260e0016101b0565b6101a661028336600461283f565b60086020526000908152604090205481565b6101a66102a3366004612813565b610a4d565b6003546101a6565b61019b610a82565b61019b6102c6366004612813565b610c92565b61019b6102d936600461286a565b610cde565b61019b6102ec3660046128bd565b61117d565b61019b61122b565b6101a660065481565b6000546040516001600160a01b0390911681526020016101b0565b61019b61032b3660046128ed565b611261565b61019b61033e36600461291f565b61129f565b61035661035136600461283f565b6112ce565b60405190151581526020016101b0565b6101a6610374366004612938565b61134b565b6101a66103873660046127e7565b611488565b61019b61039a366004612971565b6116c8565b6101a660055481565b6101a660075481565b61019b6103bf3660046129b4565b6118b4565b61019b61192c565b61019b6103da366004612813565b611a2c565b336000908152600b602052604090205460ff166104335760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964207374616b6560981b60448201526064015b60405180910390fd5b336000908152600b60209081526040808320815160e081018352815460ff908116151582526001830154948201859052600283015493820193909352600382015480841615156060830152610100900490921660808301819052600482015460a08401526005909101546001600160a01b031660c08301529092916104b791611ac4565b9050804211806104c957508160600151155b61050d5760405162461bcd60e51b815260206004820152601560248201527410d85b89dd08189948199a5b9a5cda1959081e595d605a1b604482015260640161042a565b60008060008460600151156105575761052533611cf8565b92508460400151836105379190612a1b565b92506064610546846005612a32565b6105509190612a67565b91506105d6565b8342111561056f5761056833611e86565b92506105bc565b6105793342611488565b9250600061058f8660200151876080015161203a565b61059a57600561059d565b600a5b905060646105ae60ff831686612a32565b6105b89190612a67565b9150505b60646105c9846002612a32565b6105d39190612a67565b91505b60006105e28284612a7b565b90506000818760400151866105f79190612a7b565b6106019190612a1b565b905081600760008282546106159190612a7b565b9250508190555060016005600082825461062f9190612a1b565b909155505060408701516006805460009061064b908490612a1b565b9091555050608087015160ff166000908152600860205260408120805460019290610677908490612a1b565b90915550506060870151156106a4576001600960008282546106999190612a1b565b909155506106bd9050565b6001600a60008282546106b79190612a1b565b90915550505b336000818152600b60205260408120805460ff1916815560018082018390556002820183905560038201805461ffff19169055600482019290925560050180546001600160a01b0319169055546001600160a01b03169063a9059cbb90610723846120ce565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561076e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107929190612a93565b6107de5760405162461bcd60e51b815260206004820152601c60248201527f436f756c646e2774207472616e736665722074686520746f6b656e7300000000604482015260640161042a565b604080518281526020810184905233917fa287afc36219422479b90fe9ac2672e28735d1bdd05d78553521159f9f525f6d910160405180910390a250505050505050565b6001600160a01b038083166000908152600b60209081526040808320815160e081018352815460ff90811615158252600183015494820185905260028301549382019390935260038201548084161515606083015261010090049092166080830152600481015460a08301526005015490931660c084015290919082906108a8906120e9565b905060006108b5856120e9565b9050806020015160ff16826020015160ff1614156108f7578260a001516108e3848360400151856001612270565b6108ed9190612a1b565b9350505050610a47565b6000610905848460016122c7565b9050600061091b85602001518660800151611ac4565b90506000610928826120e9565b905060015b866080015160ff168160ff1611610a3d5760008187602001516109509190612ab0565b8751909150600c60ff8316111561097c5761096c600182612ad5565b9050610979600c83612afb565b91505b60006109948360ff168361ffff168c6080015161134b565b9050846020015160ff168360ff1614156109e05760006109bc86604001518a6040015161239e565b90506109ce888260ff168460016123bb565b9b505050505050505050505050610a47565b876020015160ff168360ff161415610a1757610a0687896040015160ff168360016123bb565b9a5050505050505050505050610a47565b610a2587828486600161248d565b96505050508080610a3590612b1d565b91505061092d565b5091955050505050505b92915050565b6001600160a01b0381166000908152600b602052604081206001810154600390910154610a479190610100900460ff16611ac4565b336000908152600b602052604090205460ff16610ad15760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964207374616b6560981b604482015260640161042a565b336000908152600b602052604090206003015460ff1615610b5a5760405162461bcd60e51b815260206004820152603960248201527f436f6d706f756e646572732063616e2774207769746864726177206265666f7260448201527f6520746865792066696e697368207468656972207374616b6500000000000000606482015260840161042a565b336000818152600b6020526040812091610b749042611488565b905080826004016000828254610b8a9190612a7b565b90915550506001546001600160a01b031663a9059cbb33610baa846120ce565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610bf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c199190612a93565b610c595760405162461bcd60e51b8152602060048201526011602482015270436f756c646e277420776974686472617760781b604482015260640161042a565b60405181815233907f8a43c4352486ec339f487f64af78ca5cbf06cd47833f073d3baf3a193e5031619060200160405180910390a25050565b6000546001600160a01b03163314610cbc5760405162461bcd60e51b815260040161042a90612b3d565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b336000908152600b602052604090205460ff1615610d3e5760405162461bcd60e51b815260206004820152601860248201527f596f7520616c726561647920686176652061207374616b650000000000000000604482015260640161042a565b610d47836112ce565b610d8b5760405162461bcd60e51b8152602060048201526015602482015274125b9d985b1a59081b1bd8dadd5c081c195c9a5bd9605a1b604482015260640161042a565b600354841015610dcf5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206d696e696d756d60881b604482015260640161042a565b6001546001600160a01b03166323b872dd3330610deb886120ce565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e639190612a93565b610eaf5760405162461bcd60e51b815260206004820152601860248201527f436f756c646e27742074616b652074686520746f6b656e730000000000000000604482015260640161042a565b6001600160a01b03811615801590610edf57506001600160a01b0381166000908152600b602052604090205460ff165b15610fb7576001600160a01b0381166000908152600b6020526040812060020154610f0c90606490612a67565b6001600160a01b0383166000818152600b602090815260409182902060020154825190815290810184905292935090917f137164f93582d8b617ea3f6901a1d521e2610ec8397fe92459e6cf85a9dc83e8910160405180910390a26001600160a01b0382166000908152600b602052604081206002018054839290610f92908490612a7b565b925050819055508060066000828254610fab9190612a7b565b90915550610fc5915050565b506004546001600160a01b03165b6040805160e08101825260018082524260208084019182528385018981528715156060860190815260ff808b1660808801908152600060a089018181526001600160a01b03808d1660c08c01908152338452600b9098529a82208a51815490151560ff199091161781559751888a015594516002880155925160038701805492519093166101000261ff00199115159190911661ffff199092169190911717905590516004840155905160059283018054919096166001600160a01b03199091161790945580549293919290919061109e908490612a7b565b9250508190555084600660008282546110b79190612a7b565b909155505060ff841660009081526008602052604081208054600192906110df908490612a7b565b90915550508215611108576001600960008282546110fd9190612a7b565b909155506111219050565b6001600a600082825461111b9190612a7b565b90915550505b6040805186815260ff86166020820152841515818301526001600160a01b0384166060820152905133917f400e171aacda0e3d4172b349f5580803cee665adbac7a82751db1de4e8985309919081900360800190a25050505050565b6000546001600160a01b031633146111a75760405162461bcd60e51b815260040161042a90612b3d565b60015460405163a9059cbb60e01b81526001600160a01b038381166004830152602482018590529091169063a9059cbb906044016020604051808303816000875af11580156111fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121e9190612a93565b61122757600080fd5b5050565b6000546001600160a01b031633146112555760405162461bcd60e51b815260040161042a90612b3d565b61125f6000612523565b565b6000546001600160a01b0316331461128b5760405162461bcd60e51b815260040161042a90612b3d565b600c93909355600d91909155600e55600f55565b6000546001600160a01b031633146112c95760405162461bcd60e51b815260040161042a90612b3d565b600355565b60105460009060ff1680156112e657508160ff166001145b806113065750601054610100900460ff16801561130657508160ff166002145b80611327575060105462010000900460ff16801561132757508160ff166003145b80610a4757506010546301000000900460ff168015610a4757505060ff1660061490565b600082815260116020908152604080832086845290915281205460ff1615611429578160ff166001141561139c57506000828152601160209081526040808320868452909152902060010154611481565b8160ff16600214156113cb57506000828152601160209081526040808320868452909152902060020154611481565b8160ff16600314156113fa57506000828152601160209081526040808320868452909152902060030154611481565b8160ff166006141561142957506000828152601160209081526040808320868452909152902060040154611481565b8160ff166001141561143e5750600c54611481565b8160ff16600214156114535750600d54611481565b8160ff16600314156114685750600e54611481565b8160ff166006141561147d5750600f54611481565b5060005b9392505050565b6001600160a01b038083166000908152600b60209081526040808320815160e081018352815460ff90811615158252600183015494820185905260028301549382019390935260038201548084161515606083015261010090049092166080830152600481015460a08301526005015490931660c0840152909190829061150e906120e9565b9050600061151b856120e9565b9050806020015160ff16826020015160ff161415611549578260a001516108e3848360400151856000612270565b6000611557848460006122c7565b9050600061156d85602001518660800151611ac4565b9050600061157a826120e9565b905060015b866080015160ff168160ff16116116ab5760008187602001516115a29190612ab0565b8751909150600c60ff831611156115ce576115be600182612ad5565b90506115cb600c83612afb565b91505b60006115e68360ff168361ffff168c6080015161134b565b9050846020015160ff168360ff16141561163957600061160e86604001518a6040015161239e565b90506116248b604001518260ff168460006123bb565b61162e9089612a7b565b9750505050506116ab565b876020015160ff168360ff161415611677576116638a60400151896040015160ff168360006123bb565b61166d9088612a7b565b96505050506116ab565b6116898a60400151828486600061248d565b6116939088612a7b565b965050505080806116a390612b1d565b91505061157f565b5060a08601516116bb9084612a1b565b9998505050505050505050565b6000546001600160a01b031633146116f25760405162461bcd60e51b815260040161042a90612b3d565b6040516392d6631360e01b8152426004820152600090737d702a2eb335758426d102bd5db25c12da1825c4906392d6631390602401602060405180830381865af4158015611744573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117689190612b72565b61ffff1690506000737d702a2eb335758426d102bd5db25c12da1825c463a324ad24426040518263ffffffff1660e01b81526004016117a991815260200190565b602060405180830381865af41580156117c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ea9190612b96565b60ff1690508088101580156117fe57508187145b8061180857508187115b6118715760405162461bcd60e51b815260206004820152603460248201527f596f752063616e206f6e6c792073657420697420666f722074686973206d6f6e6044820152730e8d040dee440c240cceae8eae4ca40dadedce8d60631b606482015260840161042a565b5050600094855260116020908152604080872097875296905294909320805460ff1916600190811782558101929092556002820155600381019190915560040155565b6000546001600160a01b031633146118de5760405162461bcd60e51b815260040161042a90612b3d565b6010805461ffff191694151561ff00191694909417610100931515939093029290921763ffff00001916620100009115159190910263ff000000191617630100000091151591909102179055565b6000546001600160a01b031633146119565760405162461bcd60e51b815260040161042a90612b3d565b6007805460009091556001546001600160a01b031663a9059cbb3361197a846120ce565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156119c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e99190612a93565b611a295760405162461bcd60e51b8152602060048201526011602482015270436f756c646e277420776974686472617760781b604482015260640161042a565b50565b6000546001600160a01b03163314611a565760405162461bcd60e51b815260040161042a90612b3d565b6001600160a01b038116611abb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161042a565b611a2981612523565b6040516392d6631360e01b8152600481018390526000908190737d702a2eb335758426d102bd5db25c12da1825c4906392d6631390602401602060405180830381865af4158015611b19573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b3d9190612b72565b6040516328c92b4960e21b815260048101869052909150600090737d702a2eb335758426d102bd5db25c12da1825c49063a324ad2490602401602060405180830381865af4158015611b93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb79190612b96565b9050611bc38482612ab0565b9050600c8160ff161115611bec57611bdc600183612ad5565b9150611be9600c82612afb565b90505b6040516301971ca160e61b815260048101869052600090737d702a2eb335758426d102bd5db25c12da1825c4906365c7284090602401602060405180830381865af4158015611c3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c639190612b96565b6040516304646cc560e51b815261ffff8516600482015260ff808516602483015282166044820152909150737d702a2eb335758426d102bd5db25c12da1825c490638c8d98a090606401602060405180830381865af4158015611cca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cee9190612bb3565b9695505050505050565b6001600160a01b038082166000908152600b60209081526040808320815160e081018352815460ff90811615158252600183015494820185905260028301549382019390935260038201548084161515606083015261010090049092166080830152600481015460a08301526005015490931660c08401529091908290611d7e906120e9565b90506000611d8e838360016122c7565b90506000611da484602001518560800151611ac4565b90506000611db1826120e9565b905060015b856080015160ff168160ff1611611e7a576000818660200151611dd99190612ab0565b8651909150600c60ff83161115611e0557611df5600182612ad5565b9050611e02600c83612afb565b91505b6000611e1d8360ff168361ffff168b6080015161134b565b9050846020015160ff168360ff161415611e5457611e4587866040015160ff168360016123bb565b9b9a5050505050505050505050565b611e6287828486600161248d565b96505050508080611e7290612b1d565b915050611db6565b50919695505050505050565b6001600160a01b038082166000908152600b60209081526040808320815160e081018352815460ff90811615158252600183015494820185905260028301549382019390935260038201548084161515606083015261010090049092166080830152600481015460a08301526005015490931660c08401529091908290611f0c906120e9565b90506000611f1c838360006122c7565b90506000611f3284602001518560800151611ac4565b90506000611f3f826120e9565b905060015b856080015160ff168160ff161161201f576000818660200151611f679190612ab0565b8651909150600c60ff83161115611f9357611f83600182612ad5565b9050611f90600c83612afb565b91505b6000611fab8360ff168361ffff168b6080015161134b565b9050846020015160ff168360ff161415611feb57611fd78960400151866040015160ff168360006123bb565b611fe19088612a7b565b965050505061201f565b611ffd8960400151828486600061248d565b6120079088612a7b565b9650505050808061201790612b1d565b915050611f44565b5060a085015161202f9084612a1b565b979650505050505050565b600062015180600160ff8416141561206b57426120578286612a7b565b61206290600f612a7b565b11915050610a47565b8260ff166002141561208d57426120828286612a7b565b61206290601e612a7b565b8260ff16600314156120af57426120a48286612a7b565b61206290602d612a7b565b426120ba8286612a7b565b6120c590605a612a7b565b11949350505050565b6000600254600a6120df9190612cb0565b610a479083612a32565b6040805160608101825260008082526020820181905291810182905290808061211185612573565b61ffff1684526121226107b2612668565b84516121319061ffff16612668565b61213b9190612a1b565b915061214b826301e28500612a32565b6121559084612a7b565b9250816107b2856000015161216a9190612cbc565b61ffff166121789190612a1b565b612186906301e13380612a32565b6121909084612a7b565b92506000600191505b600c8260ff1611612201576121b28286600001516126ad565b6121c29060ff1662015180612a32565b9050856121cf8583612a7b565b11156121e35760ff82166020860152612201565b6121ed8185612a7b565b9350816121f981612b1d565b925050612199565b600191505b612218856020015186600001516126ad565b60ff168260ff161161226757856122328562015180612a7b565b11156122465760ff82166040860152612267565b6122536201518085612a7b565b93508161225f81612b1d565b925050612206565b50505050919050565b600080612291846020015160ff16856000015161ffff16886080015161134b565b905060008460400151866122a59190612cdf565b90506122ba87604001518260ff1684876123bb565b925050505b949350505050565b6020820151825160405163591c568760e11b815260ff909216600483015261ffff1660248201526000908190737d702a2eb335758426d102bd5db25c12da1825c49063b238ad0e90604401602060405180830381865af415801561232f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123539190612b96565b90506000612375856020015160ff16866000015161ffff16886080015161134b565b905060008560400151836123899190612cdf565b905061202f87604001518260ff1684886123bb565b60008160ff168360ff1610156123b5575081610a47565b50919050565b6000811561246257701d6329f1c35ca4bfabb9f56100000000005b600a8511156124205780600a6123ee86612710612a7b565b6123f89190612d02565b6124029088612a32565b61240c9190612a67565b9550612419600a86612a1b565b94506123d6565b61242c85612710612cb0565b8561243986612710612a7b565b6124439190612cb0565b61244d9088612a32565b6124579190612a67565b9550859150506122bf565b612710836124708688612a32565b61247a9190612a32565b6124849190612a67565b95945050505050565b60405163591c568760e11b815260ff8316600482015261ffff841660248201526000908190737d702a2eb335758426d102bd5db25c12da1825c49063b238ad0e90604401602060405180830381865af41580156124ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125129190612b96565b60ff16905061202f878288866123bb565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008080806125866301e1338086612a67565b612592906107b2612a7b565b915061259f6107b2612668565b6125ac8361ffff16612668565b6125b69190612a1b565b90506125c6816301e28500612a32565b6125d09084612a7b565b9250806125df6107b284612cbc565b61ffff166125ed9190612a1b565b6125fb906301e13380612a32565b6126059084612a7b565b92505b848311156126605761262361261e600184612cbc565b612773565b1561263d576126366301e2850084612a1b565b925061264e565b61264b6301e1338084612a1b565b92505b612659600183612cbc565b9150612608565b509392505050565b6000612675600183612a1b565b915061268361019083612a67565b61268e606484612a67565b612699600485612a67565b6126a39190612a1b565b610a479190612a7b565b60008260ff16600114806126c457508260ff166003145b806126d257508260ff166005145b806126e057508260ff166007145b806126ee57508260ff166008145b806126fc57508260ff16600a145b8061270a57508260ff16600c145b156127175750601f610a47565b8260ff166004148061272c57508260ff166006145b8061273a57508260ff166009145b8061274857508260ff16600b145b156127555750601e610a47565b61275e82612773565b1561276b5750601d610a47565b50601c610a47565b6000612780600483612d11565b61ffff161561279157506000919050565b61279c606483612d11565b61ffff16156127ad57506001919050565b6127b961019083612d11565b61ffff16156127ca57506000919050565b506001919050565b6001600160a01b0381168114611a2957600080fd5b600080604083850312156127fa57600080fd5b8235612805816127d2565b946020939093013593505050565b60006020828403121561282557600080fd5b8135611481816127d2565b60ff81168114611a2957600080fd5b60006020828403121561285157600080fd5b813561148181612830565b8015158114611a2957600080fd5b6000806000806080858703121561288057600080fd5b84359350602085013561289281612830565b925060408501356128a28161285c565b915060608501356128b2816127d2565b939692955090935050565b600080604083850312156128d057600080fd5b8235915060208301356128e2816127d2565b809150509250929050565b6000806000806080858703121561290357600080fd5b5050823594602084013594506040840135936060013592509050565b60006020828403121561293157600080fd5b5035919050565b60008060006060848603121561294d57600080fd5b8335925060208401359150604084013561296681612830565b809150509250925092565b60008060008060008060c0878903121561298a57600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b600080600080608085870312156129ca57600080fd5b84356129d58161285c565b935060208501356129e58161285c565b925060408501356129f58161285c565b915060608501356128b28161285c565b634e487b7160e01b600052601160045260246000fd5b600082821015612a2d57612a2d612a05565b500390565b6000816000190483118215151615612a4c57612a4c612a05565b500290565b634e487b7160e01b600052601260045260246000fd5b600082612a7657612a76612a51565b500490565b60008219821115612a8e57612a8e612a05565b500190565b600060208284031215612aa557600080fd5b81516114818161285c565b600060ff821660ff84168060ff03821115612acd57612acd612a05565b019392505050565b600061ffff808316818516808303821115612af257612af2612a05565b01949350505050565b600060ff831680612b0e57612b0e612a51565b8060ff84160691505092915050565b600060ff821660ff811415612b3457612b34612a05565b60010192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215612b8457600080fd5b815161ffff8116811461148157600080fd5b600060208284031215612ba857600080fd5b815161148181612830565b600060208284031215612bc557600080fd5b5051919050565b600181815b80851115612c07578160001904821115612bed57612bed612a05565b80851615612bfa57918102915b93841c9390800290612bd1565b509250929050565b600082612c1e57506001610a47565b81612c2b57506000610a47565b8160018114612c415760028114612c4b57612c67565b6001915050610a47565b60ff841115612c5c57612c5c612a05565b50506001821b610a47565b5060208310610133831016604e8410600b8410161715612c8a575081810a610a47565b612c948383612bcc565b8060001904821115612ca857612ca8612a05565b029392505050565b60006114818383612c0f565b600061ffff83811690831681811015612cd757612cd7612a05565b039392505050565b600060ff821660ff841680821015612cf957612cf9612a05565b90039392505050565b600061148160ff841683612c0f565b600061ffff80841680612d2657612d26612a51565b9216919091069291505056fea2646970667358221220fed1db0635b2f04cf43dad1bcaaaeb85f56dfa5fa5ea20b36f9c18b636fc81e664736f6c634300080a0033

Deployed Bytecode Sourcemap

4694:19416:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8733:2023;;;:::i;:::-;;5123:35;;;;;;;;;160:25:4;;;148:2;133:18;5123:35:2;;;;;;;;5164:38;;;;;;18299:1940;;;;;;:::i;:::-;;:::i;5422:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5422:39:2;;;;;;;1228:14:4;;1221:22;1203:41;;1275:2;1260:18;;1253:34;;;;1303:18;;;1296:34;;;;1373:14;;1366:22;1361:2;1346:18;;1339:50;1438:4;1426:17;1420:3;1405:19;;1398:46;1475:3;1460:19;;1453:35;-1:-1:-1;;;;;1525:32:4;1519:3;1504:19;;1497:61;1190:3;1175:19;5422:39:2;904:660:4;5071:46:2;;;;;;:::i;:::-;;;;;;;;;;;;;;20429:187;;;;;;:::i;:::-;;:::i;22204:105::-;22284:18;;22204:105;;8181:542;;;:::i;21968:85::-;;;;;;:::i;:::-;;:::i;6447:1724::-;;;;;;:::i;:::-;;:::i;21830:128::-;;;;;;:::i;:::-;;:::i;1605:101:3:-;;;:::i;4994:30:2:-;;;;;;973:85:3;1019:7;1045:6;973:85;;-1:-1:-1;;;;;1045:6:3;;;3383:51:4;;3371:2;3356:18;973:85:3;3237:203:4;22956:228:2;;;;;;:::i;:::-;;:::i;22063:135::-;;;;;;:::i;:::-;;:::i;21067:206::-;;;;;;:::i;:::-;;:::i;:::-;;;4185:14:4;;4178:22;4160:41;;4148:2;4133:18;21067:206:2;4020:187:4;23194:914:2;;;;;;:::i;:::-;;:::i;14757:2079::-;;;;;;:::i;:::-;;:::i;22319:627::-;;;;;;:::i;:::-;;:::i;4958:30::-;;;;;;5030:35;;;;;;21283:306;;;;;;:::i;:::-;;:::i;21599:225::-;;;:::i;1855:198:3:-;;;;;;:::i;:::-;;:::i;8733:2023:2:-;8788:10;8781:18;;;;:6;:18;;;;;:25;;;8773:51;;;;-1:-1:-1;;;8773:51:2;;5978:2:4;8773:51:2;;;5960:21:4;6017:2;5997:18;;;5990:30;-1:-1:-1;;;6036:18:4;;;6029:43;6089:18;;8773:51:2;;;;;;;;;8871:10;8843:18;8864;;;:6;:18;;;;;;;;8843:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8843:39:2;;;;;;;:18;8922:62;;:25;:62::i;:::-;8901:83;;9020:10;9002:15;:28;:47;;;;9035:5;:14;;;9034:15;9002:47;8994:81;;;;-1:-1:-1;;;8994:81:2;;6320:2:4;8994:81:2;;;6302:21:4;6359:2;6339:18;;;6332:30;-1:-1:-1;;;6378:18:4;;;6371:51;6439:18;;8994:81:2;6118:345:4;8994:81:2;9094:20;9124:17;9151:20;9194:5;:14;;;9190:876;;;9239:45;9273:10;9239:33;:45::i;:::-;9224:60;;9349:5;:19;;;9333:35;;;;;:::i;:::-;;-1:-1:-1;9413:3:2;9394:16;9333:35;9409:1;9394:16;:::i;:::-;:22;;;;:::i;:::-;9382:34;;9190:876;;;9494:10;9476:15;:28;9472:519;;;9539:48;9576:10;9539:36;:48::i;:::-;9524:63;;9472:519;;;9655:67;9694:10;9706:15;9655:38;:67::i;:::-;9640:82;;9841:13;9857:49;9870:5;:15;;;9887:5;:18;;;9857:12;:49::i;:::-;:58;;9914:1;9857:58;;;9909:2;9857:58;9841:74;-1:-1:-1;9973:3:2;9948:22;;;;:12;:22;:::i;:::-;:28;;;;:::i;:::-;9933:43;;9622:369;9472:519;10035:3;10016:16;:12;10031:1;10016:16;:::i;:::-;:22;;;;:::i;:::-;10004:34;;9190:876;10084:21;10108:24;10120:12;10108:9;:24;:::i;:::-;10084:48;;10142:23;10205:13;10183:5;:19;;;10168:12;:34;;;;:::i;:::-;:50;;;;:::i;:::-;10142:76;;10248:13;10228:16;;:33;;;;;;;:::i;:::-;;;;;;;;10287:1;10272:11;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;;10313:19:2;;;;10298:11;:34;;:11;;:34;;10313:19;;10298:34;:::i;:::-;;;;-1:-1:-1;;10356:18:2;;;;10342:33;;;;;;:13;:33;;;;;:38;;10379:1;;10342:33;:38;;10379:1;;10342:38;:::i;:::-;;;;-1:-1:-1;;10394:14:2;;;;10390:121;;;10444:1;10424:16;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;10390:121:2;;-1:-1:-1;10390:121:2;;10499:1;10476:19;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;10390:121:2;10534:10;10527:18;;;;:6;:18;;;;;10520:25;;-1:-1:-1;;10520:25:2;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;10520:25:2;;;;;;;;;;;;;;-1:-1:-1;;;;;;10520:25:2;;;10564:5;-1:-1:-1;;;;;10564:5:2;;:14;;10591:43;10618:15;10591:26;:43::i;:::-;10564:71;;-1:-1:-1;;;;;;10564:71:2;;;;;;;-1:-1:-1;;;;;7485:32:4;;;10564:71:2;;;7467:51:4;7534:18;;;7527:34;7440:18;;10564:71:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10556:112;;;;-1:-1:-1;;;10556:112:2;;8024:2:4;10556:112:2;;;8006:21:4;8063:2;8043:18;;;8036:30;8102;8082:18;;;8075:58;8150:18;;10556:112:2;7822:352:4;10556:112:2;10692:57;;;8353:25:4;;;8409:2;8394:18;;8387:34;;;10706:10:2;;10692:57;;8326:18:4;10692:57:2;;;;;;;8763:1993;;;;;;;8733:2023::o;18299:1940::-;-1:-1:-1;;;;;18433:16:2;;;18393:7;18433:16;;;:6;:16;;;;;;;;18412:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18393:7;;18412:37;18393:7;;18496:36;;:19;:36::i;:::-;18468:64;;18542:23;18568:25;18588:4;18568:19;:25::i;:::-;18542:51;;18683:5;:11;;;18666:28;;:7;:13;;;:28;;;18662:150;;;18786:5;:15;;;18717:66;18751:5;18758;:9;;;18769:7;18778:4;18717:33;:66::i;:::-;:84;;;;:::i;:::-;18710:91;;;;;;;18662:150;18888:13;18904:52;18935:5;18942:7;18951:4;18904:30;:52::i;:::-;18888:68;;18975:23;19001:62;19027:5;:15;;;19044:5;:18;;;19001:25;:62::i;:::-;18975:88;;19073:26;19102:36;19122:15;19102:19;:36::i;:::-;19073:65;-1:-1:-1;19169:1:2;19157:1045;19174:5;:18;;;19171:21;;:1;:21;;;19157:1045;;19212:18;19249:1;19233:7;:13;;;:17;;;;:::i;:::-;19285:12;;19212:38;;-1:-1:-1;19330:2:2;19315:17;;;;19311:122;;;19352:16;19367:1;19352:16;;:::i;:::-;;-1:-1:-1;19401:17:2;19416:2;19401:12;:17;:::i;:::-;19386:32;;19311:122;19447:11;19461:53;19468:12;19461:53;;19482:11;19461:53;;19495:5;:18;;;19461:6;:53::i;:::-;19447:67;;19593:8;:14;;;19577:30;;:12;:30;;;19573:463;;;19627:13;19643:32;19651:8;:12;;;19665:5;:9;;;19643:7;:32::i;:::-;19627:48;;19755:43;19772:5;19779:7;19755:43;;19788:3;19793:4;19755:16;:43::i;:::-;19748:50;;;;;;;;;;;;;;;19573:463;19851:5;:11;;;19835:27;;:12;:27;;;19831:205;;;19976:45;19993:5;20000;:9;;;19976:45;;20011:3;20016:4;19976:16;:45::i;:::-;19969:52;;;;;;;;;;;;;;19831:205;20123:68;20147:5;20154:3;20159:11;20172:12;20186:4;20123:23;:68::i;:::-;20115:76;;19198:1004;;;19193:3;;;;;:::i;:::-;;;;19157:1045;;;-1:-1:-1;20227:5:2;;-1:-1:-1;;;;;;18299:1940:2;;;;;:::o;20429:187::-;-1:-1:-1;;;;;20553:15:2;;20501:7;20553:15;;;:6;:15;;;;;:25;;;;20580:28;;;;;20527:82;;20553:25;20580:28;;;;;20527:25;:82::i;8181:542::-;8233:10;8226:18;;;;:6;:18;;;;;:25;;;8218:51;;;;-1:-1:-1;;;8218:51:2;;5978:2:4;8218:51:2;;;5960:21:4;6017:2;5997:18;;;5990:30;-1:-1:-1;;;6036:18:4;;;6029:43;6089:18;;8218:51:2;5776:337:4;8218:51:2;8295:10;8288:18;;;;:6;:18;;;;;:27;;;;;8287:28;8279:98;;;;-1:-1:-1;;;8279:98:2;;9414:2:4;8279:98:2;;;9396:21:4;9453:2;9433:18;;;9426:30;9492:34;9472:18;;;9465:62;9563:27;9543:18;;;9536:55;9608:19;;8279:98:2;9212:421:4;8279:98:2;8417:10;8388:19;8410:18;;;:6;:18;;;;;;8454:67;;8505:15;8454:38;:67::i;:::-;8438:83;;8550:5;8531;:15;;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;8582:5:2;;-1:-1:-1;;;;;8582:5:2;:14;8597:10;8609:33;8636:5;8609:26;:33::i;:::-;8582:61;;-1:-1:-1;;;;;;8582:61:2;;;;;;;-1:-1:-1;;;;;7485:32:4;;;8582:61:2;;;7467:51:4;7534:18;;;7527:34;7440:18;;8582:61:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8574:91;;;;-1:-1:-1;;;8574:91:2;;9840:2:4;8574:91:2;;;9822:21:4;9879:2;9859:18;;;9852:30;-1:-1:-1;;;9898:18:4;;;9891:47;9955:18;;8574:91:2;9638:341:4;8574:91:2;8681:35;;160:25:4;;;8698:10:2;;8681:35;;148:2:4;133:18;8681:35:2;;;;;;;8208:515;;8181:542::o;21968:85::-;1019:7:3;1045:6;-1:-1:-1;;;;;1045:6:3;666:10:0;1185:23:3;1177:68;;;;-1:-1:-1;;;1177:68:3;;;;;;;:::i;:::-;22032:5:2::1;:14:::0;;-1:-1:-1;;;;;;22032:14:2::1;-1:-1:-1::0;;;;;22032:14:2;;;::::1;::::0;;;::::1;::::0;;21968:85::o;6447:1724::-;6574:10;6567:18;;;;:6;:18;;;;;:25;;;6566:26;6558:63;;;;-1:-1:-1;;;6558:63:2;;10547:2:4;6558:63:2;;;10529:21:4;10586:2;10566:18;;;10559:30;10625:26;10605:18;;;10598:54;10669:18;;6558:63:2;10345:348:4;6558:63:2;6639:35;6660:13;6639:20;:35::i;:::-;6631:69;;;;-1:-1:-1;;;6631:69:2;;10900:2:4;6631:69:2;;;10882:21:4;10939:2;10919:18;;;10912:30;-1:-1:-1;;;10958:18:4;;;10951:51;11019:18;;6631:69:2;10698:345:4;6631:69:2;22284:18;;6718:7;:34;;6710:62;;;;-1:-1:-1;;;6710:62:2;;11250:2:4;6710:62:2;;;11232:21:4;11289:2;11269:18;;;11262:30;-1:-1:-1;;;11308:18:4;;;11301:45;11363:18;;6710:62:2;11048:339:4;6710:62:2;6806:5;;-1:-1:-1;;;;;6806:5:2;6799:26;6826:10;6846:4;6853:35;6880:7;6853:26;:35::i;:::-;6799:90;;-1:-1:-1;;;;;;6799:90:2;;;;;;;-1:-1:-1;;;;;11650:15:4;;;6799:90:2;;;11632:34:4;11702:15;;;;11682:18;;;11675:43;11734:18;;;11727:34;11567:18;;6799:90:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6791:127;;;;-1:-1:-1;;;6791:127:2;;11974:2:4;6791:127:2;;;11956:21:4;12013:2;11993:18;;;11986:30;12052:26;12032:18;;;12025:54;12096:18;;6791:127:2;11772:348:4;6791:127:2;-1:-1:-1;;;;;6941:23:2;;;;;;:51;;-1:-1:-1;;;;;;6968:17:2;;;;;;:6;:17;;;;;:24;;;6941:51;6937:426;;;-1:-1:-1;;;;;7035:17:2;;7008:24;7035:17;;;:6;:17;;;;;:31;;;:37;;7069:3;;7035:37;:::i;:::-;-1:-1:-1;;;;;7091:87:2;;7128:17;;;;:6;:17;;;;;;;;;:31;;;7091:87;;8353:25:4;;;8394:18;;;8387:34;;;7008:64:2;;-1:-1:-1;7091:87:2;;;;8326:18:4;7091:87:2;;;;;;;-1:-1:-1;;;;;7192:17:2;;;;;;:6;:17;;;;;:31;;:51;;7227:16;;7192:17;:51;;7227:16;;7192:51;:::i;:::-;;;;;;;;7272:16;7257:11;;:31;;;;;;;:::i;:::-;;;;-1:-1:-1;6937:426:2;;-1:-1:-1;;6937:426:2;;-1:-1:-1;7340:12:2;;-1:-1:-1;;;;;7340:12:2;6937:426;7394:381;;;;;;;;7408:4;7394:381;;;7461:15;7394:381;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7373:18;7394:381;;;;;;-1:-1:-1;;;;;7394:381:2;;;;;;;;;7829:10;7822:18;;:6;:18;;;;;;:26;;;;;;;-1:-1:-1;;7822:26:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7822:26:2;;;;;;;-1:-1:-1;;7822:26:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;7822:26:2;;;;;;;7858:16;;7394:381;;7408:4;;7822:26;;7373:18;7858:16;;7408:4;;7858:16;:::i;:::-;;;;;;;;7899:7;7884:11;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;7916:28:2;;;;;;;:13;:28;;;;;:33;;7948:1;;7916:28;:33;;7948:1;;7916:33;:::i;:::-;;;;-1:-1:-1;;7959:116:2;;;;8008:1;7988:16;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;7959:116:2;;-1:-1:-1;7959:116:2;;8063:1;8040:19;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;7959:116:2;8098:66;;;12346:25:4;;;12419:4;12407:17;;12402:2;12387:18;;12380:45;12468:14;;12461:22;12441:18;;;12434:50;-1:-1:-1;;;;;12520:32:4;;12515:2;12500:18;;12493:60;8098:66:2;;8107:10;;8098:66;;;;;;12333:3:4;8098:66:2;;;6548:1623;6447:1724;;;;:::o;21830:128::-;1019:7:3;1045:6;-1:-1:-1;;;;;1045:6:3;666:10:0;1185:23:3;1177:68;;;;-1:-1:-1;;;1177:68:3;;;;;;;:::i;:::-;21919:5:2::1;::::0;:31:::1;::::0;-1:-1:-1;;;21919:31:2;;-1:-1:-1;;;;;7485:32:4;;;21919:31:2::1;::::0;::::1;7467:51:4::0;7534:18;;;7527:34;;;21919:5:2;;::::1;::::0;:14:::1;::::0;7440:18:4;;21919:31:2::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21911:40;;;::::0;::::1;;21830:128:::0;;:::o;1605:101:3:-;1019:7;1045:6;-1:-1:-1;;;;;1045:6:3;666:10:0;1185:23:3;1177:68;;;;-1:-1:-1;;;1177:68:3;;;;;;;:::i;:::-;1669:30:::1;1696:1;1669:18;:30::i;:::-;1605:101::o:0;22956:228:2:-;1019:7:3;1045:6;-1:-1:-1;;;;;1045:6:3;666:10:0;1185:23:3;1177:68;;;;-1:-1:-1;;;1177:68:3;;;;;;;:::i;:::-;23067:12:2::1;:20:::0;;;;23097:12:::1;:20:::0;;;;23127:12:::1;:20:::0;23157:12:::1;:20:::0;22956:228::o;22063:135::-;1019:7:3;1045:6;-1:-1:-1;;;;;1045:6:3;666:10:0;1185:23:3;1177:68;;;;-1:-1:-1;;;1177:68:3;;;;;;;:::i;:::-;22151:18:2::1;:40:::0;22063:135::o;21067:206::-;21151:14;;21127:4;;21151:14;;:24;;;;;21169:1;:6;;21174:1;21169:6;21151:24;21150:56;;;-1:-1:-1;21181:14:2;;;;;;;:24;;;;;21199:1;:6;;21204:1;21199:6;21181:24;21150:86;;;-1:-1:-1;21211:14:2;;;;;;;:24;;;;;21229:1;:6;;21234:1;21229:6;21211:24;21150:116;;;-1:-1:-1;21241:14:2;;;;;;;:24;;;;-1:-1:-1;;21259:6:2;;21264:1;21259:6;;21067:206::o;23194:914::-;23280:7;23303:10;;;:4;:10;;;;;;;;:17;;;;;;;;:24;;;23299:448;;;23347:12;:17;;23363:1;23347:17;23343:394;;;-1:-1:-1;23391:10:2;;;;:4;:10;;;;;;;;:17;;;;;;;;:22;;;23384:29;;23343:394;23450:12;:17;;23466:1;23450:17;23446:291;;;-1:-1:-1;23494:10:2;;;;:4;:10;;;;;;;;:17;;;;;;;;:22;;;23487:29;;23446:291;23553:12;:17;;23569:1;23553:17;23549:188;;;-1:-1:-1;23597:10:2;;;;:4;:10;;;;;;;;:17;;;;;;;;:22;;;23590:29;;23549:188;23656:12;:17;;23672:1;23656:17;23652:85;;;-1:-1:-1;23700:10:2;;;;:4;:10;;;;;;;;:17;;;;;;;;:22;;;23693:29;;23652:85;23769:12;:17;;23785:1;23769:17;23765:310;;;-1:-1:-1;23809:12:2;;23802:19;;23765:310;23850:12;:17;;23866:1;23850:17;23846:229;;;-1:-1:-1;23890:12:2;;23883:19;;23846:229;23931:12;:17;;23947:1;23931:17;23927:148;;;-1:-1:-1;23971:12:2;;23964:19;;23927:148;24012:12;:17;;24028:1;24012:17;24008:67;;;-1:-1:-1;24052:12:2;;24045:19;;24008:67;-1:-1:-1;24100:1:2;23194:914;;;;;;:::o;14757:2079::-;-1:-1:-1;;;;;14898:16:2;;;14858:7;14898:16;;;:6;:16;;;;;;;;14877:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14858:7;;14877:37;14858:7;;14961:36;;:19;:36::i;:::-;14933:64;;15007:23;15033:25;15053:4;15033:19;:25::i;:::-;15007:51;;15148:5;:11;;;15131:28;;:7;:13;;;:28;;;15127:151;;;15252:5;:15;;;15182:67;15216:5;15223;:9;;;15234:7;15243:5;15182:33;:67::i;15127:151::-;15354:13;15370:53;15401:5;15408:7;15417:5;15370:30;:53::i;:::-;15354:69;;15442:23;15468:62;15494:5;:15;;;15511:5;:18;;;15468:25;:62::i;:::-;15442:88;;15540:26;15569:36;15589:15;15569:19;:36::i;:::-;15540:65;-1:-1:-1;15636:1:2;15624:1141;15641:5;:18;;;15638:21;;:1;:21;;;15624:1141;;15679:18;15716:1;15700:7;:13;;;:17;;;;:::i;:::-;15752:12;;15679:38;;-1:-1:-1;15797:2:2;15782:17;;;;15778:122;;;15819:16;15834:1;15819:16;;:::i;:::-;;-1:-1:-1;15868:17:2;15883:2;15868:12;:17;:::i;:::-;15853:32;;15778:122;15914:11;15928:53;15935:12;15928:53;;15949:11;15928:53;;15962:5;:18;;;15928:6;:53::i;:::-;15914:67;;16060:8;:14;;;16044:30;;:12;:30;;;16040:543;;;16094:13;16110:32;16118:8;:12;;;16132:5;:9;;;16110:7;:32::i;:::-;16094:48;;16224:58;16241:5;:19;;;16262:7;16224:58;;16271:3;16276:5;16224:16;:58::i;:::-;16215:67;;;;:::i;:::-;;;16300:5;;;;;;16040:543;16358:5;:11;;;16342:27;;:12;:27;;;16338:245;;;16485:60;16502:5;:19;;;16523:5;:9;;;16485:60;;16534:3;16539:5;16485:16;:60::i;:::-;16476:69;;;;:::i;:::-;;;16563:5;;;;;16338:245;16671:83;16695:5;:19;;;16716:3;16721:11;16734:12;16748:5;16671:23;:83::i;:::-;16662:92;;;;:::i;:::-;;;15665:1100;;;15660:3;;;;;:::i;:::-;;;;15624:1141;;;-1:-1:-1;16792:15:2;;;;16783:24;;;;:::i;:::-;;14757:2079;-1:-1:-1;;;;;;;;;14757:2079:2:o;22319:627::-;1019:7:3;1045:6;-1:-1:-1;;;;;1045:6:3;666:10:0;1185:23:3;1177:68;;;;-1:-1:-1;;;1177:68:3;;;;;;;:::i;:::-;22475:29:2::1;::::0;-1:-1:-1;;;22475:29:2;;22488:15:::1;22475:29;::::0;::::1;160:25:4::0;22454:18:2::1;::::0;22475:4:::1;::::0;:12:::1;::::0;133:18:4;;22475:29:2::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22454:50;;;;22514:19;22536:4;:13;22550:15;22536:30;;;;;;;;;;;;;160:25:4::0;;148:2;133:18;;14:177;22536:30:2::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22514:52;;;;22604:11;22594:6;:21;;:45;;;;;22629:10;22620:5;:19;22594:45;22593:69;;;;22652:10;22644:5;:18;22593:69;22585:134;;;::::0;-1:-1:-1;;;22585:134:2;;13489:2:4;22585:134:2::1;::::0;::::1;13471:21:4::0;13528:2;13508:18;;;13501:30;13567:34;13547:18;;;13540:62;-1:-1:-1;;;13618:18:4;;;13611:50;13678:19;;22585:134:2::1;13287:416:4::0;22585:134:2::1;-1:-1:-1::0;;22738:11:2::1;::::0;;;:4:::1;:11;::::0;;;;;;;:19;;;;;;;;;;:33;;-1:-1:-1;;22738:33:2::1;22767:4;22738:33:::0;;::::1;::::0;;22781:24;::::1;:32:::0;;;;22823:24:::1;::::0;::::1;:32:::0;22865:24:::1;::::0;::::1;:32:::0;;;;22907:24:::1;;:32:::0;22319:627::o;21283:306::-;1019:7:3;1045:6;-1:-1:-1;;;;;1045:6:3;666:10:0;1185:23:3;1177:68;;;;-1:-1:-1;;;1177:68:3;;;;;;;:::i;:::-;21424:14:2::1;:32:::0;;-1:-1:-1;;21466:32:2;21424;::::1;;-1:-1:-1::0;;21466:32:2;;;;;21424::::1;21466::::0;::::1;;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;21550:32:2;21508;;::::1;;::::0;;;::::1;-1:-1:-1::0;;21550:32:2;;;;::::1;;::::0;;;::::1;;::::0;;21283:306::o;21599:225::-;1019:7:3;1045:6;-1:-1:-1;;;;;1045:6:3;666:10:0;1185:23:3;1177:68;;;;-1:-1:-1;;;1177:68:3;;;;;;;:::i;:::-;21669:16:2::1;::::0;;21652:14:::1;21695:20:::0;;;-1:-1:-1;21733:5:2;-1:-1:-1;;;;;21733:5:2::1;:14;21748:10;21760:34;21669:16:::0;21760:26:::1;:34::i;:::-;21733:62;::::0;-1:-1:-1;;;;;;21733:62:2::1;::::0;;;;;;-1:-1:-1;;;;;7485:32:4;;;21733:62:2::1;::::0;::::1;7467:51:4::0;7534:18;;;7527:34;7440:18;;21733:62:2::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21725:92;;;::::0;-1:-1:-1;;;21725:92:2;;9840:2:4;21725:92:2::1;::::0;::::1;9822:21:4::0;9879:2;9859:18;;;9852:30;-1:-1:-1;;;9898:18:4;;;9891:47;9955:18;;21725:92:2::1;9638:341:4::0;21725:92:2::1;21642:182;21599:225::o:0;1855:198:3:-;1019:7;1045:6;-1:-1:-1;;;;;1045:6:3;666:10:0;1185:23:3;1177:68;;;;-1:-1:-1;;;1177:68:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;1943:22:3;::::1;1935:73;;;::::0;-1:-1:-1;;;1935:73:3;;13910:2:4;1935:73:3::1;::::0;::::1;13892:21:4::0;13949:2;13929:18;;;13922:30;13988:34;13968:18;;;13961:62;-1:-1:-1;;;14039:18:4;;;14032:36;14085:19;;1935:73:3::1;13708:402:4::0;1935:73:3::1;2018:28;2037:8;2018:18;:28::i;20626:431:2:-:0;20758:24;;-1:-1:-1;;;20758:24:2;;;;;160:25:4;;;20725:7:2;;;;20758:4;;:12;;133:18:4;;20758:24:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20806:25;;-1:-1:-1;;;20806:25:2;;;;;160::4;;;20744:38:2;;-1:-1:-1;20792:11:2;;20806:4;;:13;;133:18:4;;20806:25:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20792:39;-1:-1:-1;20841:22:2;20850:13;20792:39;20841:22;:::i;:::-;;;20885:2;20877:5;:10;;;20873:82;;;20903:9;20911:1;20903:9;;:::i;:::-;;-1:-1:-1;20934:10:2;20942:2;20934:5;:10;:::i;:::-;20926:18;;20873:82;20976:23;;-1:-1:-1;;;20976:23:2;;;;;160:25:4;;;20964:9:2;;20976:4;;:11;;133:18:4;;20976:23:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21016:34;;-1:-1:-1;;;21016:34:2;;14345:6:4;14333:19;;21016:34:2;;;14315:38:4;14401:4;14389:17;;;14369:18;;;14362:45;14443:17;;14423:18;;;14416:45;20964:35:2;;-1:-1:-1;21016:4:2;;:16;;14288:18:4;;21016:34:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21009:41;20626:431;-1:-1:-1;;;;;;20626:431:2:o;16923:1312::-;-1:-1:-1;;;;;17047:16:2;;;17007:7;17047:16;;;:6;:16;;;;;;;;17026:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17007:7;;17026:37;17007:7;;17110:36;;:19;:36::i;:::-;17082:64;;17165:13;17181:52;17212:5;17219:7;17228:4;17181:30;:52::i;:::-;17165:68;;17252:23;17278:62;17304:5;:15;;;17321:5;:18;;;17278:25;:62::i;:::-;17252:88;;17350:26;17379:36;17399:15;17379:19;:36::i;:::-;17350:65;-1:-1:-1;17446:1:2;17434:764;17451:5;:18;;;17448:21;;:1;:21;;;17434:764;;17489:18;17526:1;17510:7;:13;;;:17;;;;:::i;:::-;17562:12;;17489:38;;-1:-1:-1;17607:2:2;17592:17;;;;17588:122;;;17629:16;17644:1;17629:16;;:::i;:::-;;-1:-1:-1;17678:17:2;17693:2;17678:12;:17;:::i;:::-;17663:32;;17588:122;17724:11;17738:53;17745:12;17738:53;;17759:11;17738:53;;17772:5;:18;;;17738:6;:53::i;:::-;17724:67;;17873:8;:14;;;17857:30;;:12;:30;;;17853:179;;;17969:48;17986:5;17993:8;:12;;;17969:48;;18007:3;18012:4;17969:16;:48::i;:::-;17962:55;16923:1312;-1:-1:-1;;;;;;;;;;;16923:1312:2:o;17853:179::-;18119:68;18143:5;18150:3;18155:11;18168:12;18182:4;18119:23;:68::i;:::-;18111:76;;17475:723;;;17470:3;;;;;:::i;:::-;;;;17434:764;;;-1:-1:-1;18223:5:2;;16923:1312;-1:-1:-1;;;;;;16923:1312:2:o;13238:1406::-;-1:-1:-1;;;;;13365:16:2;;;13325:7;13365:16;;;:6;:16;;;;;;;;13344:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13325:7;;13344:37;13325:7;;13428:36;;:19;:36::i;:::-;13400:64;;13483:13;13499:53;13530:5;13537:7;13546:5;13499:30;:53::i;:::-;13483:69;;13571:23;13597:62;13623:5;:15;;;13640:5;:18;;;13597:25;:62::i;:::-;13571:88;;13669:26;13698:36;13718:15;13698:19;:36::i;:::-;13669:65;-1:-1:-1;13765:1:2;13753:820;13770:5;:18;;;13767:21;;:1;:21;;;13753:820;;13808:18;13845:1;13829:7;:13;;;:17;;;;:::i;:::-;13881:12;;13808:38;;-1:-1:-1;13926:2:2;13911:17;;;;13907:122;;;13948:16;13963:1;13948:16;;:::i;:::-;;-1:-1:-1;13997:17:2;14012:2;13997:12;:17;:::i;:::-;13982:32;;13907:122;14043:11;14057:53;14064:12;14057:53;;14078:11;14057:53;;14091:5;:18;;;14057:6;:53::i;:::-;14043:67;;14192:8;:14;;;14176:30;;:12;:30;;;14172:219;;;14290:63;14307:5;:19;;;14328:8;:12;;;14290:63;;14342:3;14347:5;14290:16;:63::i;:::-;14281:72;;;;:::i;:::-;;;14371:5;;;;;14172:219;14479:83;14503:5;:19;;;14524:3;14529:11;14542:12;14556:5;14479:23;:83::i;:::-;14470:92;;;;:::i;:::-;;;13794:779;;;13789:3;;;;;:::i;:::-;;;;13753:820;;;-1:-1:-1;14600:15:2;;;;14591:24;;;;:::i;:::-;;13238:1406;-1:-1:-1;;;;;;;13238:1406:2:o;10909:512::-;10995:4;11025:12;11077:1;11060:18;;;;11056:95;;;11125:15;11101:16;11114:3;11101:10;:16;:::i;:::-;:21;;11120:2;11101:21;:::i;:::-;:39;11094:46;;;;;11056:95;11164:13;:18;;11181:1;11164:18;11160:95;;;11229:15;11205:16;11218:3;11205:10;:16;:::i;:::-;:21;;11224:2;11205:21;:::i;11160:95::-;11268:13;:18;;11285:1;11268:18;11264:95;;;11333:15;11309:16;11322:3;11309:10;:16;:::i;:::-;:21;;11328:2;11309:21;:::i;11264:95::-;11399:15;11375:16;11388:3;11375:10;:16;:::i;:::-;:21;;11394:2;11375:21;:::i;:::-;:39;;10909:512;-1:-1:-1;;;;10909:512:2:o;10766:133::-;10842:7;10884:8;;10878:2;:14;;;;:::i;:::-;10868:24;;:7;:24;:::i;1322:1116::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;1512:18:2;1520:9;1512:7;:18::i;:::-;1502:28;;;;1573;384:4;1573:15;:28::i;:::-;1562:7;;1546:24;;;;:15;:24::i;:::-;:55;;;;:::i;:::-;1540:61;-1:-1:-1;1635:26:2;1540:61;339:8;1635:26;:::i;:::-;1612:49;;;;:::i;:::-;;;1737:3;384:4;1713:2;:7;;;:21;;;;:::i;:::-;:27;;;;;;:::i;:::-;1694:47;;288:8;1694:47;:::i;:::-;1671:70;;;;:::i;:::-;;;1769:19;1807:1;1803:5;;1798:329;1815:2;1810:1;:7;;;1798:329;;1876:26;1891:1;1894:2;:7;;;1876:14;:26::i;:::-;1859:43;;;;245:5;1859:43;:::i;:::-;1842:60;-1:-1:-1;1963:9:2;1924:36;1941:19;1842:60;1924:36;:::i;:::-;:48;1920:142;;;2000:12;;;:8;;;:12;2038:5;;1920:142;2079:37;2102:14;2079:37;;:::i;:::-;;-1:-1:-1;1819:3:2;;;;:::i;:::-;;;;1798:329;;;2161:1;2157:5;;2152:280;2169:33;2184:2;:8;;;2194:2;:7;;;2169:14;:33::i;:::-;2164:38;;:1;:38;;;2152:280;;2270:9;2231:36;2248:19;245:5;2231:36;:::i;:::-;:48;2227:140;;;2307:10;;;:6;;;:10;2343:5;;2227:140;2384:37;245:5;2384:37;;:::i;:::-;;-1:-1:-1;2204:3:2;;;;:::i;:::-;;;;2152:280;;;1402:1036;;;;1322:1116;;;:::o;11431:381::-;11580:7;11599:11;11613:57;11620:8;:14;;;11613:57;;11636:8;:13;;;11613:57;;11651:5;:18;;;11613:6;:57::i;:::-;11599:71;;11680:15;11710:8;:12;;;11698:9;:24;;;;:::i;:::-;11680:42;;11739:66;11756:5;:19;;;11777:9;11739:66;;11788:3;11793:11;11739:16;:66::i;:::-;11732:73;;;;11431:381;;;;;;;:::o;11818:439::-;12004:14;;;;12020:13;;11984:50;;-1:-1:-1;;;11984:50:2;;16663:4:4;16651:17;;;11984:50:2;;;16633:36:4;16717:6;16705:19;16685:18;;;16678:47;11947:7:2;;;;11984:4;;:19;;16606:18:4;;11984:50:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11966:68;;12044:11;12058:57;12065:8;:14;;;12058:57;;12081:8;:13;;;12058:57;;12096:5;:18;;;12058:6;:57::i;:::-;12044:71;;12125:15;12155:8;:12;;;12143:9;:24;;;;:::i;:::-;12125:42;;12184:66;12201:5;:19;;;12222:9;12184:66;;12233:3;12238:11;12184:16;:66::i;20249:170::-;20313:5;20341:4;20334:11;;:4;:11;;;20330:53;;;-1:-1:-1;20368:4:2;20361:11;;20330:53;-1:-1:-1;20408:4:2;20249:170;-1:-1:-1;20249:170:2:o;12574:575::-;12695:7;12718:11;12714:339;;;12765:11;12790:151;12808:2;12796:9;:14;12790:151;;;12884:9;12878:2;12862:11;:3;12868:5;12862:11;:::i;:::-;12861:19;;;;:::i;:::-;12845:36;;:12;:36;:::i;:::-;:48;;;;:::i;:::-;12830:63;-1:-1:-1;12911:15:2;12924:2;12911:15;;:::i;:::-;;;12790:151;;;13023:18;13032:9;13023:5;:18;:::i;:::-;13009:9;12993:11;:3;12999:5;12993:11;:::i;:::-;12992:26;;;;:::i;:::-;12976:43;;:12;:43;:::i;:::-;:66;;;;:::i;:::-;12961:81;;;12954:88;;;;;12714:339;13137:5;13131:3;13104:24;13119:9;13104:12;:24;:::i;:::-;:30;;;;:::i;:::-;:38;;;;:::i;:::-;13097:45;12574:575;-1:-1:-1;;;;;12574:575:2:o;12267:297::-;12445:34;;-1:-1:-1;;;12445:34:2;;16663:4:4;16651:17;;12445:34:2;;;16633:36:4;16717:6;16705:19;;16685:18;;;16678:47;12406:7:2;;;;12445:4;;:19;;16606:18:4;;12445:34:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12425:54;;;;12496:61;12513:13;12528:9;12539:4;12545:11;12496:16;:61::i;2207:187:3:-;2280:16;2299:6;;-1:-1:-1;;;;;2315:17:3;;;-1:-1:-1;;;;;;2315:17:3;;;;;;2347:40;;2299:6;;;;;;;2347:40;;2280:16;2347:40;2270:124;2207:187;:::o;2444:823:2:-;2498:6;;;;2647:27;288:8;2647:9;:27;:::i;:::-;2633:41;;384:4;2633:41;:::i;:::-;2619:56;-1:-1:-1;2724:28:2;384:4;2724:15;:28::i;:::-;2700:21;2716:4;2700:21;;:15;:21::i;:::-;:52;;;;:::i;:::-;2685:67;-1:-1:-1;2786:35:2;2685:67;339:8;2786:35;:::i;:::-;2763:58;;;;:::i;:::-;;-1:-1:-1;2894:12:2;2873:18;384:4;2873;:18;:::i;:::-;:33;;;;;;:::i;:::-;2854:53;;288:8;2854:53;:::i;:::-;2831:76;;;;:::i;:::-;;;2918:322;2947:9;2925:19;:31;2918:322;;;2980:28;2998:8;3005:1;2998:4;:8;:::i;:::-;2980:10;:28::i;:::-;2976:227;;;3036:43;339:8;3036:43;;:::i;:::-;;;2976:227;;;3146:38;288:8;3146:38;;:::i;:::-;;;2976:227;3220:9;3228:1;3220:9;;:::i;:::-;;;2918:322;;;-1:-1:-1;3256:4:2;2444:823;-1:-1:-1;;;2444:823:2:o;699:140::-;756:4;772:9;780:1;772:9;;:::i;:::-;;-1:-1:-1;822:10:2;829:3;772:9;822:10;:::i;:::-;809;816:3;809:4;:10;:::i;:::-;798:8;805:1;798:4;:8;:::i;:::-;:21;;;;:::i;:::-;:34;;;;:::i;845:471::-;916:5;937;:10;;946:1;937:10;:24;;;;951:5;:10;;960:1;951:10;937:24;:38;;;;965:5;:10;;974:1;965:10;937:38;:52;;;;979:5;:10;;988:1;979:10;937:52;:66;;;;993:5;:10;;1002:1;993:10;937:66;:81;;;;1007:5;:11;;1016:2;1007:11;937:81;:96;;;;1022:5;:11;;1031:2;1022:11;937:96;933:377;;;-1:-1:-1;1060:2:2;1053:9;;933:377;1091:5;:10;;1100:1;1091:10;:24;;;;1105:5;:10;;1114:1;1105:10;1091:24;:38;;;;1119:5;:10;;1128:1;1119:10;1091:38;:53;;;;1133:5;:11;;1142:2;1133:11;1091:53;1087:223;;;-1:-1:-1;1171:2:2;1164:9;;1087:223;1202:16;1213:4;1202:10;:16::i;:::-;1198:112;;;-1:-1:-1;1245:2:2;1238:9;;1198:112;-1:-1:-1;1297:2:2;1290:9;;395:298;449:4;469:8;476:1;469:4;:8;:::i;:::-;:13;;;465:60;;-1:-1:-1;509:5:2;;395:298;-1:-1:-1;395:298:2:o;465:60::-;538:10;545:3;538:4;:10;:::i;:::-;:15;;;534:61;;-1:-1:-1;580:4:2;;395:298;-1:-1:-1;395:298:2:o;534:61::-;608:10;615:3;608:4;:10;:::i;:::-;:15;;;604:62;;-1:-1:-1;650:5:2;;395:298;-1:-1:-1;395:298:2:o;604:62::-;-1:-1:-1;682:4:2;;395:298;-1:-1:-1;395:298:2:o;196:131:4:-;-1:-1:-1;;;;;271:31:4;;261:42;;251:70;;317:1;314;307:12;332:315;400:6;408;461:2;449:9;440:7;436:23;432:32;429:52;;;477:1;474;467:12;429:52;516:9;503:23;535:31;560:5;535:31;:::i;:::-;585:5;637:2;622:18;;;;609:32;;-1:-1:-1;;;332:315:4:o;652:247::-;711:6;764:2;752:9;743:7;739:23;735:32;732:52;;;780:1;777;770:12;732:52;819:9;806:23;838:31;863:5;838:31;:::i;1569:114::-;1653:4;1646:5;1642:16;1635:5;1632:27;1622:55;;1673:1;1670;1663:12;1688:243;1745:6;1798:2;1786:9;1777:7;1773:23;1769:32;1766:52;;;1814:1;1811;1804:12;1766:52;1853:9;1840:23;1872:29;1895:5;1872:29;:::i;2201:118::-;2287:5;2280:13;2273:21;2266:5;2263:32;2253:60;;2309:1;2306;2299:12;2324:588;2405:6;2413;2421;2429;2482:3;2470:9;2461:7;2457:23;2453:33;2450:53;;;2499:1;2496;2489:12;2450:53;2535:9;2522:23;2512:33;;2595:2;2584:9;2580:18;2567:32;2608:29;2631:5;2608:29;:::i;:::-;2656:5;-1:-1:-1;2713:2:4;2698:18;;2685:32;2726:30;2685:32;2726:30;:::i;:::-;2775:7;-1:-1:-1;2834:2:4;2819:18;;2806:32;2847:33;2806:32;2847:33;:::i;:::-;2324:588;;;;-1:-1:-1;2324:588:4;;-1:-1:-1;;2324:588:4:o;2917:315::-;2985:6;2993;3046:2;3034:9;3025:7;3021:23;3017:32;3014:52;;;3062:1;3059;3052:12;3014:52;3098:9;3085:23;3075:33;;3158:2;3147:9;3143:18;3130:32;3171:31;3196:5;3171:31;:::i;:::-;3221:5;3211:15;;;2917:315;;;;;:::o;3445:385::-;3531:6;3539;3547;3555;3608:3;3596:9;3587:7;3583:23;3579:33;3576:53;;;3625:1;3622;3615:12;3576:53;-1:-1:-1;;3648:23:4;;;3718:2;3703:18;;3690:32;;-1:-1:-1;3769:2:4;3754:18;;3741:32;;3820:2;3805:18;3792:32;;-1:-1:-1;3445:385:4;-1:-1:-1;3445:385:4:o;3835:180::-;3894:6;3947:2;3935:9;3926:7;3922:23;3918:32;3915:52;;;3963:1;3960;3953:12;3915:52;-1:-1:-1;3986:23:4;;3835:180;-1:-1:-1;3835:180:4:o;4212:379::-;4287:6;4295;4303;4356:2;4344:9;4335:7;4331:23;4327:32;4324:52;;;4372:1;4369;4362:12;4324:52;4408:9;4395:23;4385:33;;4465:2;4454:9;4450:18;4437:32;4427:42;;4519:2;4508:9;4504:18;4491:32;4532:29;4555:5;4532:29;:::i;:::-;4580:5;4570:15;;;4212:379;;;;;:::o;4596:523::-;4700:6;4708;4716;4724;4732;4740;4793:3;4781:9;4772:7;4768:23;4764:33;4761:53;;;4810:1;4807;4800:12;4761:53;-1:-1:-1;;4833:23:4;;;4903:2;4888:18;;4875:32;;-1:-1:-1;4954:2:4;4939:18;;4926:32;;5005:2;4990:18;;4977:32;;-1:-1:-1;5056:3:4;5041:19;;5028:33;;-1:-1:-1;5108:3:4;5093:19;5080:33;;-1:-1:-1;4596:523:4;-1:-1:-1;4596:523:4:o;5124:647::-;5198:6;5206;5214;5222;5275:3;5263:9;5254:7;5250:23;5246:33;5243:53;;;5292:1;5289;5282:12;5243:53;5331:9;5318:23;5350:28;5372:5;5350:28;:::i;:::-;5397:5;-1:-1:-1;5454:2:4;5439:18;;5426:32;5467:30;5426:32;5467:30;:::i;:::-;5516:7;-1:-1:-1;5575:2:4;5560:18;;5547:32;5588:30;5547:32;5588:30;:::i;:::-;5637:7;-1:-1:-1;5696:2:4;5681:18;;5668:32;5709:30;5668:32;5709:30;:::i;6468:127::-;6529:10;6524:3;6520:20;6517:1;6510:31;6560:4;6557:1;6550:15;6584:4;6581:1;6574:15;6600:125;6640:4;6668:1;6665;6662:8;6659:34;;;6673:18;;:::i;:::-;-1:-1:-1;6710:9:4;;6600:125::o;6730:168::-;6770:7;6836:1;6832;6828:6;6824:14;6821:1;6818:21;6813:1;6806:9;6799:17;6795:45;6792:71;;;6843:18;;:::i;:::-;-1:-1:-1;6883:9:4;;6730:168::o;6903:127::-;6964:10;6959:3;6955:20;6952:1;6945:31;6995:4;6992:1;6985:15;7019:4;7016:1;7009:15;7035:120;7075:1;7101;7091:35;;7106:18;;:::i;:::-;-1:-1:-1;7140:9:4;;7035:120::o;7160:128::-;7200:3;7231:1;7227:6;7224:1;7221:13;7218:39;;;7237:18;;:::i;:::-;-1:-1:-1;7273:9:4;;7160:128::o;7572:245::-;7639:6;7692:2;7680:9;7671:7;7667:23;7663:32;7660:52;;;7708:1;7705;7698:12;7660:52;7740:9;7734:16;7759:28;7781:5;7759:28;:::i;8432:204::-;8470:3;8506:4;8503:1;8499:12;8538:4;8535:1;8531:12;8573:3;8567:4;8563:14;8558:3;8555:23;8552:49;;;8581:18;;:::i;:::-;8617:13;;8432:204;-1:-1:-1;;;8432:204:4:o;8641:224::-;8680:3;8708:6;8741:2;8738:1;8734:10;8771:2;8768:1;8764:10;8802:3;8798:2;8794:12;8789:3;8786:21;8783:47;;;8810:18;;:::i;:::-;8846:13;;8641:224;-1:-1:-1;;;;8641:224:4:o;8870:157::-;8900:1;8934:4;8931:1;8927:12;8958:3;8948:37;;8965:18;;:::i;:::-;9017:3;9010:4;9007:1;9003:12;8999:22;8994:27;;;8870:157;;;;:::o;9032:175::-;9069:3;9113:4;9106:5;9102:16;9142:4;9133:7;9130:17;9127:43;;;9150:18;;:::i;:::-;9199:1;9186:15;;9032:175;-1:-1:-1;;9032:175:4:o;9984:356::-;10186:2;10168:21;;;10205:18;;;10198:30;10264:34;10259:2;10244:18;;10237:62;10331:2;10316:18;;9984:356::o;12754:276::-;12823:6;12876:2;12864:9;12855:7;12851:23;12847:32;12844:52;;;12892:1;12889;12882:12;12844:52;12924:9;12918:16;12974:6;12967:5;12963:18;12956:5;12953:29;12943:57;;12996:1;12993;12986:12;13035:247;13103:6;13156:2;13144:9;13135:7;13131:23;13127:32;13124:52;;;13172:1;13169;13162:12;13124:52;13204:9;13198:16;13223:29;13246:5;13223:29;:::i;14472:184::-;14542:6;14595:2;14583:9;14574:7;14570:23;14566:32;14563:52;;;14611:1;14608;14601:12;14563:52;-1:-1:-1;14634:16:4;;14472:184;-1:-1:-1;14472:184:4:o;14661:422::-;14750:1;14793:5;14750:1;14807:270;14828:7;14818:8;14815:21;14807:270;;;14887:4;14883:1;14879:6;14875:17;14869:4;14866:27;14863:53;;;14896:18;;:::i;:::-;14946:7;14936:8;14932:22;14929:55;;;14966:16;;;;14929:55;15045:22;;;;15005:15;;;;14807:270;;;14811:3;14661:422;;;;;:::o;15088:806::-;15137:5;15167:8;15157:80;;-1:-1:-1;15208:1:4;15222:5;;15157:80;15256:4;15246:76;;-1:-1:-1;15293:1:4;15307:5;;15246:76;15338:4;15356:1;15351:59;;;;15424:1;15419:130;;;;15331:218;;15351:59;15381:1;15372:10;;15395:5;;;15419:130;15456:3;15446:8;15443:17;15440:43;;;15463:18;;:::i;:::-;-1:-1:-1;;15519:1:4;15505:16;;15534:5;;15331:218;;15633:2;15623:8;15620:16;15614:3;15608:4;15605:13;15601:36;15595:2;15585:8;15582:16;15577:2;15571:4;15568:12;15564:35;15561:77;15558:159;;;-1:-1:-1;15670:19:4;;;15702:5;;15558:159;15749:34;15774:8;15768:4;15749:34;:::i;:::-;15819:6;15815:1;15811:6;15807:19;15798:7;15795:32;15792:58;;;15830:18;;:::i;:::-;15868:20;;15088:806;-1:-1:-1;;;15088:806:4:o;15899:131::-;15959:5;15988:36;16015:8;16009:4;15988:36;:::i;16035:217::-;16074:4;16103:6;16159:10;;;;16129;;16181:12;;;16178:38;;;16196:18;;:::i;:::-;16233:13;;16035:217;-1:-1:-1;;;16035:217:4:o;16257:195::-;16295:4;16332;16329:1;16325:12;16364:4;16361:1;16357:12;16389:3;16384;16381:12;16378:38;;;16396:18;;:::i;:::-;16433:13;;;16257:195;-1:-1:-1;;;16257:195:4:o;16736:140::-;16794:5;16823:47;16864:4;16854:8;16850:19;16844:4;16823:47;:::i;16881:179::-;16912:1;16938:6;16971:2;16968:1;16964:10;16993:3;16983:37;;17000:18;;:::i;:::-;17038:10;;17034:20;;;;;16881:179;-1:-1:-1;;16881:179:4:o

Swarm Source

ipfs://fed1db0635b2f04cf43dad1bcaaaeb85f56dfa5fa5ea20b36f9c18b636fc81e6

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.