ETH Price: $2,070.43 (+11.62%)
 

Overview

Max Total Supply

1,000,000,000 MRT

Holders

6

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MeanaRaptor

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
byzantium EvmVersion
File 1 of 11 : Token.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;

import "./lib/IRouter02.sol";
import "./lib/IERC20.sol";
import "./lib/IFactoryV2.sol";
import "./lib/IV2Pair.sol";
import "./lib/timeAndDate.sol";
import "./Staking.sol";

contract MeanaRaptor is IERC20 {

    uint256 public constant maxBuyTaxes = 2500;    
    bool inSwap;
    uint256 public constant maxSellTaxes = 2500;
    uint256 public constant maxTransferTaxes = 2500;
    uint256 constant taxDivisor = 10000;
    uint256 internal _tSupply = 1000000000000000000000000000;
    address private _owner;
    uint256 private timeSinceLastPairCreated = 0;
    uint public sellLimitADay = 10000000000000000000000;
    
    mapping(address => uint256) internal _tokenOwned;
    mapping(address => bool) allLiquidityPoolPairs;
    mapping(address => mapping(address => uint256)) internal _allowances;
    mapping(address => bool) internal _isExcludedFromFees;
    mapping(address => bool) internal _isExcludedFromLimits;
    mapping(address => bool) internal _liquidityHolders;

    Fees public _taxRates =
        Fees({buyFee: 500, sellFee: 500, transferFee: 0});
    
    // Fee public feeContract;
    StakingContract public staking;
    uint public projectFeePercentage;
    address public projectFeeWalet;

    uint256 internal lastSwap;

    uint256 internal _maxTxAmount = (_tSupply * 100) / 10000;
    uint256 internal _maxWalletSize = (_tSupply * 200) / 10000;

    bool public contractSwapEnabled = false;
    uint256 public contractSwapTimer = 0 seconds;
    uint256 public swapThreshold;

    bool public tradingEnabled = false;
    bool public _hasLiquidityBeenAdded = false;

    IRouter02 public dexRouter;
    address public lpPair;
    address public constant DEAD = 0x000000000000000000000000000000000000dEaD;

    bool public liquidityPoolInitialized = false;

    struct Fees {
        uint buyFee;
        uint sellFee;
        uint transferFee;
    }
    struct Sold {
        uint amount;
        uint day;
        uint month;
        uint year;
    }
    mapping(address => Sold) public sold;

    event OwnershipTransferred(
        address indexed pastOwner,
        address indexed newOwner
    );
    event ContractSwapEnabledUpdated(bool enabled);
    event AutoLiquify(uint256 amountCurrency, uint256 amountTokens);
    event TaxUpdated(uint256 buy, uint256 sell, uint256 transfer);
    event MaxTransactionAmountUpdated(uint256 amount);
    event SwapSettingsUpdated(uint256 threshold, uint256 time);
    event paircreated(address pair);


    modifier swapLock {
        inSwap = true;
        _;
        inSwap = false;
    }

    modifier onlyOwner() {
        require(_owner == msg.sender, "Caller must be the owner");
        _;
    }

    string internal _name = "Meana Raptor";
    string internal _symbol = "MRT";
    uint8 internal _decimals = 18;

    constructor(address _stakingAddress) payable {
        // Set the owner.
        _owner = address(msg.sender);
        projectFeePercentage = 60;
        staking = StakingContract(_stakingAddress);
        projectFeeWalet = 0xcEc1709fe5D7f48Fec3c229a8FC9473Ef08014d6;

        _tokenOwned[msg.sender] = _tSupply;
        emit Transfer(address(0), msg.sender, _tSupply);

        // Multichain Token - Will need to rephrase
        dexRouter = IRouter02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        _isExcludedFromFees[_owner] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[DEAD] = true;
        _liquidityHolders[_owner] = true;
    }

    function balanceOf(address account) public view override(IERC20)  returns (uint256) {
        return _tokenOwned[account];
    }
    
    function confirmLP(
    ) public onlyOwner{
        require(!liquidityPoolInitialized, 'LP already initited');
        lpPair = IFactoryV2(dexRouter.factory()).getPair(address(this), dexRouter.WETH());
        setLiquidityPoolPair(lpPair, true);
        liquidityPoolInitialized = true;
        _checkLiquidityAdd(msg.sender);
        allowTrading();
    }

    function setPairAddress (address pair
    ) public onlyOwner{
        require(pair!=address(0),'Invalid address');
        setLiquidityPoolPair(pair, true);
    }


    function preInitializeTransfer(
        address to,
        uint256 amount
    ) public onlyOwner {
        require(!liquidityPoolInitialized,'Liquidity pool must not be initialized');
        amount = amount * 10 ** _decimals;
        _completeTransfer(msg.sender, to, amount, false, false, false, true);
    }


    // Ownable removed as a lib and added here to allow for custom transfers and renouncements.
    // This allows for removal of ownership privileges from the owner once renounced or transferred.
    function transferOwner(address newOwner) external onlyOwner(){
        require(
            newOwner != address(0),
            "Call renounceOwnership to transfer owner to the zero address"
        );
        require(
            newOwner != DEAD,
            "Call renounceOwnership to transfer owner to the zero address"
        );
        setExcludedFromFees(_owner, false);
        setExcludedFromFees(newOwner, true);

        if (balanceOf(_owner) > 0) {
            _transfer(_owner, newOwner, balanceOf(_owner));
        }

        _owner = newOwner;
        emit OwnershipTransferred(_owner, newOwner);
    }

    function renounceOwnership() public onlyOwner {
        setExcludedFromFees(_owner, false);
        _owner = address(0);
        emit OwnershipTransferred(_owner, address(0));
    }

    //===============================================================================================================

    function totalSupply() external view override returns (uint256) {
        if (_tSupply == 0) {
            revert();
        }
        return _tSupply;
    }

    function decimals() external view override returns (uint8) {
        return _decimals;
    }

    function symbol() external view override returns (string memory) {
        return _symbol;
    }

    function name() external view override returns (string memory) {
        return _name;
    }

    function getOwner() external view returns (address) {
        return _owner;
    }

    function allowance(
        address holder,
        address spender
    ) external view override returns (uint256) {
        return _allowances[holder][spender];
    }

    
    function transfer(
        address recipient,
        uint256 amount
    ) public override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    function approve(
        address spender,
        uint256 amount
    ) public override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function approveContractContingency() public onlyOwner returns (bool) {
        _approve(address(this), address(dexRouter), type(uint256).max);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        if (_allowances[sender][msg.sender] != type(uint256).max) {
            _allowances[sender][msg.sender] -= amount;
        }

        return _transfer(sender, recipient, amount);
    }

    function setNewRouter(address newRouter) public onlyOwner {
        require(newRouter!=address(0),'Invalid address');
        IRouter02 _newRouter = IRouter02(newRouter);
        address get_pair = IFactoryV2(_newRouter.factory()).getPair(
            address(this),
            _newRouter.WETH()
        );
        if (get_pair == address(0)) {
            lpPair = IFactoryV2(_newRouter.factory()).createPair(
                address(this),
                _newRouter.WETH()
            );
        } else {
            lpPair = get_pair;
        }
        dexRouter = _newRouter;
        _approve(address(this), address(dexRouter), type(uint256).max);
    }

    function setLiquidityPoolPair(
        address pair,
        bool enabled
    ) public onlyOwner {
        require(pair!=address(0),'Invalid address');
        if (!enabled) {
            allLiquidityPoolPairs[pair] = false;
        } else {
            if (timeSinceLastPairCreated != 0) {
                require(
                    block.timestamp - timeSinceLastPairCreated > 3 days,
                    "3 Day cooldown.!"
                );
            }
            allLiquidityPoolPairs[pair] = true;
            timeSinceLastPairCreated = block.timestamp;
        }
    }
    
    function setTaxes(
        uint buyFee,
        uint sellFee,
        uint transferFee
    ) external onlyOwner {
        require(
            buyFee <= maxBuyTaxes &&
                sellFee <= maxSellTaxes &&
                transferFee <= maxTransferTaxes,
            "Cannot exceed maximum"
        );
        _taxRates.buyFee = buyFee;
        _taxRates.sellFee = sellFee;
        _taxRates.transferFee = transferFee;
        emit TaxUpdated(buyFee, sellFee, transferFee);
    }

    function setMaxTxPercent(
        uint256 percent,
        uint256 divisor
    ) external onlyOwner {
        require(
            (_tSupply * percent) / divisor >= (_tSupply / 1000),
            "Max Transaction amount must be above 0.1% of total supply"
        );
        _maxTxAmount = (_tSupply * percent) / divisor;
        emit MaxTransactionAmountUpdated(_maxTxAmount);
    }


    function setSwapSettings(
        uint256 threshold,
        uint256 thresholdDivisor,
        uint256 time
    ) external onlyOwner {
        require(threshold > 0,'Threshold has to be higher than 0');
        require(thresholdDivisor%10 == 0 && thresholdDivisor > 0,'thresholdDivisor has to be higher than 0 and divisible by 10');
        swapThreshold = (_tSupply * threshold) / thresholdDivisor;
        contractSwapTimer = time;
        emit SwapSettingsUpdated(swapThreshold, time);
    }

    function setContractSwapEnabled(bool enabled) external onlyOwner {
        contractSwapEnabled = enabled;
        emit ContractSwapEnabledUpdated(enabled);
    }

    function preInitializeTransferMultiple(
        address[] memory accounts,
        uint256[] memory amounts
    ) external onlyOwner {
        require(accounts.length == amounts.length, "Accounts != Amounts");
        for (uint8 i = 0; i < accounts.length; i++) {
            require(balanceOf(msg.sender) >= amounts[i] * 10 ** _decimals,'Account have lower tokenb balance than needed');
            preInitializeTransfer(accounts[i], amounts[i]);
        }
    }




    function allowTrading() internal {
        require(!tradingEnabled, "Trading already enabled!");
        require(_hasLiquidityBeenAdded, "Liquidity must be added");
        tradingEnabled = true;
        swapThreshold = (_tSupply * 1) / 10000000;

    }

    function takeTax(
        address from,
        bool buy,
        bool sell,
        uint256 amount
    ) internal returns (uint256) {
        uint256 currentFee;
        if (buy) {
            currentFee = _taxRates.buyFee;
        } else if (sell) {
            currentFee = _taxRates.sellFee;
        } else {
            currentFee = _taxRates.transferFee;
        }

        uint256 feeAmount = (amount * currentFee) / taxDivisor;

        _tokenOwned[address(this)] += feeAmount;
        emit Transfer(from, address(this), feeAmount);

        return amount - feeAmount;
    }


    function setMaxWalletSize(
        uint256 percent,
        uint256 divisor
    ) external onlyOwner {
        require(
            (_tSupply * percent) / divisor >= (_tSupply / 1000),
            "Max Wallet amount must be above 0.1% of total supply"
        );
        _maxWalletSize = (_tSupply * percent) / divisor;
    }

    function setExcludedFromLimits(
        address account,
        bool enabled
    ) external onlyOwner {
        _isExcludedFromLimits[account] = enabled;
    }


    function sweepContingency() external onlyOwner {
        payable(_owner).transfer(address(this).balance);
    }

    function contractSwap(uint256 contractTokenBalance) internal swapLock {
        // _transfer(address(this),address(feeContract),contractTokenBalance);
        uint projectFee = contractTokenBalance * projectFeePercentage/100;
        uint stakingReward = contractTokenBalance-projectFee;
        _transfer(address(this),address(_owner),projectFee);
        _transfer(address(this),address(staking),stakingReward);
        staking.entryCol(stakingReward);
    }

    function isExcludedFromLimits(address account) public view returns (bool) {
        return _isExcludedFromLimits[account];
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function setExcludedFromFees(
        address account,
        bool enabled
    ) public onlyOwner {
        _isExcludedFromFees[account] = enabled;
    }

    function getMaxTransaction() public view returns (uint256) {
        return _maxTxAmount / (10 ** _decimals);
    }

    function getMaxWallet() public view returns (uint256) {
        return _maxWalletSize / (10 ** _decimals);
    }

    function _completeTransfer(
        address from,
        address to,
        uint256 amount,
        bool takeFee,
        bool buy,
        bool sell,
        bool other
    ) internal returns (bool) {

        _tokenOwned[from] -= amount;
        uint256 amountReceived = (takeFee)
            ? takeTax(from, buy, sell, amount)
            : amount;
        _tokenOwned[to] += amountReceived;

        emit Transfer(from, to, amountReceived);
        return true;
    }

    function _hasLimits(address from, address to) internal view returns (bool) {
        return
            from != _owner &&
            to != _owner &&
            tx.origin != _owner &&
            !_liquidityHolders[to] &&
            !_liquidityHolders[from] &&
            to != DEAD &&
            to != address(0) &&
            from != address(this);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal returns (bool) {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");

        bool buy = false;
        bool sell = false;
        bool other = false;
        if (allLiquidityPoolPairs[from]) {
            buy = true;
        } else if (allLiquidityPoolPairs[to]) {
            sell = true;
        } else {
            other = true;
        }
        
        if (_hasLimits(from, to)) {

            if (buy || sell) {
                if (!tradingEnabled) {
                    revert("Trading not yet enabled!");
                }
                if (
                    !_isExcludedFromLimits[from] && !_isExcludedFromLimits[to]
                ) {
                    require(
                        amount <= _maxTxAmount,
                        "Transfer amount exceeds the maxTransactionAmount"
                    );
                }
            }
            if (to != address(dexRouter) && !sell) {
                if (!_isExcludedFromLimits[to]) {
                    require(
                        balanceOf(to) + amount <= _maxWalletSize,
                        "Transfer amount exceeds the maxWalletSize."
                    );
                }
            }
        }

        bool takeFee = true;
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        if (sell) {
            if (!inSwap && contractSwapEnabled) {
                // if (lastSwap + contractSwapTimer < block.timestamp) {
                    uint256 contractTokenBalance = balanceOf(address(this));
                    if (contractTokenBalance >= swapThreshold) {
                        //TODO: check sale limit a day
                        (uint year , uint month,uint day) = DateTime.timestampToDate(block.timestamp);
                        if (sold[msg.sender].day==day && sold[msg.sender].month==month && sold[msg.sender].year==year) {
                            require(sold[msg.sender].amount+amount<=sellLimitADay,"exceeded sell limit for today");
                            sold[msg.sender].amount+=amount;
                        } else {
                            sold[msg.sender].amount=amount;
                        }
                        sold[msg.sender].day=day;
                        sold[msg.sender].month=month;
                        sold[msg.sender].year=year;
                        contractTokenBalance = swapThreshold;
                        contractSwap(contractTokenBalance);
                    }
                // }
            }
        }
        lastSwap = block.timestamp;

        return _completeTransfer(from, to, amount, takeFee, buy, sell, other);
    }

    function distributeTax() public onlyOwner(){
         if (lastSwap + contractSwapTimer < block.timestamp) {
                    uint256 contractTokenBalance = balanceOf(address(this));
                    if (contractTokenBalance >= swapThreshold) {
                        contractTokenBalance = swapThreshold;
                        contractSwap(contractTokenBalance);
                        lastSwap = block.timestamp;
                    }
                }
    }


    function setStakingAddress(address _address) external onlyOwner{
        require(isContract(_address), "Staking address must be a contract");
        staking = StakingContract(_address);
    }
    // Setter function for project fee Percentage
    function setprojectFeePercentage(uint _percentage) external onlyOwner{
        require(_percentage <= 100, "Percentage total must be less than or equals to 100");
        projectFeePercentage = _percentage;
    }

    // Setter function for swapFee
    function setprojectFeeWalet(address _projectFeeWalet) external onlyOwner{
        projectFeeWalet = _projectFeeWalet;
    }

    function setSellLimitADay(uint _sellLimitADay) external onlyOwner{
        sellLimitADay = _sellLimitADay;
    }

    function _approve(
        address sender,
        address spender,
        uint256 amount
    ) internal {
        require(sender != address(0), "ERC20: Zero Address");
        require(spender != address(0), "ERC20: Zero Address");

        _allowances[sender][spender] = amount;
        emit Approval(sender, spender, amount);
    }

    function _checkLiquidityAdd(address from) internal {
        require(!_hasLiquidityBeenAdded, "Liquidity already added and marked");
            _liquidityHolders[from] = true;
            _hasLiquidityBeenAdded = true;

            contractSwapEnabled = true;
            emit ContractSwapEnabledUpdated(true);
    }


    function initializeLiqudityPool(uint256 amountTokens) public onlyOwner {
        require(!liquidityPoolInitialized, "Already initialized");
        require(address(this).balance > 0, "Contract must have ETH.");
        require(
            balanceOf(msg.sender) >= amountTokens * 10 ** 18,
            "You do not have enough tokens."
        );

        lpPair = IFactoryV2(dexRouter.factory()).createPair(
            dexRouter.WETH(),
            address(this)
        );
        setLiquidityPoolPair(lpPair, true);
        emit paircreated(lpPair);
        allLiquidityPoolPairs[lpPair] = true;

        _approve(_owner, address(dexRouter), type(uint256).max);
        _approve(address(this), address(dexRouter), type(uint256).max);

        liquidityPoolInitialized = true;

        amountTokens *= 10 ** _decimals;
        _completeTransfer(
            msg.sender,
            address(this),
            amountTokens,
            false,
            false,
            false,
            true
        );

        dexRouter.addLiquidityETH{value: address(this).balance}(
            address(this),
            balanceOf(address(this)),
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            _owner,
            block.timestamp
        );
        _checkLiquidityAdd(msg.sender);

        allowTrading();
    }

    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _tSupply += value;
        } else {
            uint256 fromBalance = _tokenOwned[from];
            if (fromBalance < value) {
                revert ("Insufficient balance");
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _tokenOwned[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _tSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _tokenOwned[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    function burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ("Invalid sender address");
        }
        _update(account, address(0), value);
    }
    function isContract(address _addr) public view returns (bool){
        uint32 size;
        assembly {
            size := extcodesize(_addr)
        }
        return (size > 0);
    }
    receive() payable external {}
}

File 2 of 11 : timeAndDate.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// ----------------------------------------------------------------------------
// DateTime Library v2.0
//
// A gas-efficient Solidity date and time library
//
// https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary
//
// Tested date range 1970/01/01 to 2345/12/31
//
// Conventions:
// Unit      | Range         | Notes
// :-------- |:-------------:|:-----
// timestamp | >= 0          | Unix timestamp, number of seconds since 1970/01/01 00:00:00 UTC
// year      | 1970 ... 2345 |
// month     | 1 ... 12      |
// day       | 1 ... 31      |
// hour      | 0 ... 23      |
// minute    | 0 ... 59      |
// second    | 0 ... 59      |
// dayOfWeek | 1 ... 7       | 1 = Monday, ..., 7 = Sunday
//
//
// Enjoy. (c) BokkyPooBah / Bok Consulting Pty Ltd 2018-2019. The MIT Licence.
// ----------------------------------------------------------------------------

library DateTime {
    uint256 constant SECONDS_PER_DAY = 24 * 60 * 60;
    uint256 constant SECONDS_PER_HOUR = 60 * 60;
    uint256 constant SECONDS_PER_MINUTE = 60;
    int256 constant OFFSET19700101 = 2440588;

    uint256 constant DOW_MON = 1;
    uint256 constant DOW_TUE = 2;
    uint256 constant DOW_WED = 3;
    uint256 constant DOW_THU = 4;
    uint256 constant DOW_FRI = 5;
    uint256 constant DOW_SAT = 6;
    uint256 constant DOW_SUN = 7;

    // ------------------------------------------------------------------------
    // Calculate the number of days from 1970/01/01 to year/month/day using
    // the date conversion algorithm from
    //   http://aa.usno.navy.mil/faq/docs/JD_Formula.php
    // and subtracting the offset 2440588 so that 1970/01/01 is day 0
    //
    // days = day
    //      - 32075
    //      + 1461 * (year + 4800 + (month - 14) / 12) / 4
    //      + 367 * (month - 2 - (month - 14) / 12 * 12) / 12
    //      - 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4
    //      - offset
    // ------------------------------------------------------------------------
    function _daysFromDate(uint256 year, uint256 month, uint256 day) internal pure returns (uint256 _days) {
        require(year >= 1970);
        int256 _year = int256(year);
        int256 _month = int256(month);
        int256 _day = int256(day);

        int256 __days = _day - 32075 + (1461 * (_year + 4800 + (_month - 14) / 12)) / 4
            + (367 * (_month - 2 - ((_month - 14) / 12) * 12)) / 12
            - (3 * ((_year + 4900 + (_month - 14) / 12) / 100)) / 4 - OFFSET19700101;

        _days = uint256(__days);
    }

    // ------------------------------------------------------------------------
    // Calculate year/month/day from the number of days since 1970/01/01 using
    // the date conversion algorithm from
    //   http://aa.usno.navy.mil/faq/docs/JD_Formula.php
    // and adding the offset 2440588 so that 1970/01/01 is day 0
    //
    // int L = days + 68569 + offset
    // int N = 4 * L / 146097
    // L = L - (146097 * N + 3) / 4
    // year = 4000 * (L + 1) / 1461001
    // L = L - 1461 * year / 4 + 31
    // month = 80 * L / 2447
    // dd = L - 2447 * month / 80
    // L = month / 11
    // month = month + 2 - 12 * L
    // year = 100 * (N - 49) + year + L
    // ------------------------------------------------------------------------
    function _daysToDate(uint256 _days) internal pure returns (uint256 year, uint256 month, uint256 day) {
        unchecked {
            int256 __days = int256(_days);

            int256 L = __days + 68569 + OFFSET19700101;
            int256 N = (4 * L) / 146097;
            L = L - (146097 * N + 3) / 4;
            int256 _year = (4000 * (L + 1)) / 1461001;
            L = L - (1461 * _year) / 4 + 31;
            int256 _month = (80 * L) / 2447;
            int256 _day = L - (2447 * _month) / 80;
            L = _month / 11;
            _month = _month + 2 - 12 * L;
            _year = 100 * (N - 49) + _year + L;

            year = uint256(_year);
            month = uint256(_month);
            day = uint256(_day);
        }
    }

    function timestampFromDate(uint256 year, uint256 month, uint256 day) internal pure returns (uint256 timestamp) {
        timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY;
    }

    function timestampFromDateTime(
        uint256 year,
        uint256 month,
        uint256 day,
        uint256 hour,
        uint256 minute,
        uint256 second
    )
        internal
        pure
        returns (uint256 timestamp)
    {
        timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + hour * SECONDS_PER_HOUR
            + minute * SECONDS_PER_MINUTE + second;
    }

    function timestampToDate(uint256 timestamp) internal pure returns (uint256 year, uint256 month, uint256 day) {
        unchecked {
            (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY);
        }
    }

    function timestampToDateTime(uint256 timestamp)
        internal
        pure
        returns (uint256 year, uint256 month, uint256 day, uint256 hour, uint256 minute, uint256 second)
    {
        unchecked {
            (year, month, day) = _daysToDate(timestamp / SECONDS_PER_DAY);
            uint256 secs = timestamp % SECONDS_PER_DAY;
            hour = secs / SECONDS_PER_HOUR;
            secs = secs % SECONDS_PER_HOUR;
            minute = secs / SECONDS_PER_MINUTE;
            second = secs % SECONDS_PER_MINUTE;
        }
    }

    function isValidDate(uint256 year, uint256 month, uint256 day) internal pure returns (bool valid) {
        if (year >= 1970 && month > 0 && month <= 12) {
            uint256 daysInMonth = _getDaysInMonth(year, month);
            if (day > 0 && day <= daysInMonth) {
                valid = true;
            }
        }
    }

    function isValidDateTime(uint256 year, uint256 month, uint256 day, uint256 hour, uint256 minute, uint256 second)
        internal
        pure
        returns (bool valid)
    {
        if (isValidDate(year, month, day)) {
            if (hour < 24 && minute < 60 && second < 60) {
                valid = true;
            }
        }
    }

    function isLeapYear(uint256 timestamp) internal pure returns (bool leapYear) {
        (uint256 year,,) = _daysToDate(timestamp / SECONDS_PER_DAY);
        leapYear = _isLeapYear(year);
    }

    function _isLeapYear(uint256 year) internal pure returns (bool leapYear) {
        leapYear = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
    }

    function isWeekDay(uint256 timestamp) internal pure returns (bool weekDay) {
        weekDay = getDayOfWeek(timestamp) <= DOW_FRI;
    }

    function isWeekEnd(uint256 timestamp) internal pure returns (bool weekEnd) {
        weekEnd = getDayOfWeek(timestamp) >= DOW_SAT;
    }

    function getDaysInMonth(uint256 timestamp) internal pure returns (uint256 daysInMonth) {
        (uint256 year, uint256 month,) = _daysToDate(timestamp / SECONDS_PER_DAY);
        daysInMonth = _getDaysInMonth(year, month);
    }

    function _getDaysInMonth(uint256 year, uint256 month) internal pure returns (uint256 daysInMonth) {
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
            daysInMonth = 31;
        } else if (month != 2) {
            daysInMonth = 30;
        } else {
            daysInMonth = _isLeapYear(year) ? 29 : 28;
        }
    }

    // 1 = Monday, 7 = Sunday
    function getDayOfWeek(uint256 timestamp) internal pure returns (uint256 dayOfWeek) {
        uint256 _days = timestamp / SECONDS_PER_DAY;
        dayOfWeek = ((_days + 3) % 7) + 1;
    }

    function getYear(uint256 timestamp) internal pure returns (uint256 year) {
        (year,,) = _daysToDate(timestamp / SECONDS_PER_DAY);
    }

    function getMonth(uint256 timestamp) internal pure returns (uint256 month) {
        (, month,) = _daysToDate(timestamp / SECONDS_PER_DAY);
    }

    function getDay(uint256 timestamp) internal pure returns (uint256 day) {
        (,, day) = _daysToDate(timestamp / SECONDS_PER_DAY);
    }

    function getHour(uint256 timestamp) internal pure returns (uint256 hour) {
        uint256 secs = timestamp % SECONDS_PER_DAY;
        hour = secs / SECONDS_PER_HOUR;
    }

    function getMinute(uint256 timestamp) internal pure returns (uint256 minute) {
        uint256 secs = timestamp % SECONDS_PER_HOUR;
        minute = secs / SECONDS_PER_MINUTE;
    }

    function getSecond(uint256 timestamp) internal pure returns (uint256 second) {
        second = timestamp % SECONDS_PER_MINUTE;
    }

    function addYears(uint256 timestamp, uint256 _years) internal pure returns (uint256 newTimestamp) {
        (uint256 year, uint256 month, uint256 day) = _daysToDate(timestamp / SECONDS_PER_DAY);
        year += _years;
        uint256 daysInMonth = _getDaysInMonth(year, month);
        if (day > daysInMonth) {
            day = daysInMonth;
        }
        newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + (timestamp % SECONDS_PER_DAY);
        require(newTimestamp >= timestamp);
    }

    function addMonths(uint256 timestamp, uint256 _months) internal pure returns (uint256 newTimestamp) {
        (uint256 year, uint256 month, uint256 day) = _daysToDate(timestamp / SECONDS_PER_DAY);
        month += _months;
        year += (month - 1) / 12;
        month = ((month - 1) % 12) + 1;
        uint256 daysInMonth = _getDaysInMonth(year, month);
        if (day > daysInMonth) {
            day = daysInMonth;
        }
        newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + (timestamp % SECONDS_PER_DAY);
        require(newTimestamp >= timestamp);
    }

    function addDays(uint256 timestamp, uint256 _days) internal pure returns (uint256 newTimestamp) {
        newTimestamp = timestamp + _days * SECONDS_PER_DAY;
        require(newTimestamp >= timestamp);
    }

    function addHours(uint256 timestamp, uint256 _hours) internal pure returns (uint256 newTimestamp) {
        newTimestamp = timestamp + _hours * SECONDS_PER_HOUR;
        require(newTimestamp >= timestamp);
    }

    function addMinutes(uint256 timestamp, uint256 _minutes) internal pure returns (uint256 newTimestamp) {
        newTimestamp = timestamp + _minutes * SECONDS_PER_MINUTE;
        require(newTimestamp >= timestamp);
    }

    function addSeconds(uint256 timestamp, uint256 _seconds) internal pure returns (uint256 newTimestamp) {
        newTimestamp = timestamp + _seconds;
        require(newTimestamp >= timestamp);
    }

    function subYears(uint256 timestamp, uint256 _years) internal pure returns (uint256 newTimestamp) {
        (uint256 year, uint256 month, uint256 day) = _daysToDate(timestamp / SECONDS_PER_DAY);
        year -= _years;
        uint256 daysInMonth = _getDaysInMonth(year, month);
        if (day > daysInMonth) {
            day = daysInMonth;
        }
        newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + (timestamp % SECONDS_PER_DAY);
        require(newTimestamp <= timestamp);
    }

    function subMonths(uint256 timestamp, uint256 _months) internal pure returns (uint256 newTimestamp) {
        (uint256 year, uint256 month, uint256 day) = _daysToDate(timestamp / SECONDS_PER_DAY);
        uint256 yearMonth = year * 12 + (month - 1) - _months;
        year = yearMonth / 12;
        month = (yearMonth % 12) + 1;
        uint256 daysInMonth = _getDaysInMonth(year, month);
        if (day > daysInMonth) {
            day = daysInMonth;
        }
        newTimestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + (timestamp % SECONDS_PER_DAY);
        require(newTimestamp <= timestamp);
    }

    function subDays(uint256 timestamp, uint256 _days) internal pure returns (uint256 newTimestamp) {
        newTimestamp = timestamp - _days * SECONDS_PER_DAY;
        require(newTimestamp <= timestamp);
    }

    function subHours(uint256 timestamp, uint256 _hours) internal pure returns (uint256 newTimestamp) {
        newTimestamp = timestamp - _hours * SECONDS_PER_HOUR;
        require(newTimestamp <= timestamp);
    }

    function subMinutes(uint256 timestamp, uint256 _minutes) internal pure returns (uint256 newTimestamp) {
        newTimestamp = timestamp - _minutes * SECONDS_PER_MINUTE;
        require(newTimestamp <= timestamp);
    }

    function subSeconds(uint256 timestamp, uint256 _seconds) internal pure returns (uint256 newTimestamp) {
        newTimestamp = timestamp - _seconds;
        require(newTimestamp <= timestamp);
    }

    function diffYears(uint256 fromTimestamp, uint256 toTimestamp) internal pure returns (uint256 _years) {
        require(fromTimestamp <= toTimestamp);
        (uint256 fromYear,,) = _daysToDate(fromTimestamp / SECONDS_PER_DAY);
        (uint256 toYear,,) = _daysToDate(toTimestamp / SECONDS_PER_DAY);
        _years = toYear - fromYear;
    }

    function diffMonths(uint256 fromTimestamp, uint256 toTimestamp) internal pure returns (uint256 _months) {
        require(fromTimestamp <= toTimestamp);
        (uint256 fromYear, uint256 fromMonth,) = _daysToDate(fromTimestamp / SECONDS_PER_DAY);
        (uint256 toYear, uint256 toMonth,) = _daysToDate(toTimestamp / SECONDS_PER_DAY);
        _months = toYear * 12 + toMonth - fromYear * 12 - fromMonth;
    }

    function diffDays(uint256 fromTimestamp, uint256 toTimestamp) internal pure returns (uint256 _days) {
        require(fromTimestamp <= toTimestamp);
        _days = (toTimestamp - fromTimestamp) / SECONDS_PER_DAY;
    }

    function diffHours(uint256 fromTimestamp, uint256 toTimestamp) internal pure returns (uint256 _hours) {
        require(fromTimestamp <= toTimestamp);
        _hours = (toTimestamp - fromTimestamp) / SECONDS_PER_HOUR;
    }

    function diffMinutes(uint256 fromTimestamp, uint256 toTimestamp) internal pure returns (uint256 _minutes) {
        require(fromTimestamp <= toTimestamp);
        _minutes = (toTimestamp - fromTimestamp) / SECONDS_PER_MINUTE;
    }

    function diffSeconds(uint256 fromTimestamp, uint256 toTimestamp) internal pure returns (uint256 _seconds) {
        require(fromTimestamp <= toTimestamp);
        _seconds = toTimestamp - fromTimestamp;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)

pragma solidity >=0.7.0 <0.9.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
 * consider using {ReentrancyGuardTransient} instead.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;

    uint256 private _status;

    /**
     * @dev Unauthorized reentrant call.
     */
    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be NOT_ENTERED
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        // Any calls to nonReentrant after this point will fail
        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.10;

import {Context} from "./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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(msg.sender);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _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);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;

interface IV2Pair {
    function sync() external;

    function factory() external view returns (address);

    function getReserves()
        external
        view
        returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
}

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;

import "./IRouter01.sol";

interface IRouter02 is IRouter01 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
}

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;

interface IRouter01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    )
        external
        payable
        returns (uint amountToken, uint amountETH, uint liquidity);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function getAmountsOut(
        uint amountIn,
        address[] calldata path
    ) external view returns (uint[] memory amounts);

    function getAmountsIn(
        uint amountOut,
        address[] calldata path
    ) external view returns (uint[] memory amounts);
}

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.9.0;

interface IFactoryV2 {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address lpPair,
        uint
    );

    function getPair(
        address tokenA,
        address tokenB
    ) external view returns (address lpPair);

    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address lpPair);
}

// SPDX-License-Identifier: MIT

pragma solidity >=0.4.22 <0.9.0;

interface IERC20 {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.10;

/**
 * @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;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;

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

contract StakingContract is Ownable , ReentrancyGuard {

    enum Tier{One,Two,Three,Flexible}

    struct Package{
        uint price;
        uint maturityRequirement;
        uint rewardPoolPercent;
        uint count;
    }
    mapping(Tier => Package) public packages;

    struct Staking{
        Tier tier;
        uint id;
        uint lastClaimed;
        uint maturityTimestamp;
        uint stakedAt;
        bool isActive;
        address wallet;
    }

    mapping(uint => Staking) public stakings;
    mapping(address => uint[]) public holdings; 

    struct Collection{
        uint t1;
        uint t2;
        uint t3;
        uint tf;
    }
    mapping(uint =>Collection) internal collections;

    IERC20 public token0;
    address public feeAddress;
    uint public stakingCounter = 0;
    uint public collectionCounter = 0;

    constructor()  {
        packages[Tier.One] = Package({price:20000 ether,maturityRequirement:90 days,rewardPoolPercent:15,count:0});
        packages[Tier.Two] = Package({price:30000 ether,maturityRequirement:180 days,rewardPoolPercent:30,count:0});
        packages[Tier.Three] = Package({price:45000 ether,maturityRequirement:365 days,rewardPoolPercent:50,count:0});
        packages[Tier.Flexible] = Package({price:15000 ether,maturityRequirement:0,rewardPoolPercent:5,count:0});
    }

    event stakingId(uint);

    function setRewardDestributionPercent(uint _t1, uint _t2, uint _t3, uint _tf) public onlyOwner(){
        require(_t1 + _t2+ _t3 + _tf == 100, "total of percents should be 100" );
        packages[Tier.One].rewardPoolPercent = _t1;
        packages[Tier.Two].rewardPoolPercent = _t2;
        packages[Tier.Three].rewardPoolPercent = _t3;
        packages[Tier.Flexible].rewardPoolPercent = _tf;
    }

    function updatePackage(Tier _tier, uint _price, uint _maturityRequirement) public onlyOwner(){
        packages[_tier].price = _price;
        packages[_tier].maturityRequirement = _maturityRequirement;

    }


    function Stake(Tier _tier) public nonReentrant returns(uint _id) {
        require(token0.allowance(msg.sender, address(this))>=packages[_tier].price,"Allowance must be greater than fee amount");
        token0.transferFrom(msg.sender, address(this), packages[_tier].price);
        stakingCounter++;
        packages[_tier].count++;
        stakings[stakingCounter] = Staking({tier:_tier, id:stakingCounter, lastClaimed:collectionCounter,maturityTimestamp: block.timestamp+packages[_tier].maturityRequirement,stakedAt: block.timestamp,isActive: true,wallet:msg.sender});
        holdings[msg.sender].push(stakingCounter);
        emit stakingId(stakingCounter);
        return stakingCounter;
    }

    function calculateReward(uint _id) public view returns (uint reward){
        uint rewardAmount;
        for (uint256 i = stakings[_id].lastClaimed+1; i <= collectionCounter; i++) {
            if (stakings[_id].tier==Tier.One) {
                rewardAmount+=collections[i].t1;
            } else if(stakings[_id].tier==Tier.Two){
                rewardAmount+=collections[i].t2;
            }else if(stakings[_id].tier==Tier.Three){
                rewardAmount+=collections[i].t3;
            }else{
                rewardAmount+=collections[i].tf;
            }
        }
        return rewardAmount;
    }

    function unStake(uint _id) public nonReentrant{
        bool holds = false;
        for (uint i=0; i < holdings[msg.sender].length; i++) {
            if (_id == holdings[msg.sender][i]) {
                // delete holdings[msg.sender][i]; 
                _burn(holdings[msg.sender], i);
                holds = true;
                break;
            }
        }
        require(holds==true, "You are not the owner of this staking");
        require(stakings[_id].isActive==true,"It has already been unstaked");
        require(block.timestamp>=stakings[_id].maturityTimestamp,"Staking is not mature yet");

        stakings[_id].isActive=false;
        _claim(_id);
    }

    function _claim(uint _id) internal{
        uint reward = calculateReward(_id);
        stakings[_id].lastClaimed=collectionCounter;
        token0.transfer(stakings[_id].wallet, reward);
    }

    event amount(uint);
    
    function entryCol(uint _amount) public nonReentrant{
        emit amount(_amount);
        collectionCounter++;
        if (packages[Tier.One].count > 0) {
            collections[collectionCounter].t1=(_amount*packages[Tier.One].rewardPoolPercent/100)/packages[Tier.One].count;
        }
        if (packages[Tier.Two].count > 0) {
            collections[collectionCounter].t2=(_amount*packages[Tier.Two].rewardPoolPercent/100)/packages[Tier.Two].count;
        }
        if(packages[Tier.Three].count > 0) {
            collections[collectionCounter].t3=(_amount*packages[Tier.Three].rewardPoolPercent/100)/packages[Tier.Three].count;
        }
        if(packages[Tier.Flexible].count > 0) {
            collections[collectionCounter].tf=(_amount*packages[Tier.Flexible].rewardPoolPercent/100)/packages[Tier.Flexible].count;
        }
    }  

    function setToken0(address _token0) public onlyOwner{
        require(isContract(_token0),"Token address must be a contract");
        token0 = IERC20(_token0);
    }
    function _burn(uint[] storage array, uint index) internal {
        require(index < array.length);
        array[index] = array[array.length-1];
        array.pop();
    }
    function isContract(address _addr) public view returns (bool){
        uint32 size;
        assembly {
            size := extcodesize(_addr)
        }
        return (size > 0);
    }

}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "byzantium",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_stakingAddress","type":"address"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountCurrency","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"AutoLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"ContractSwapEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MaxTransactionAmountUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pastOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"SwapSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"buy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sell","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transfer","type":"uint256"}],"name":"TaxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pair","type":"address"}],"name":"paircreated","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_hasLiquidityBeenAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxRates","outputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"},{"internalType":"uint256","name":"transferFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"approveContractContingency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"confirmLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractSwapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractSwapTimer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dexRouter","outputs":[{"internalType":"contract IRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributeTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMaxTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountTokens","type":"uint256"}],"name":"initializeLiqudityPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPoolInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyTaxes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTaxes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransferTaxes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"preInitializeTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"preInitializeTransferMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"projectFeePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectFeeWalet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimitADay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setContractSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setLiquidityPoolPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxWalletSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"setNewRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"setPairAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sellLimitADay","type":"uint256"}],"name":"setSellLimitADay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"uint256","name":"thresholdDivisor","type":"uint256"},{"internalType":"uint256","name":"time","type":"uint256"}],"name":"setSwapSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyFee","type":"uint256"},{"internalType":"uint256","name":"sellFee","type":"uint256"},{"internalType":"uint256","name":"transferFee","type":"uint256"}],"name":"setTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"setprojectFeePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_projectFeeWalet","type":"address"}],"name":"setprojectFeeWalet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sold","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"day","type":"uint256"},{"internalType":"uint256","name":"month","type":"uint256"},{"internalType":"uint256","name":"year","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"contract StakingContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sweepContingency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6b033b2e3c9fd0803ce800000060018190556000600381905569021e19e0c9bab240000060045560e06040526101f4608081905260a081905260c0829052600b819055600c55600d556127109062000059906064620002b8565b620000659190620002fd565b60125561271060015460c86200007c9190620002b8565b620000889190620002fd565b6013556014805460ff1916905560006015556017805461ffff191690556018805460a060020a60ff021916905560408051808201909152600c81527f4d65616e6120526170746f7200000000000000000000000000000000000000006020820152601a90620000f8908262000410565b5060408051808201909152600381527f4d525400000000000000000000000000000000000000000000000000000000006020820152601b906200013c908262000410565b50601c805460ff1916601217905560405162003e22388190039081908339810160408190526200016c91620004e3565b60028054600160a060020a031990811633908117909255603c600f55600e8054600160a060020a0385169083161790556010805490911673cec1709fe5d7f48fec3c229a8fc9473ef08014d61790556001546000828152600560205260408082208390555190917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916200020291815260200190565b60405180910390a350601780546201000060b060020a031916757a250d5630b4cf539739df2c5dacb4c659f2488d000017905560028054600160a060020a039081166000908152600860209081526040808320805460ff19908116600190811790925530855282852080548216831790557f046fee3d77c34a6c5e10c3be6dc4b132c30449dbf4f0bc07684896dd09334299805482168317905595549094168352600a9091529020805490921617905562000515565b8082028115828204841417620002f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b92915050565b60008262000334577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6002810460018216806200037d57607f821691505b602082108103620003b7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f8211156200040b576000818152602081206020601f86010481016020861015620003e65750805b6020601f860104820191505b818110156200040757828155600101620003f2565b5050505b505050565b815167ffffffffffffffff8111156200042d576200042d62000339565b62000445816200043e845462000368565b84620003bd565b602080601f831160018114620004815760008415620004645750858301515b60028086026008870290910a600019041982161786555062000407565b600085815260208120601f198616915b82811015620004b25788860151825594840194600190910190840162000491565b5085821015620004d357878501516008601f88160260020a60001904191681555b5050505050600202600101905550565b600060208284031215620004f657600080fd5b8151600160a060020a03811681146200050e57600080fd5b9392505050565b6138fd80620005256000396000f3fe6080604052600436106103735760003560e060020a900480634fbee193116101ca578063b69dc15d116100fb578063e4fcfd1811610099578063ee5d9c2d11610073578063ee5d9c2d14610a25578063f4e0d9ac14610a3a578063fc942c6414610a5a578063fdb78c0e14610a7a57600080fd5b8063e4fcfd18146109cf578063e9dae5ed146109e5578063eafb5a3c14610a0557600080fd5b8063cbf4b23b116100d5578063cbf4b23b1461093f578063d9ceeafc14610955578063dd62ed3e14610974578063e2b2d17c146109ba57600080fd5b8063b69dc15d1461089c578063c9b017d3146108fe578063cab5ebea1461091f57600080fd5b8063893d20e811610168578063a22d483211610142578063a22d48321461085c578063a9059cbb1461087c578063b1b08f71146105b0578063b3d514fb146105b057600080fd5b8063893d20e8146108145780638a63bd9b1461083257806395d89b411461084757600080fd5b80636f51c387116101a45780636f51c387146107b457806370a08231146107ca578063715018a6146107ea578063777c6891146107ff57600080fd5b80634fbee19314610722578063590ffdce1461075b5780635cce86cd1461077b57600080fd5b806323b872dd116102a457806336fddb0411610242578063452ed4f11161021c578063452ed4f1146106a85780634ada218b146106c85780634cf088d9146106e25780634fb2e45d1461070257600080fd5b806336fddb041461064857806337b5af40146106685780633f3cf56c1461068857600080fd5b80632b605d0e1161027e5780632b605d0e146105c65780632cee7602146105e6578063313ce56714610606578063361f81b01461062857600080fd5b806323b872dd1461057057806326003957146105905780632b28fc7a146105b057600080fd5b80630f3d9c9f1161031157806316b176a6116102eb57806316b176a6146104fb57806318160ddd1461051b5780631857476f146105305780631cc43f071461055057600080fd5b80630f3d9c9f146104a85780630fa604e4146104bf57806316279055146104d457600080fd5b8063069d955f1161034d578063069d955f146103f657806306fdde03146104305780630758d92414610452578063095ea7b31461047857600080fd5b806303fd2a451461037f5780630445b667146103b2578063045c75d3146103d657600080fd5b3661037a57005b600080fd5b34801561038b57600080fd5b5061039561dead81565b604051600160a060020a0390911681526020015b60405180910390f35b3480156103be57600080fd5b506103c860165481565b6040519081526020016103a9565b3480156103e257600080fd5b5060105461039590600160a060020a031681565b34801561040257600080fd5b50600b54600c54600d5461041592919083565b604080519384526020840192909252908201526060016103a9565b34801561043c57600080fd5b50610445610a94565b6040516103a99190613228565b34801561045e57600080fd5b5060175461039590620100009004600160a060020a031681565b34801561048457600080fd5b5061049861049336600461328b565b610b26565b60405190151581526020016103a9565b3480156104b457600080fd5b506104bd610b3d565b005b3480156104cb57600080fd5b506103c8610bb6565b3480156104e057600080fd5b506104986104ef3660046132b7565b3b63ffffffff16151590565b34801561050757600080fd5b506104bd6105163660046132d4565b610bdc565b34801561052757600080fd5b506103c8610d71565b34801561053c57600080fd5b506104bd61054b366004613300565b610d89565b34801561055c57600080fd5b506104bd61056b3660046133ef565b61122b565b34801561057c57600080fd5b5061049861058b3660046134ae565b6113cc565b34801561059c57600080fd5b506104bd6105ab3660046134ef565b611444565b3480156105bc57600080fd5b506103c86109c481565b3480156105d257600080fd5b506104bd6105e1366004613300565b611531565b3480156105f257600080fd5b506104bd61060136600461328b565b6115dd565b34801561061257600080fd5b50601c5460405160ff90911681526020016103a9565b34801561063457600080fd5b506104bd610643366004613300565b6116bc565b34801561065457600080fd5b506104bd610663366004613526565b6116ee565b34801561067457600080fd5b506104bd6106833660046132b7565b611746565b34801561069457600080fd5b506104bd6106a33660046134ef565b611795565b3480156106b457600080fd5b5060185461039590600160a060020a031681565b3480156106d457600080fd5b506017546104989060ff1681565b3480156106ee57600080fd5b50600e5461039590600160a060020a031681565b34801561070e57600080fd5b506104bd61071d3660046132b7565b6118b7565b34801561072e57600080fd5b5061049861073d3660046132b7565b600160a060020a031660009081526008602052604090205460ff1690565b34801561076757600080fd5b506104bd610776366004613526565b6119e8565b34801561078757600080fd5b506104986107963660046132b7565b600160a060020a031660009081526009602052604090205460ff1690565b3480156107c057600080fd5b506103c860045481565b3480156107d657600080fd5b506103c86107e53660046132b7565b611a40565b3480156107f657600080fd5b506104bd611a5b565b34801561080b57600080fd5b506103c8611ade565b34801561082057600080fd5b50600254600160a060020a0316610395565b34801561083e57600080fd5b50610498611aff565b34801561085357600080fd5b50610445611b55565b34801561086857600080fd5b506104bd6108773660046132b7565b611b64565b34801561088857600080fd5b5061049861089736600461328b565b611bc5565b3480156108a857600080fd5b506108de6108b73660046132b7565b60196020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016103a9565b34801561090a57600080fd5b506018546104989060a060020a900460ff1681565b34801561092b57600080fd5b506104bd61093a36600461355b565b611bdc565b34801561094b57600080fd5b506103c8600f5481565b34801561096157600080fd5b5060175461049890610100900460ff1681565b34801561098057600080fd5b506103c861098f366004613576565b600160a060020a03918216600090815260076020908152604080832093909416825291909152205490565b3480156109c657600080fd5b506104bd611c51565b3480156109db57600080fd5b506103c860155481565b3480156109f157600080fd5b506104bd610a003660046132d4565b611eaa565b348015610a1157600080fd5b506104bd610a203660046132b7565b611f95565b348015610a3157600080fd5b506104bd612319565b348015610a4657600080fd5b506104bd610a553660046132b7565b612380565b348015610a6657600080fd5b506104bd610a75366004613526565b61244c565b348015610a8657600080fd5b506014546104989060ff1681565b6060601a8054610aa3906135af565b80601f0160208091040260200160405190810160405280929190818152602001828054610acf906135af565b8015610b1c5780601f10610af157610100808354040283529160200191610b1c565b820191906000526020600020905b815481529060010190602001808311610aff57829003601f168201915b5050505050905090565b6000610b3333848461255e565b5060015b92915050565b600254600160a060020a03163314610b735760405160e560020a62461bcd028152600401610b6a906135ec565b60405180910390fd5b42601554601154610b84919061363c565b1015610bb4576000610b9530611a40565b90506016548110610bb25750601654610bad81612671565b426011555b505b565b601c54600090610bca9060ff16600a613736565b601354610bd7919061375e565b905090565b600254600160a060020a03163314610c095760405160e560020a62461bcd028152600401610b6a906135ec565b60008311610c825760405160e560020a62461bcd02815260206004820152602160248201527f5468726573686f6c642068617320746f20626520686967686572207468616e2060448201527f30000000000000000000000000000000000000000000000000000000000000006064820152608401610b6a565b610c8d600a83613772565b158015610c9a5750600082115b610d0f5760405160e560020a62461bcd02815260206004820152603c60248201527f7468726573686f6c6444697669736f722068617320746f20626520686967686560448201527f72207468616e203020616e6420646976697369626c65206279203130000000006064820152608401610b6a565b8183600154610d1e9190613786565b610d28919061375e565b6016819055601582905560408051918252602082018390527fa9c2e33ddea0675d960a3cc03d364783d03ffc4cad71b5fd3b6b32be3b97185791015b60405180910390a1505050565b6000600154600003610d8257600080fd5b5060015490565b600254600160a060020a03163314610db65760405160e560020a62461bcd028152600401610b6a906135ec565b60185460a060020a900460ff1615610e135760405160e560020a62461bcd02815260206004820152601360248201527f416c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610b6a565b3031610e645760405160e560020a62461bcd02815260206004820152601760248201527f436f6e7472616374206d7573742068617665204554482e0000000000000000006044820152606401610b6a565b610e7681670de0b6b3a7640000613786565b610e7f33611a40565b1015610ed05760405160e560020a62461bcd02815260206004820152601e60248201527f596f7520646f206e6f74206861766520656e6f75676820746f6b656e732e00006044820152606401610b6a565b601760029054906101000a9004600160a060020a0316600160a060020a031663c45a01556040518163ffffffff1660e060020a028152600401602060405180830381865afa158015610f26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4a919061379d565b600160a060020a031663c9c65396601760029054906101000a9004600160a060020a0316600160a060020a031663ad5c46486040518163ffffffff1660e060020a028152600401602060405180830381865afa158015610fae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd2919061379d565b60405160e060020a63ffffffff8416028152600160a060020a0390911660048201523060248201526044016020604051808303816000875af115801561101c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611040919061379d565b60188054600160a060020a031916600160a060020a0392909216918217905561106a90600161244c565b601854604051600160a060020a0390911681527fa5473389c26e5a30fadd1c7deabb92185a98ef2c760dff48daa55d5208345eb69060200160405180910390a1601854600160a060020a039081166000908152600660205260409020805460ff191660011790556002546017546110ef9291821691620100009091041660001961255e565b60175461110f903090620100009004600160a060020a031660001961255e565b6018805474ff0000000000000000000000000000000000000000191660a060020a179055601c546111449060ff16600a613736565b61114e9082613786565b905061116233308360008060006001612761565b50601754620100009004600160a060020a031663f305d7193080319061118781611a40565b60025460405163ffffffff861660e060020a028152600160a060020a039384166004820152602481019290925260006044830181905260648301529190911660848201524260a482015260c40160606040518083038185885af11580156111f2573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061121791906137ba565b5050506112233361283a565b610bb261292e565b600254600160a060020a031633146112585760405160e560020a62461bcd028152600401610b6a906135ec565b80518251146112ac5760405160e560020a62461bcd02815260206004820152601360248201527f4163636f756e747320213d20416d6f756e7473000000000000000000000000006044820152606401610b6a565b60005b82518160ff1610156113c757601c546112cc9060ff16600a613736565b828260ff16815181106112e1576112e16137e8565b60200260200101516112f39190613786565b6112fc33611a40565b10156113735760405160e560020a62461bcd02815260206004820152602d60248201527f4163636f756e742068617665206c6f77657220746f6b656e622062616c616e6360448201527f65207468616e206e6565646564000000000000000000000000000000000000006064820152608401610b6a565b6113b5838260ff168151811061138b5761138b6137e8565b6020026020010151838360ff16815181106113a8576113a86137e8565b60200260200101516115dd565b806113bf81613801565b9150506112af565b505050565b600160a060020a03831660009081526007602090815260408083203384529091528120546000191461143157600160a060020a03841660009081526007602090815260408083203384529091528120805484929061142b908490613820565b90915550505b61143c848484612a0e565b949350505050565b600254600160a060020a031633146114715760405160e560020a62461bcd028152600401610b6a906135ec565b6103e8600154611481919061375e565b81836001546114909190613786565b61149a919061375e565b10156115115760405160e560020a62461bcd02815260206004820152603460248201527f4d61782057616c6c657420616d6f756e74206d7573742062652061626f76652060448201527f302e3125206f6620746f74616c20737570706c790000000000000000000000006064820152608401610b6a565b80826001546115209190613786565b61152a919061375e565b6013555050565b600254600160a060020a0316331461155e5760405160e560020a62461bcd028152600401610b6a906135ec565b60648111156115d85760405160e560020a62461bcd02815260206004820152603360248201527f50657263656e7461676520746f74616c206d757374206265206c65737320746860448201527f616e206f7220657175616c7320746f20313030000000000000000000000000006064820152608401610b6a565b600f55565b600254600160a060020a0316331461160a5760405160e560020a62461bcd028152600401610b6a906135ec565b60185460a060020a900460ff161561168d5760405160e560020a62461bcd02815260206004820152602660248201527f4c697175696469747920706f6f6c206d757374206e6f7420626520696e69746960448201527f616c697a656400000000000000000000000000000000000000000000000000006064820152608401610b6a565b601c5461169e9060ff16600a613736565b6116a89082613786565b90506113c733838360008060006001612761565b600254600160a060020a031633146116e95760405160e560020a62461bcd028152600401610b6a906135ec565b600455565b600254600160a060020a0316331461171b5760405160e560020a62461bcd028152600401610b6a906135ec565b600160a060020a03919091166000908152600960205260409020805460ff1916911515919091179055565b600254600160a060020a031633146117735760405160e560020a62461bcd028152600401610b6a906135ec565b60108054600160a060020a031916600160a060020a0392909216919091179055565b600254600160a060020a031633146117c25760405160e560020a62461bcd028152600401610b6a906135ec565b6103e86001546117d2919061375e565b81836001546117e19190613786565b6117eb919061375e565b10156118625760405160e560020a62461bcd02815260206004820152603960248201527f4d6178205472616e73616374696f6e20616d6f756e74206d757374206265206160448201527f626f766520302e3125206f6620746f74616c20737570706c79000000000000006064820152608401610b6a565b80826001546118719190613786565b61187b919061375e565b60128190556040519081527f7c1cb3702d8e1fa6d24b12dd90670ab69c6d66d58233103d37da8b07d6b850ac9060200160405180910390a15050565b600254600160a060020a031633146118e45760405160e560020a62461bcd028152600401610b6a906135ec565b600160a060020a03811661190d5760405160e560020a62461bcd028152600401610b6a90613833565b61deac19600160a060020a0382160161193b5760405160e560020a62461bcd028152600401610b6a90613833565b60025461195290600160a060020a031660006119e8565b61195d8160016119e8565b60025460009061197590600160a060020a0316611a40565b111561199c5760025461199a90600160a060020a03168261199582611a40565b612a0e565b505b60028054600160a060020a031916600160a060020a03831690811790915560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b600254600160a060020a03163314611a155760405160e560020a62461bcd028152600401610b6a906135ec565b600160a060020a03919091166000908152600860205260409020805460ff1916911515919091179055565b600160a060020a031660009081526005602052604090205490565b600254600160a060020a03163314611a885760405160e560020a62461bcd028152600401610b6a906135ec565b600254611a9f90600160a060020a031660006119e8565b60028054600160a060020a031916905560405160009081907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b601c54600090611af29060ff16600a613736565b601254610bd7919061375e565b600254600090600160a060020a03163314611b2f5760405160e560020a62461bcd028152600401610b6a906135ec565b601754611b4f903090620100009004600160a060020a031660001961255e565b50600190565b6060601b8054610aa3906135af565b600254600160a060020a03163314611b915760405160e560020a62461bcd028152600401610b6a906135ec565b600160a060020a038116611bba5760405160e560020a62461bcd028152600401610b6a90613890565b610bb281600161244c565b6000611bd2338484612a0e565b5060019392505050565b600254600160a060020a03163314611c095760405160e560020a62461bcd028152600401610b6a906135ec565b6014805460ff19168215159081179091556040519081527f7b0a47d3b0234280b6c9213c5bbff44c8b6001bea7770b3950280f9141053257906020015b60405180910390a150565b600254600160a060020a03163314611c7e5760405160e560020a62461bcd028152600401610b6a906135ec565b60185460a060020a900460ff1615611cdb5760405160e560020a62461bcd02815260206004820152601360248201527f4c5020616c726561647920696e697469746564000000000000000000000000006044820152606401610b6a565b601760029054906101000a9004600160a060020a0316600160a060020a031663c45a01556040518163ffffffff1660e060020a028152600401602060405180830381865afa158015611d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d55919061379d565b600160a060020a031663e6a4390530601760029054906101000a9004600160a060020a0316600160a060020a031663ad5c46486040518163ffffffff1660e060020a028152600401602060405180830381865afa158015611dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dde919061379d565b60405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381865afa158015611e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4b919061379d565b60188054600160a060020a031916600160a060020a03929092169182179055611e7590600161244c565b6018805474ff0000000000000000000000000000000000000000191660a060020a179055611ea23361283a565b610bb461292e565b600254600160a060020a03163314611ed75760405160e560020a62461bcd028152600401610b6a906135ec565b6109c48311158015611eeb57506109c48211155b8015611ef957506109c48111155b611f485760405160e560020a62461bcd02815260206004820152601560248201527f43616e6e6f7420657863656564206d6178696d756d00000000000000000000006044820152606401610b6a565b600b839055600c829055600d81905560408051848152602081018490529081018290527fad292e707e8a094bdd1cff9ec5263d8e4e538d8e6e457c032a2dbf7174ebec4b90606001610d64565b600254600160a060020a03163314611fc25760405160e560020a62461bcd028152600401610b6a906135ec565b600160a060020a038116611feb5760405160e560020a62461bcd028152600401610b6a90613890565b6000819050600081600160a060020a031663c45a01556040518163ffffffff1660e060020a028152600401602060405180830381865afa158015612033573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612057919061379d565b600160a060020a031663e6a439053084600160a060020a031663ad5c46486040518163ffffffff1660e060020a028152600401602060405180830381865afa1580156120a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cb919061379d565b60405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381865afa158015612114573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612138919061379d565b9050600160a060020a0381166122b55781600160a060020a031663c45a01556040518163ffffffff1660e060020a028152600401602060405180830381865afa158015612189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ad919061379d565b600160a060020a031663c9c653963084600160a060020a031663ad5c46486040518163ffffffff1660e060020a028152600401602060405180830381865afa1580156121fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612221919061379d565b60405160e060020a63ffffffff8516028152600160a060020a039283166004820152911660248201526044016020604051808303816000875af115801561226c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612290919061379d565b60188054600160a060020a031916600160a060020a03929092169190911790556122d1565b60188054600160a060020a031916600160a060020a0383161790555b6017805475ffffffffffffffffffffffffffffffffffffffff0000191662010000600160a060020a03858116820292909217928390556113c79230929190041660001961255e565b600254600160a060020a031633146123465760405160e560020a62461bcd028152600401610b6a906135ec565b600254604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610bb2573d6000803e3d6000fd5b600254600160a060020a031633146123ad5760405160e560020a62461bcd028152600401610b6a906135ec565b803b63ffffffff1661242a5760405160e560020a62461bcd02815260206004820152602260248201527f5374616b696e672061646472657373206d757374206265206120636f6e74726160448201527f63740000000000000000000000000000000000000000000000000000000000006064820152608401610b6a565b600e8054600160a060020a031916600160a060020a0392909216919091179055565b600254600160a060020a031633146124795760405160e560020a62461bcd028152600401610b6a906135ec565b600160a060020a0382166124a25760405160e560020a62461bcd028152600401610b6a90613890565b806124c95750600160a060020a03166000908152600660205260409020805460ff19169055565b60035415612533576203f480600354426124e39190613820565b116125335760405160e560020a62461bcd02815260206004820152601060248201527f332044617920636f6f6c646f776e2e21000000000000000000000000000000006044820152606401610b6a565b600160a060020a0382166000908152600660205260409020805460ff19166001179055426003555050565b600160a060020a0383166125b75760405160e560020a62461bcd02815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401610b6a565b600160a060020a0382166126105760405160e560020a62461bcd02815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401610b6a565b600160a060020a0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000805460ff19166001178155600f5460649061268e9084613786565b612698919061375e565b905060006126a68284613820565b6002549091506126c1903090600160a060020a031684612a0e565b50600e546126da903090600160a060020a031683612a0e565b50600e546040517fd6b3113500000000000000000000000000000000000000000000000000000000815260048101839052600160a060020a039091169063d6b3113590602401600060405180830381600087803b15801561273a57600080fd5b505af115801561274e573d6000803e3d6000fd5b50506000805460ff191690555050505050565b600160a060020a03871660009081526005602052604081208054879190839061278b908490613820565b90915550600090508561279e57866127aa565b6127aa8986868a612fd9565b600160a060020a0389166000908152600560205260408120805492935083929091906127d790849061363c565b9250508190555087600160a060020a031689600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161282391815260200190565b60405180910390a350600198975050505050505050565b601754610100900460ff16156128bb5760405160e560020a62461bcd02815260206004820152602260248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610b6a565b600160a060020a0381166000908152600a6020908152604091829020805460ff1990811660019081179092556017805461ff001916610100179055601480549091168217905591519182527f7b0a47d3b0234280b6c9213c5bbff44c8b6001bea7770b3950280f91410532579101611c46565b60175460ff16156129845760405160e560020a62461bcd02815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642100000000000000006044820152606401610b6a565b601754610100900460ff166129de5760405160e560020a62461bcd02815260206004820152601760248201527f4c6971756964697479206d7573742062652061646465640000000000000000006044820152606401610b6a565b6017805460ff19166001908117909155805462989680916129ff9190613786565b612a09919061375e565b601655565b6000600160a060020a038416612a8f5760405160e560020a62461bcd02815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610b6a565b600160a060020a038316612b0e5760405160e560020a62461bcd02815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610b6a565b60008211612b875760405160e560020a62461bcd02815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610b6a565b600160a060020a0384166000908152600660205260408120548190819060ff1615612bb55760019250612be3565b600160a060020a03861660009081526006602052604090205460ff1615612bdf5760019150612be3565b5060015b612bed8787613096565b15612dec578280612bfb5750815b15612d175760175460ff16612c555760405160e560020a62461bcd02815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610b6a565b600160a060020a03871660009081526009602052604090205460ff16158015612c975750600160a060020a03861660009081526009602052604090205460ff16155b15612d1757601254851115612d175760405160e560020a62461bcd02815260206004820152603060248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201527f72616e73616374696f6e416d6f756e74000000000000000000000000000000006064820152608401610b6a565b601754600160a060020a03878116620100009092041614801590612d39575081155b15612dec57600160a060020a03861660009081526009602052604090205460ff16612dec5760135485612d6b88611a40565b612d75919061363c565b1115612dec5760405160e560020a62461bcd02815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201527f616c6c657453697a652e000000000000000000000000000000000000000000006064820152608401610b6a565b600160a060020a03871660009081526008602052604090205460019060ff1680612e2e5750600160a060020a03871660009081526008602052604090205460ff165b15612e37575060005b8215612fba5760005460ff16158015612e52575060145460ff165b15612fba576000612e6230611a40565b90506016548110612fb8576000806000612e7b4261316d565b33600090815260196020526040902060010154929550909350915081148015612eb557503360009081526019602052604090206002015482145b8015612ed257503360009081526019602052604090206003015483145b15612f705760045433600090815260196020526040902054612ef5908c9061363c565b1115612f465760405160e560020a62461bcd02815260206004820152601d60248201527f65786365656465642073656c6c206c696d697420666f7220746f6461790000006044820152606401610b6a565b33600090815260196020526040812080548c9290612f6590849061363c565b90915550612f839050565b3360009081526019602052604090208a90555b33600090815260196020526040902060018101829055600281018390556003018390556016549350612fb484612671565b5050505b505b42601155612fcd88888884888888612761565b98975050505050505050565b6000808415612feb5750600b54612fff565b8315612ffa5750600c54612fff565b50600d545b600061271061300e8386613786565b613018919061375e565b3060009081526005602052604081208054929350839290919061303c90849061363c565b90915550506040518181523090600160a060020a038916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361308b8185613820565b979650505050505050565b600254600090600160a060020a038481169116148015906130c55750600254600160a060020a03838116911614155b80156130dc5750600254600160a060020a03163214155b80156131015750600160a060020a0382166000908152600a602052604090205460ff16155b80156131265750600160a060020a0383166000908152600a602052604090205460ff16155b801561313d5750600160a060020a03821661dead14155b80156131515750600160a060020a03821615155b80156131665750600160a060020a0383163014155b9392505050565b6000808061317f62015180850461318c565b9196909550909350915050565b60008080836226496581018262023ab1600483020590506004600362023ab18302010590910390600062164b09610fa0600185010205905060046105b58202058303601f019250600061098f84605002816131e9576131e9613745565b0590506000605061098f83020585039050600b820560301994909401606402929092018301996002600c90940290910392909201975095509350505050565b600060208083528351808285015260005b8181101561325557858101830151858201604001528201613239565b506000604082860101526040601f19601f8301168501019250505092915050565b600160a060020a0381168114610bb257600080fd5b6000806040838503121561329e57600080fd5b82356132a981613276565b946020939093013593505050565b6000602082840312156132c957600080fd5b813561316681613276565b6000806000606084860312156132e957600080fd5b505081359360208301359350604090920135919050565b60006020828403121561331257600080fd5b5035919050565b60e060020a634e487b7102600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561335b5761335b613319565b604052919050565b600067ffffffffffffffff82111561337d5761337d613319565b5060209081020190565b600082601f83011261339857600080fd5b813560206133ad6133a883613363565b613332565b828152918102840181019181810190868411156133c957600080fd5b8286015b848110156133e457803583529183019183016133cd565b509695505050505050565b6000806040838503121561340257600080fd5b823567ffffffffffffffff8082111561341a57600080fd5b818501915085601f83011261342e57600080fd5b8135602061343e6133a883613363565b8281529181028401810191818101908984111561345a57600080fd5b948201945b8386101561348157853561347281613276565b8252948201949082019061345f565b9650508601359250508082111561349757600080fd5b506134a485828601613387565b9150509250929050565b6000806000606084860312156134c357600080fd5b83356134ce81613276565b925060208401356134de81613276565b929592945050506040919091013590565b6000806040838503121561350257600080fd5b50508035926020909101359150565b8035801515811461352157600080fd5b919050565b6000806040838503121561353957600080fd5b823561354481613276565b915061355260208401613511565b90509250929050565b60006020828403121561356d57600080fd5b61316682613511565b6000806040838503121561358957600080fd5b823561359481613276565b915060208301356135a481613276565b809150509250929050565b6002810460018216806135c357607f821691505b6020821081036135e65760e060020a634e487b7102600052602260045260246000fd5b50919050565b60208082526018908201527f43616c6c6572206d75737420626520746865206f776e65720000000000000000604082015260600190565b60e060020a634e487b7102600052601160045260246000fd5b80820180821115610b3757610b37613623565b600181815b8085111561368c57816000190482111561367057613670613623565b8085161561367d57918102915b60029094049390800290613654565b509250929050565b6000826136a357506001610b37565b816136b057506000610b37565b81600181146136c657600281146136d0576136ed565b6001915050610b37565b60ff8411156136e1576136e1613623565b8360020a915050610b37565b5060208310610133831016604e8410600b8410161715613710575081810a610b37565b61371a838361364f565b806000190482111561372e5761372e613623565b029392505050565b600061316660ff841683613694565b60e060020a634e487b7102600052601260045260246000fd5b60008261376d5761376d613745565b500490565b60008261378157613781613745565b500690565b8082028115828204841417610b3757610b37613623565b6000602082840312156137af57600080fd5b815161316681613276565b6000806000606084860312156137cf57600080fd5b8351925060208401519150604084015190509250925092565b60e060020a634e487b7102600052603260045260246000fd5b600060ff821660ff810361381757613817613623565b60010192915050565b81810381811115610b3757610b37613623565b6020808252603c908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f206164647265737300000000606082015260800190565b6020808252600f908201527f496e76616c69642061646472657373000000000000000000000000000000000060408201526060019056fea2646970667358221220861e2d67d83f19dfcf0c1387249924254bcefe76b086b966dacdd9464517ea1e64736f6c63430008130033000000000000000000000000b7c0f23542a87e7e5a3978249f7ec5c3ef431cb6

Deployed Bytecode

0x6080604052600436106103735760003560e060020a900480634fbee193116101ca578063b69dc15d116100fb578063e4fcfd1811610099578063ee5d9c2d11610073578063ee5d9c2d14610a25578063f4e0d9ac14610a3a578063fc942c6414610a5a578063fdb78c0e14610a7a57600080fd5b8063e4fcfd18146109cf578063e9dae5ed146109e5578063eafb5a3c14610a0557600080fd5b8063cbf4b23b116100d5578063cbf4b23b1461093f578063d9ceeafc14610955578063dd62ed3e14610974578063e2b2d17c146109ba57600080fd5b8063b69dc15d1461089c578063c9b017d3146108fe578063cab5ebea1461091f57600080fd5b8063893d20e811610168578063a22d483211610142578063a22d48321461085c578063a9059cbb1461087c578063b1b08f71146105b0578063b3d514fb146105b057600080fd5b8063893d20e8146108145780638a63bd9b1461083257806395d89b411461084757600080fd5b80636f51c387116101a45780636f51c387146107b457806370a08231146107ca578063715018a6146107ea578063777c6891146107ff57600080fd5b80634fbee19314610722578063590ffdce1461075b5780635cce86cd1461077b57600080fd5b806323b872dd116102a457806336fddb0411610242578063452ed4f11161021c578063452ed4f1146106a85780634ada218b146106c85780634cf088d9146106e25780634fb2e45d1461070257600080fd5b806336fddb041461064857806337b5af40146106685780633f3cf56c1461068857600080fd5b80632b605d0e1161027e5780632b605d0e146105c65780632cee7602146105e6578063313ce56714610606578063361f81b01461062857600080fd5b806323b872dd1461057057806326003957146105905780632b28fc7a146105b057600080fd5b80630f3d9c9f1161031157806316b176a6116102eb57806316b176a6146104fb57806318160ddd1461051b5780631857476f146105305780631cc43f071461055057600080fd5b80630f3d9c9f146104a85780630fa604e4146104bf57806316279055146104d457600080fd5b8063069d955f1161034d578063069d955f146103f657806306fdde03146104305780630758d92414610452578063095ea7b31461047857600080fd5b806303fd2a451461037f5780630445b667146103b2578063045c75d3146103d657600080fd5b3661037a57005b600080fd5b34801561038b57600080fd5b5061039561dead81565b604051600160a060020a0390911681526020015b60405180910390f35b3480156103be57600080fd5b506103c860165481565b6040519081526020016103a9565b3480156103e257600080fd5b5060105461039590600160a060020a031681565b34801561040257600080fd5b50600b54600c54600d5461041592919083565b604080519384526020840192909252908201526060016103a9565b34801561043c57600080fd5b50610445610a94565b6040516103a99190613228565b34801561045e57600080fd5b5060175461039590620100009004600160a060020a031681565b34801561048457600080fd5b5061049861049336600461328b565b610b26565b60405190151581526020016103a9565b3480156104b457600080fd5b506104bd610b3d565b005b3480156104cb57600080fd5b506103c8610bb6565b3480156104e057600080fd5b506104986104ef3660046132b7565b3b63ffffffff16151590565b34801561050757600080fd5b506104bd6105163660046132d4565b610bdc565b34801561052757600080fd5b506103c8610d71565b34801561053c57600080fd5b506104bd61054b366004613300565b610d89565b34801561055c57600080fd5b506104bd61056b3660046133ef565b61122b565b34801561057c57600080fd5b5061049861058b3660046134ae565b6113cc565b34801561059c57600080fd5b506104bd6105ab3660046134ef565b611444565b3480156105bc57600080fd5b506103c86109c481565b3480156105d257600080fd5b506104bd6105e1366004613300565b611531565b3480156105f257600080fd5b506104bd61060136600461328b565b6115dd565b34801561061257600080fd5b50601c5460405160ff90911681526020016103a9565b34801561063457600080fd5b506104bd610643366004613300565b6116bc565b34801561065457600080fd5b506104bd610663366004613526565b6116ee565b34801561067457600080fd5b506104bd6106833660046132b7565b611746565b34801561069457600080fd5b506104bd6106a33660046134ef565b611795565b3480156106b457600080fd5b5060185461039590600160a060020a031681565b3480156106d457600080fd5b506017546104989060ff1681565b3480156106ee57600080fd5b50600e5461039590600160a060020a031681565b34801561070e57600080fd5b506104bd61071d3660046132b7565b6118b7565b34801561072e57600080fd5b5061049861073d3660046132b7565b600160a060020a031660009081526008602052604090205460ff1690565b34801561076757600080fd5b506104bd610776366004613526565b6119e8565b34801561078757600080fd5b506104986107963660046132b7565b600160a060020a031660009081526009602052604090205460ff1690565b3480156107c057600080fd5b506103c860045481565b3480156107d657600080fd5b506103c86107e53660046132b7565b611a40565b3480156107f657600080fd5b506104bd611a5b565b34801561080b57600080fd5b506103c8611ade565b34801561082057600080fd5b50600254600160a060020a0316610395565b34801561083e57600080fd5b50610498611aff565b34801561085357600080fd5b50610445611b55565b34801561086857600080fd5b506104bd6108773660046132b7565b611b64565b34801561088857600080fd5b5061049861089736600461328b565b611bc5565b3480156108a857600080fd5b506108de6108b73660046132b7565b60196020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016103a9565b34801561090a57600080fd5b506018546104989060a060020a900460ff1681565b34801561092b57600080fd5b506104bd61093a36600461355b565b611bdc565b34801561094b57600080fd5b506103c8600f5481565b34801561096157600080fd5b5060175461049890610100900460ff1681565b34801561098057600080fd5b506103c861098f366004613576565b600160a060020a03918216600090815260076020908152604080832093909416825291909152205490565b3480156109c657600080fd5b506104bd611c51565b3480156109db57600080fd5b506103c860155481565b3480156109f157600080fd5b506104bd610a003660046132d4565b611eaa565b348015610a1157600080fd5b506104bd610a203660046132b7565b611f95565b348015610a3157600080fd5b506104bd612319565b348015610a4657600080fd5b506104bd610a553660046132b7565b612380565b348015610a6657600080fd5b506104bd610a75366004613526565b61244c565b348015610a8657600080fd5b506014546104989060ff1681565b6060601a8054610aa3906135af565b80601f0160208091040260200160405190810160405280929190818152602001828054610acf906135af565b8015610b1c5780601f10610af157610100808354040283529160200191610b1c565b820191906000526020600020905b815481529060010190602001808311610aff57829003601f168201915b5050505050905090565b6000610b3333848461255e565b5060015b92915050565b600254600160a060020a03163314610b735760405160e560020a62461bcd028152600401610b6a906135ec565b60405180910390fd5b42601554601154610b84919061363c565b1015610bb4576000610b9530611a40565b90506016548110610bb25750601654610bad81612671565b426011555b505b565b601c54600090610bca9060ff16600a613736565b601354610bd7919061375e565b905090565b600254600160a060020a03163314610c095760405160e560020a62461bcd028152600401610b6a906135ec565b60008311610c825760405160e560020a62461bcd02815260206004820152602160248201527f5468726573686f6c642068617320746f20626520686967686572207468616e2060448201527f30000000000000000000000000000000000000000000000000000000000000006064820152608401610b6a565b610c8d600a83613772565b158015610c9a5750600082115b610d0f5760405160e560020a62461bcd02815260206004820152603c60248201527f7468726573686f6c6444697669736f722068617320746f20626520686967686560448201527f72207468616e203020616e6420646976697369626c65206279203130000000006064820152608401610b6a565b8183600154610d1e9190613786565b610d28919061375e565b6016819055601582905560408051918252602082018390527fa9c2e33ddea0675d960a3cc03d364783d03ffc4cad71b5fd3b6b32be3b97185791015b60405180910390a1505050565b6000600154600003610d8257600080fd5b5060015490565b600254600160a060020a03163314610db65760405160e560020a62461bcd028152600401610b6a906135ec565b60185460a060020a900460ff1615610e135760405160e560020a62461bcd02815260206004820152601360248201527f416c726561647920696e697469616c697a6564000000000000000000000000006044820152606401610b6a565b3031610e645760405160e560020a62461bcd02815260206004820152601760248201527f436f6e7472616374206d7573742068617665204554482e0000000000000000006044820152606401610b6a565b610e7681670de0b6b3a7640000613786565b610e7f33611a40565b1015610ed05760405160e560020a62461bcd02815260206004820152601e60248201527f596f7520646f206e6f74206861766520656e6f75676820746f6b656e732e00006044820152606401610b6a565b601760029054906101000a9004600160a060020a0316600160a060020a031663c45a01556040518163ffffffff1660e060020a028152600401602060405180830381865afa158015610f26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4a919061379d565b600160a060020a031663c9c65396601760029054906101000a9004600160a060020a0316600160a060020a031663ad5c46486040518163ffffffff1660e060020a028152600401602060405180830381865afa158015610fae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd2919061379d565b60405160e060020a63ffffffff8416028152600160a060020a0390911660048201523060248201526044016020604051808303816000875af115801561101c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611040919061379d565b60188054600160a060020a031916600160a060020a0392909216918217905561106a90600161244c565b601854604051600160a060020a0390911681527fa5473389c26e5a30fadd1c7deabb92185a98ef2c760dff48daa55d5208345eb69060200160405180910390a1601854600160a060020a039081166000908152600660205260409020805460ff191660011790556002546017546110ef9291821691620100009091041660001961255e565b60175461110f903090620100009004600160a060020a031660001961255e565b6018805474ff0000000000000000000000000000000000000000191660a060020a179055601c546111449060ff16600a613736565b61114e9082613786565b905061116233308360008060006001612761565b50601754620100009004600160a060020a031663f305d7193080319061118781611a40565b60025460405163ffffffff861660e060020a028152600160a060020a039384166004820152602481019290925260006044830181905260648301529190911660848201524260a482015260c40160606040518083038185885af11580156111f2573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061121791906137ba565b5050506112233361283a565b610bb261292e565b600254600160a060020a031633146112585760405160e560020a62461bcd028152600401610b6a906135ec565b80518251146112ac5760405160e560020a62461bcd02815260206004820152601360248201527f4163636f756e747320213d20416d6f756e7473000000000000000000000000006044820152606401610b6a565b60005b82518160ff1610156113c757601c546112cc9060ff16600a613736565b828260ff16815181106112e1576112e16137e8565b60200260200101516112f39190613786565b6112fc33611a40565b10156113735760405160e560020a62461bcd02815260206004820152602d60248201527f4163636f756e742068617665206c6f77657220746f6b656e622062616c616e6360448201527f65207468616e206e6565646564000000000000000000000000000000000000006064820152608401610b6a565b6113b5838260ff168151811061138b5761138b6137e8565b6020026020010151838360ff16815181106113a8576113a86137e8565b60200260200101516115dd565b806113bf81613801565b9150506112af565b505050565b600160a060020a03831660009081526007602090815260408083203384529091528120546000191461143157600160a060020a03841660009081526007602090815260408083203384529091528120805484929061142b908490613820565b90915550505b61143c848484612a0e565b949350505050565b600254600160a060020a031633146114715760405160e560020a62461bcd028152600401610b6a906135ec565b6103e8600154611481919061375e565b81836001546114909190613786565b61149a919061375e565b10156115115760405160e560020a62461bcd02815260206004820152603460248201527f4d61782057616c6c657420616d6f756e74206d7573742062652061626f76652060448201527f302e3125206f6620746f74616c20737570706c790000000000000000000000006064820152608401610b6a565b80826001546115209190613786565b61152a919061375e565b6013555050565b600254600160a060020a0316331461155e5760405160e560020a62461bcd028152600401610b6a906135ec565b60648111156115d85760405160e560020a62461bcd02815260206004820152603360248201527f50657263656e7461676520746f74616c206d757374206265206c65737320746860448201527f616e206f7220657175616c7320746f20313030000000000000000000000000006064820152608401610b6a565b600f55565b600254600160a060020a0316331461160a5760405160e560020a62461bcd028152600401610b6a906135ec565b60185460a060020a900460ff161561168d5760405160e560020a62461bcd02815260206004820152602660248201527f4c697175696469747920706f6f6c206d757374206e6f7420626520696e69746960448201527f616c697a656400000000000000000000000000000000000000000000000000006064820152608401610b6a565b601c5461169e9060ff16600a613736565b6116a89082613786565b90506113c733838360008060006001612761565b600254600160a060020a031633146116e95760405160e560020a62461bcd028152600401610b6a906135ec565b600455565b600254600160a060020a0316331461171b5760405160e560020a62461bcd028152600401610b6a906135ec565b600160a060020a03919091166000908152600960205260409020805460ff1916911515919091179055565b600254600160a060020a031633146117735760405160e560020a62461bcd028152600401610b6a906135ec565b60108054600160a060020a031916600160a060020a0392909216919091179055565b600254600160a060020a031633146117c25760405160e560020a62461bcd028152600401610b6a906135ec565b6103e86001546117d2919061375e565b81836001546117e19190613786565b6117eb919061375e565b10156118625760405160e560020a62461bcd02815260206004820152603960248201527f4d6178205472616e73616374696f6e20616d6f756e74206d757374206265206160448201527f626f766520302e3125206f6620746f74616c20737570706c79000000000000006064820152608401610b6a565b80826001546118719190613786565b61187b919061375e565b60128190556040519081527f7c1cb3702d8e1fa6d24b12dd90670ab69c6d66d58233103d37da8b07d6b850ac9060200160405180910390a15050565b600254600160a060020a031633146118e45760405160e560020a62461bcd028152600401610b6a906135ec565b600160a060020a03811661190d5760405160e560020a62461bcd028152600401610b6a90613833565b61deac19600160a060020a0382160161193b5760405160e560020a62461bcd028152600401610b6a90613833565b60025461195290600160a060020a031660006119e8565b61195d8160016119e8565b60025460009061197590600160a060020a0316611a40565b111561199c5760025461199a90600160a060020a03168261199582611a40565b612a0e565b505b60028054600160a060020a031916600160a060020a03831690811790915560405181907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b600254600160a060020a03163314611a155760405160e560020a62461bcd028152600401610b6a906135ec565b600160a060020a03919091166000908152600860205260409020805460ff1916911515919091179055565b600160a060020a031660009081526005602052604090205490565b600254600160a060020a03163314611a885760405160e560020a62461bcd028152600401610b6a906135ec565b600254611a9f90600160a060020a031660006119e8565b60028054600160a060020a031916905560405160009081907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3565b601c54600090611af29060ff16600a613736565b601254610bd7919061375e565b600254600090600160a060020a03163314611b2f5760405160e560020a62461bcd028152600401610b6a906135ec565b601754611b4f903090620100009004600160a060020a031660001961255e565b50600190565b6060601b8054610aa3906135af565b600254600160a060020a03163314611b915760405160e560020a62461bcd028152600401610b6a906135ec565b600160a060020a038116611bba5760405160e560020a62461bcd028152600401610b6a90613890565b610bb281600161244c565b6000611bd2338484612a0e565b5060019392505050565b600254600160a060020a03163314611c095760405160e560020a62461bcd028152600401610b6a906135ec565b6014805460ff19168215159081179091556040519081527f7b0a47d3b0234280b6c9213c5bbff44c8b6001bea7770b3950280f9141053257906020015b60405180910390a150565b600254600160a060020a03163314611c7e5760405160e560020a62461bcd028152600401610b6a906135ec565b60185460a060020a900460ff1615611cdb5760405160e560020a62461bcd02815260206004820152601360248201527f4c5020616c726561647920696e697469746564000000000000000000000000006044820152606401610b6a565b601760029054906101000a9004600160a060020a0316600160a060020a031663c45a01556040518163ffffffff1660e060020a028152600401602060405180830381865afa158015611d31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d55919061379d565b600160a060020a031663e6a4390530601760029054906101000a9004600160a060020a0316600160a060020a031663ad5c46486040518163ffffffff1660e060020a028152600401602060405180830381865afa158015611dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dde919061379d565b60405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381865afa158015611e27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e4b919061379d565b60188054600160a060020a031916600160a060020a03929092169182179055611e7590600161244c565b6018805474ff0000000000000000000000000000000000000000191660a060020a179055611ea23361283a565b610bb461292e565b600254600160a060020a03163314611ed75760405160e560020a62461bcd028152600401610b6a906135ec565b6109c48311158015611eeb57506109c48211155b8015611ef957506109c48111155b611f485760405160e560020a62461bcd02815260206004820152601560248201527f43616e6e6f7420657863656564206d6178696d756d00000000000000000000006044820152606401610b6a565b600b839055600c829055600d81905560408051848152602081018490529081018290527fad292e707e8a094bdd1cff9ec5263d8e4e538d8e6e457c032a2dbf7174ebec4b90606001610d64565b600254600160a060020a03163314611fc25760405160e560020a62461bcd028152600401610b6a906135ec565b600160a060020a038116611feb5760405160e560020a62461bcd028152600401610b6a90613890565b6000819050600081600160a060020a031663c45a01556040518163ffffffff1660e060020a028152600401602060405180830381865afa158015612033573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612057919061379d565b600160a060020a031663e6a439053084600160a060020a031663ad5c46486040518163ffffffff1660e060020a028152600401602060405180830381865afa1580156120a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120cb919061379d565b60405160e060020a63ffffffff8516028152600160a060020a03928316600482015291166024820152604401602060405180830381865afa158015612114573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612138919061379d565b9050600160a060020a0381166122b55781600160a060020a031663c45a01556040518163ffffffff1660e060020a028152600401602060405180830381865afa158015612189573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ad919061379d565b600160a060020a031663c9c653963084600160a060020a031663ad5c46486040518163ffffffff1660e060020a028152600401602060405180830381865afa1580156121fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612221919061379d565b60405160e060020a63ffffffff8516028152600160a060020a039283166004820152911660248201526044016020604051808303816000875af115801561226c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612290919061379d565b60188054600160a060020a031916600160a060020a03929092169190911790556122d1565b60188054600160a060020a031916600160a060020a0383161790555b6017805475ffffffffffffffffffffffffffffffffffffffff0000191662010000600160a060020a03858116820292909217928390556113c79230929190041660001961255e565b600254600160a060020a031633146123465760405160e560020a62461bcd028152600401610b6a906135ec565b600254604051600160a060020a0390911690303180156108fc02916000818181858888f19350505050158015610bb2573d6000803e3d6000fd5b600254600160a060020a031633146123ad5760405160e560020a62461bcd028152600401610b6a906135ec565b803b63ffffffff1661242a5760405160e560020a62461bcd02815260206004820152602260248201527f5374616b696e672061646472657373206d757374206265206120636f6e74726160448201527f63740000000000000000000000000000000000000000000000000000000000006064820152608401610b6a565b600e8054600160a060020a031916600160a060020a0392909216919091179055565b600254600160a060020a031633146124795760405160e560020a62461bcd028152600401610b6a906135ec565b600160a060020a0382166124a25760405160e560020a62461bcd028152600401610b6a90613890565b806124c95750600160a060020a03166000908152600660205260409020805460ff19169055565b60035415612533576203f480600354426124e39190613820565b116125335760405160e560020a62461bcd02815260206004820152601060248201527f332044617920636f6f6c646f776e2e21000000000000000000000000000000006044820152606401610b6a565b600160a060020a0382166000908152600660205260409020805460ff19166001179055426003555050565b600160a060020a0383166125b75760405160e560020a62461bcd02815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401610b6a565b600160a060020a0382166126105760405160e560020a62461bcd02815260206004820152601360248201527f45524332303a205a65726f2041646472657373000000000000000000000000006044820152606401610b6a565b600160a060020a0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000805460ff19166001178155600f5460649061268e9084613786565b612698919061375e565b905060006126a68284613820565b6002549091506126c1903090600160a060020a031684612a0e565b50600e546126da903090600160a060020a031683612a0e565b50600e546040517fd6b3113500000000000000000000000000000000000000000000000000000000815260048101839052600160a060020a039091169063d6b3113590602401600060405180830381600087803b15801561273a57600080fd5b505af115801561274e573d6000803e3d6000fd5b50506000805460ff191690555050505050565b600160a060020a03871660009081526005602052604081208054879190839061278b908490613820565b90915550600090508561279e57866127aa565b6127aa8986868a612fd9565b600160a060020a0389166000908152600560205260408120805492935083929091906127d790849061363c565b9250508190555087600160a060020a031689600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161282391815260200190565b60405180910390a350600198975050505050505050565b601754610100900460ff16156128bb5760405160e560020a62461bcd02815260206004820152602260248201527f4c697175696469747920616c726561647920616464656420616e64206d61726b60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610b6a565b600160a060020a0381166000908152600a6020908152604091829020805460ff1990811660019081179092556017805461ff001916610100179055601480549091168217905591519182527f7b0a47d3b0234280b6c9213c5bbff44c8b6001bea7770b3950280f91410532579101611c46565b60175460ff16156129845760405160e560020a62461bcd02815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642100000000000000006044820152606401610b6a565b601754610100900460ff166129de5760405160e560020a62461bcd02815260206004820152601760248201527f4c6971756964697479206d7573742062652061646465640000000000000000006044820152606401610b6a565b6017805460ff19166001908117909155805462989680916129ff9190613786565b612a09919061375e565b601655565b6000600160a060020a038416612a8f5760405160e560020a62461bcd02815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610b6a565b600160a060020a038316612b0e5760405160e560020a62461bcd02815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610b6a565b60008211612b875760405160e560020a62461bcd02815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610b6a565b600160a060020a0384166000908152600660205260408120548190819060ff1615612bb55760019250612be3565b600160a060020a03861660009081526006602052604090205460ff1615612bdf5760019150612be3565b5060015b612bed8787613096565b15612dec578280612bfb5750815b15612d175760175460ff16612c555760405160e560020a62461bcd02815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610b6a565b600160a060020a03871660009081526009602052604090205460ff16158015612c975750600160a060020a03861660009081526009602052604090205460ff16155b15612d1757601254851115612d175760405160e560020a62461bcd02815260206004820152603060248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785460448201527f72616e73616374696f6e416d6f756e74000000000000000000000000000000006064820152608401610b6a565b601754600160a060020a03878116620100009092041614801590612d39575081155b15612dec57600160a060020a03861660009081526009602052604090205460ff16612dec5760135485612d6b88611a40565b612d75919061363c565b1115612dec5760405160e560020a62461bcd02815260206004820152602a60248201527f5472616e7366657220616d6f756e74206578636565647320746865206d61785760448201527f616c6c657453697a652e000000000000000000000000000000000000000000006064820152608401610b6a565b600160a060020a03871660009081526008602052604090205460019060ff1680612e2e5750600160a060020a03871660009081526008602052604090205460ff165b15612e37575060005b8215612fba5760005460ff16158015612e52575060145460ff165b15612fba576000612e6230611a40565b90506016548110612fb8576000806000612e7b4261316d565b33600090815260196020526040902060010154929550909350915081148015612eb557503360009081526019602052604090206002015482145b8015612ed257503360009081526019602052604090206003015483145b15612f705760045433600090815260196020526040902054612ef5908c9061363c565b1115612f465760405160e560020a62461bcd02815260206004820152601d60248201527f65786365656465642073656c6c206c696d697420666f7220746f6461790000006044820152606401610b6a565b33600090815260196020526040812080548c9290612f6590849061363c565b90915550612f839050565b3360009081526019602052604090208a90555b33600090815260196020526040902060018101829055600281018390556003018390556016549350612fb484612671565b5050505b505b42601155612fcd88888884888888612761565b98975050505050505050565b6000808415612feb5750600b54612fff565b8315612ffa5750600c54612fff565b50600d545b600061271061300e8386613786565b613018919061375e565b3060009081526005602052604081208054929350839290919061303c90849061363c565b90915550506040518181523090600160a060020a038916907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a361308b8185613820565b979650505050505050565b600254600090600160a060020a038481169116148015906130c55750600254600160a060020a03838116911614155b80156130dc5750600254600160a060020a03163214155b80156131015750600160a060020a0382166000908152600a602052604090205460ff16155b80156131265750600160a060020a0383166000908152600a602052604090205460ff16155b801561313d5750600160a060020a03821661dead14155b80156131515750600160a060020a03821615155b80156131665750600160a060020a0383163014155b9392505050565b6000808061317f62015180850461318c565b9196909550909350915050565b60008080836226496581018262023ab1600483020590506004600362023ab18302010590910390600062164b09610fa0600185010205905060046105b58202058303601f019250600061098f84605002816131e9576131e9613745565b0590506000605061098f83020585039050600b820560301994909401606402929092018301996002600c90940290910392909201975095509350505050565b600060208083528351808285015260005b8181101561325557858101830151858201604001528201613239565b506000604082860101526040601f19601f8301168501019250505092915050565b600160a060020a0381168114610bb257600080fd5b6000806040838503121561329e57600080fd5b82356132a981613276565b946020939093013593505050565b6000602082840312156132c957600080fd5b813561316681613276565b6000806000606084860312156132e957600080fd5b505081359360208301359350604090920135919050565b60006020828403121561331257600080fd5b5035919050565b60e060020a634e487b7102600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561335b5761335b613319565b604052919050565b600067ffffffffffffffff82111561337d5761337d613319565b5060209081020190565b600082601f83011261339857600080fd5b813560206133ad6133a883613363565b613332565b828152918102840181019181810190868411156133c957600080fd5b8286015b848110156133e457803583529183019183016133cd565b509695505050505050565b6000806040838503121561340257600080fd5b823567ffffffffffffffff8082111561341a57600080fd5b818501915085601f83011261342e57600080fd5b8135602061343e6133a883613363565b8281529181028401810191818101908984111561345a57600080fd5b948201945b8386101561348157853561347281613276565b8252948201949082019061345f565b9650508601359250508082111561349757600080fd5b506134a485828601613387565b9150509250929050565b6000806000606084860312156134c357600080fd5b83356134ce81613276565b925060208401356134de81613276565b929592945050506040919091013590565b6000806040838503121561350257600080fd5b50508035926020909101359150565b8035801515811461352157600080fd5b919050565b6000806040838503121561353957600080fd5b823561354481613276565b915061355260208401613511565b90509250929050565b60006020828403121561356d57600080fd5b61316682613511565b6000806040838503121561358957600080fd5b823561359481613276565b915060208301356135a481613276565b809150509250929050565b6002810460018216806135c357607f821691505b6020821081036135e65760e060020a634e487b7102600052602260045260246000fd5b50919050565b60208082526018908201527f43616c6c6572206d75737420626520746865206f776e65720000000000000000604082015260600190565b60e060020a634e487b7102600052601160045260246000fd5b80820180821115610b3757610b37613623565b600181815b8085111561368c57816000190482111561367057613670613623565b8085161561367d57918102915b60029094049390800290613654565b509250929050565b6000826136a357506001610b37565b816136b057506000610b37565b81600181146136c657600281146136d0576136ed565b6001915050610b37565b60ff8411156136e1576136e1613623565b8360020a915050610b37565b5060208310610133831016604e8410600b8410161715613710575081810a610b37565b61371a838361364f565b806000190482111561372e5761372e613623565b029392505050565b600061316660ff841683613694565b60e060020a634e487b7102600052601260045260246000fd5b60008261376d5761376d613745565b500490565b60008261378157613781613745565b500690565b8082028115828204841417610b3757610b37613623565b6000602082840312156137af57600080fd5b815161316681613276565b6000806000606084860312156137cf57600080fd5b8351925060208401519150604084015190509250925092565b60e060020a634e487b7102600052603260045260246000fd5b600060ff821660ff810361381757613817613623565b60010192915050565b81810381811115610b3757610b37613623565b6020808252603c908201527f43616c6c2072656e6f756e63654f776e65727368697020746f207472616e736660408201527f6572206f776e657220746f20746865207a65726f206164647265737300000000606082015260800190565b6020808252600f908201527f496e76616c69642061646472657373000000000000000000000000000000000060408201526060019056fea2646970667358221220861e2d67d83f19dfcf0c1387249924254bcefe76b086b966dacdd9464517ea1e64736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000b7c0f23542a87e7e5a3978249f7ec5c3ef431cb6

-----Decoded View---------------
Arg [0] : _stakingAddress (address): 0xB7c0F23542A87e7E5A3978249F7ec5C3eF431CB6

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b7c0f23542a87e7e5a3978249f7ec5c3ef431cb6


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.