false
true
0

Contract Address Details

0x8eDb13CE75562056DFf2221D193557Fb4A05770D

Token
Make Ethereum Great Again (MEGA)
Creator
0xa74b35–03a288 at 0x980c58–166de8
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
6,911 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
25871107
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
MEGAToken




Optimization enabled
true
Compiler version
v0.8.18+commit.87f61d96




Optimization runs
200
EVM Version
default




Verified at
2023-10-12T23:19:23.397064Z

Constructor Arguments

0x000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d900000000000000000000000002dcdd04e3f455d838cd1249292c58f3b79e3c3c

Arg [0] (address) : 0x165c3410fc91ef562c50559f7d2289febed552d9
Arg [1] (address) : 0x02dcdd04e3f455d838cd1249292c58f3b79e3c3c

              

Contract source code

/**
 * Make Ethereum Great Again
 * 
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
 * ░███╗░░░███╗███████╗░██████╗░░█████╗░░
 * ░████╗░████║██╔════╝██╔════╝░██╔══██╗░
 * ░██╔████╔██║█████╗░░██║░░███╗███████║░
 * ░██║╚██╔╝██║██╔══╝░░██║░░░██║██╔══██║░
 * ░██║░╚═╝░██║███████╗╚██████╔╝██║░░██║░
 * ░╚═╝░░░░░╚═╝╚══════╝░╚═════╝░╚═╝░░╚═╝░
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
 * 
 * Telegram:  https://t.me/PLSMEGA
 * Website:   https://makeethgreatagain.io/
 * Twitter:   https://twitter.com/plsmega89815
 *
 * SPDX-License-Identifier: MIT
 */

pragma solidity =0.8.18;

/**
 * Tokenomics:
 * 
 * Burn           1%
 * Reflection     2%
 * 
 * Total Supply   888,888,888,888,888
 */

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {return msg.sender;}
    function _msgData() internal view virtual returns (bytes calldata) {this; return msg.data;}
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {return a + b;}
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {return a - b;}
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {return a * b;}
    function div(uint256 a, uint256 b) internal pure returns (uint256) {return a / b;}
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {return a % b;}
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked { require(b <= a, errorMessage); return a - b; }
    }
}

library Address {
    function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0;}
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");(bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {return functionCall(target, data, "Address: low-level call failed");}
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {return functionCallWithValue(target, data, 0, errorMessage);}
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {return functionCallWithValue(target, data, value, "Address: low-level call with value failed");}
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) { return returndata; } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {revert(errorMessage);}
        }
    }
}

abstract contract Manageable is Context {
    address private _manager;
    event ManagementTransferred(address indexed previousManager, address indexed newManager);
    constructor(){
        address msgSender = _msgSender();
        _manager = msgSender;
        emit ManagementTransferred(address(0), msgSender);
    }
    function manager() public view returns(address){ return _manager; }
    modifier onlyManager(){
        require(_manager == _msgSender(), "Manageable: caller is not the manager");
        _;
    }
    function transferManagement(address newManager) external virtual onlyManager {
        emit ManagementTransferred(_manager, newManager);
        _manager = newManager;
    }
}

interface IPulseXFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

interface IPulseXRouter {
    function factory() external pure returns (address);
}

abstract contract Tokenomics is Manageable {
    
    using SafeMath for uint256;
    
    // --------------------- Token Settings ------------------- //

    string internal constant NAME = "Make Ethereum Great Again";
    string internal constant SYMBOL = "MEGA";
    
    uint16 internal constant FEES_DIVISOR = 10**3;
    uint8 internal constant DECIMALS = 6;
    uint256 internal constant ZEROES = 10**DECIMALS;
    
    uint256 private constant MAX = ~uint256(0);
    uint256 internal constant TOTAL_SUPPLY = 888_888_888_888_888 * ZEROES;
    uint256 internal _reflectedSupply = (MAX - (MAX % TOTAL_SUPPLY));

    uint256 internal maxTransactionAmount = TOTAL_SUPPLY / 100; // 1% of the total supply
    uint256 internal maxWalletBalance = TOTAL_SUPPLY / 50; // 2% of the total supply
    uint256 internal constant numberOfTokensToSwapToLiquidity = TOTAL_SUPPLY / 1000; // 0.1% of the total supply

    enum FeeType { Burn, Reflection }
    struct Fee {
        FeeType name;
        uint256 value;
        address recipient;
        uint256 total;
    }

    Fee[] internal fees;
    uint256 internal sumOfFees;

    constructor() {
        _addFees();
    }

    function _addFee(FeeType name, uint256 value, address recipient) private {
        fees.push( Fee(name, value, recipient, 0 ) );
        sumOfFees += value;
    }

    function _addFees() private {
        _addFee(FeeType.Reflection, 20, address(this) ); 
        _addFee(FeeType.Burn, 10, address(0) );
    }

    function _getFeesCount() internal view returns (uint256){ return fees.length; }

    function _getFeeStruct(uint256 index) private view returns(Fee storage){
        require( index >= 0 && index < fees.length, "FeesSettings._getFeeStruct: Fee index out of bounds");
        return fees[index];
    }
    function _getFee(uint256 index) internal view returns (FeeType, uint256, address, uint256){
        Fee memory fee = _getFeeStruct(index);
        return ( fee.name, fee.value, fee.recipient, fee.total );
    }
    function _addFeeCollectedAmount(uint256 index, uint256 amount) internal {
        Fee storage fee = _getFeeStruct(index);
        fee.total = fee.total.add(amount);
    }

    function getCollectedFeeTotal(uint256 index) external view returns (uint256){
        Fee memory fee = _getFeeStruct(index);
        return fee.total;
    }

    function removeWalletLimits() external onlyManager() {
        maxTransactionAmount = TOTAL_SUPPLY; 
        maxWalletBalance = 0; // Unlimited Max
    }
}

abstract contract Reflector is IERC20, IERC20Metadata, Manageable, Tokenomics {

    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) internal _reflectedBalances;
    mapping (address => uint256) internal _balances;
    mapping (address => mapping (address => uint256)) internal _allowances;
    
    mapping (address => bool) internal _isExcludedFromFee;
    mapping (address => bool) internal _isExcludedFromRewards;
    address[] private _excluded;
    
    constructor(){
        
        _reflectedBalances[manager()] = _reflectedSupply;
        
        // exclude owner and this contract from fee
        _isExcludedFromFee[manager()] = true;
        _isExcludedFromFee[address(this)] = true;
        
        // exclude the owner and this contract from rewards
        _exclude(manager());
        _exclude(address(this));

        emit Transfer(address(0), manager(), TOTAL_SUPPLY);
        
    }
    
    /** Functions required by IERC20Metadat **/
        function name() external pure override returns (string memory) { return NAME; }
        function symbol() external pure override returns (string memory) { return SYMBOL; }
        function decimals() external pure override returns (uint8) { return DECIMALS; }
        
    /** Functions required by IERC20Metadat - END **/
    /** Functions required by IERC20 **/
        function totalSupply() external pure override returns (uint256) {
            return TOTAL_SUPPLY;
        }
        
        function balanceOf(address account) public view override returns (uint256){
            if (_isExcludedFromRewards[account]) return _balances[account];
            return tokenFromReflection(_reflectedBalances[account]);
        }
        
        function transfer(address recipient, uint256 amount) external override returns (bool){
            _transfer(_msgSender(), recipient, amount);
            return true;
        }
        
        function allowance(address owner, address spender) external view override returns (uint256){
            return _allowances[owner][spender];
        }
    
        function approve(address spender, uint256 amount) external override returns (bool) {
            _approve(_msgSender(), spender, amount);
            return true;
        }
        
        function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool){
            _transfer(sender, recipient, amount);
            _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
            return true;
        }
    /** Functions required by IERC20 - END **/

    /**
     * @dev this is really a "soft" burn (total supply is not reduced). RFI holders
     * get two benefits from burning tokens:
     *
     * 1) Tokens in the burn address increase the % of tokens held by holders not
     *    excluded from rewards (assuming the burn address is excluded)
     * 2) Tokens in the burn address cannot be sold (which in turn draing the 
     *    liquidity pool)
     *
     *
     * In RFI holders already get % of each transaction so the value of their tokens 
     * increases (in a way). Therefore there is really no need to do a "hard" burn 
     * (reduce the total supply). What matters (in RFI) is to make sure that a large
     * amount of tokens cannot be sold = draining the liquidity pool = lowering the
     * value of tokens holders own. For this purpose, transfering tokens to a (vanity)
     * burn address is the most appropriate way to "burn". 
     *
     * There is an extra check placed into the `transfer` function to make sure the
     * burn address cannot withdraw the tokens is has (although the chance of someone
     * having/finding the private key is virtually zero).
     */
    function burn(uint256 amount) external {

        address sender = _msgSender();
        require(sender != address(0), "Reflector: burn from the zero address");

        uint256 balance = balanceOf(sender);
        require(balance >= amount, "Reflector: burn amount exceeds balance");

        uint256 reflectedAmount = amount.mul(_getCurrentRate());

        // remove the amount from the sender's balance first
        _reflectedBalances[sender] = _reflectedBalances[sender].sub(reflectedAmount);
        if (_isExcludedFromRewards[sender])
            _balances[sender] = _balances[sender].sub(amount);

        _burnTokens( sender, amount, reflectedAmount );
    }
    
    /**
     * @dev "Soft" burns the specified amount of tokens by sending them 
     * to the burn address
     */
    function _burnTokens(address sender, uint256 tBurn, uint256 rBurn) internal {

        /**
         * @dev Do not reduce _totalSupply and/or _reflectedSupply. (soft) burning by sending
         * tokens to the burn address (which should be excluded from rewards) is sufficient
         * in RFI
         */ 
        _reflectedBalances[address(0)] = _reflectedBalances[address(0)].add(rBurn);
        if (_isExcludedFromRewards[address(0)])
            _balances[address(0)] = _balances[address(0)].add(tBurn);

        /**
         * @dev Emit the event so that the burn address balance is updated (on bscscan)
         */
        emit Transfer(sender, address(0), tBurn);
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }
    
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }
    
    function isExcludedFromReward(address account) external view returns (bool) {
        return _isExcludedFromRewards[account];
    }

    /**
     * @dev Calculates and returns the reflected amount for the given amount with or without 
     * the transfer fees (deductTransferFee true/false)
     */
    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) external view returns(uint256) {
        require(tAmount <= TOTAL_SUPPLY, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,) = _getValues(tAmount,0);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,) = _getValues(tAmount,_getSumOfFees(_msgSender(), tAmount));
            return rTransferAmount;
        }
    }

    /**
     * @dev Calculates and returns the amount of tokens corresponding to the given reflected amount.
     */
    function tokenFromReflection(uint256 rAmount) internal view returns(uint256) {
        require(rAmount <= _reflectedSupply, "Amount must be less than total reflections");
        uint256 currentRate = _getCurrentRate();
        return rAmount.div(currentRate);
    }
    
    function excludeFromReward(address account) external onlyManager() {
        require(!_isExcludedFromRewards[account], "Account is not included");
        _exclude(account);
    }
    
    function _exclude(address account) internal {
        if(_reflectedBalances[account] > 0) {
            _balances[account] = tokenFromReflection(_reflectedBalances[account]);
        }
        _isExcludedFromRewards[account] = true;
        _excluded.push(account);
    }

    function includeInReward(address account) external onlyManager() {
        require(_isExcludedFromRewards[account], "Account is not excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _balances[account] = 0;
                _isExcludedFromRewards[account] = false;
                _excluded.pop();
                break;
            }
        }
    }
    
    function setExcludedFromFee(address account, bool value) external onlyManager { _isExcludedFromFee[account] = value; }
    function isExcludedFromFee(address account) public view returns(bool) { return _isExcludedFromFee[account]; }
    
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "Reflector: approve from the zero address");
        require(spender != address(0), "Reflector: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    
    /**
     */
    function _isUnlimitedSender(address account) internal view returns(bool){
        // the owner should be the only whitelisted sender
        return (account == manager());
    }
    /**
     */
    function _isUnlimitedRecipient(address account) internal view returns(bool){
        // the owner should be a white-listed recipient
        // and anyone should be able to burn as many tokens as 
        // he/she wants
        return (account == manager() || account == address(0));
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "Reflector: transfer from the zero address");
        require(recipient != address(0), "Reflector: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        
        // indicates whether or not feee should be deducted from the transfer
        bool takeFee = true;

        /**
        * Check the amount is within the max allowed limit as long as a
        * unlimited sender/recepient is not involved in the transaction
        */
        if ( amount > maxTransactionAmount && !_isUnlimitedSender(sender) && !_isUnlimitedRecipient(recipient) ){
            revert("Transfer amount exceeds the maxTxAmount.");
        }
        /**
        * The pair needs to excluded from the max wallet balance check; 
        * selling tokens is sending them back to the pair (without this
        * check, selling tokens would not work if the pair's balance 
        * was over the allowed max)
        *
        * Note: This does NOT take into account the fees which will be deducted 
        *       from the amount. As such it could be a bit confusing 
        */
        if ( maxWalletBalance > 0 && !_isUnlimitedSender(sender) && !_isUnlimitedRecipient(recipient) && !_isV2Pair(recipient) ){
            uint256 recipientBalance = balanceOf(recipient);
            require(recipientBalance + amount <= maxWalletBalance, "New balance would exceed the maxWalletBalance");
        }

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]){ takeFee = false; }

        _beforeTokenTransfer(sender, recipient, amount, takeFee);
        _transferTokens(sender, recipient, amount, takeFee);
        _afterTokenTransfer(sender, recipient, amount);
        
    }

    function _transferTokens(address sender, address recipient, uint256 amount, bool takeFee) private {
    
        /**
         * We don't need to know anything about the individual fees here 
         * All that is required for the transfer is the sum of all fees 
         * to calculate the % of the total transaction amount which should
         * be transferred to the recipient. 
         *
         * The `_takeFees` call will/should take care of the individual fees
         */
        uint256 sumOfFees = _getSumOfFees(sender, amount);
        if ( !takeFee ){ sumOfFees = 0; }
        
        (uint256 rAmount, uint256 rTransferAmount, uint256 tAmount, uint256 tTransferAmount, uint256 currentRate ) = _getValues(amount, sumOfFees);
        
        /** 
         * Sender's and Recipient's reflected balances must be always updated regardless of
         * whether they are excluded from rewards or not.
         */ 
        _reflectedBalances[sender] = _reflectedBalances[sender].sub(rAmount);
        _reflectedBalances[recipient] = _reflectedBalances[recipient].add(rTransferAmount);

        /**
         * Update the true/nominal balances for excluded accounts
         */        
        if (_isExcludedFromRewards[sender]){ _balances[sender] = _balances[sender].sub(tAmount); }
        if (_isExcludedFromRewards[recipient] ){ _balances[recipient] = _balances[recipient].add(tTransferAmount); }
        
        _takeFees( amount, currentRate, sumOfFees );
        emit Transfer(sender, recipient, tTransferAmount);
    }
    
    function _takeFees(uint256 amount, uint256 currentRate, uint256 sumOfFees ) private {
        if ( sumOfFees > 0 ){
            _takeTransactionFees(amount, currentRate);
        }
    }
    
    function _getValues(uint256 tAmount, uint256 feesSum) internal view returns (uint256, uint256, uint256, uint256, uint256) {
        
        uint256 tTotalFees = tAmount.mul(feesSum).div(FEES_DIVISOR);
        uint256 tTransferAmount = tAmount.sub(tTotalFees);
        uint256 currentRate = _getCurrentRate();
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rTotalFees = tTotalFees.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rTotalFees);
        
        return (rAmount, rTransferAmount, tAmount, tTransferAmount, currentRate);
    }
    
    function _getCurrentRate() internal view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }
    
    function _getCurrentSupply() internal view returns(uint256, uint256) {
        uint256 rSupply = _reflectedSupply;
        uint256 tSupply = TOTAL_SUPPLY;  

        /**
         * The code below removes balances of addresses excluded from rewards from
         * rSupply and tSupply, which effectively increases the % of transaction fees
         * delivered to non-excluded holders
         */    
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_reflectedBalances[_excluded[i]] > rSupply || _balances[_excluded[i]] > tSupply) return (_reflectedSupply, TOTAL_SUPPLY);
            rSupply = rSupply.sub(_reflectedBalances[_excluded[i]]);
            tSupply = tSupply.sub(_balances[_excluded[i]]);
        }
        if (tSupply == 0 || rSupply < _reflectedSupply.div(TOTAL_SUPPLY)) return (_reflectedSupply, TOTAL_SUPPLY);
        return (rSupply, tSupply);
    }
    
    /**
     * @dev Hook that is called before any transfer of tokens.
     */
    function _beforeTokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) internal virtual;

    /**
     * @dev Hook that is called after any transfer of tokens.
     */
    function _afterTokenTransfer(address sender, address recipient, uint256 amount) internal virtual;
    
    /**
     * @dev Returns the total sum of fees to be processed in each transaction. 
     * 
     * To separate concerns this contract (class) will take care of ONLY handling RFI, i.e. 
     * changing the rates and updating the holder's balance (via `_redistribute`). 
     * It is the responsibility of the dev/user to handle all other fees and taxes 
     * in the appropriate contracts (classes).
     */ 
    function _getSumOfFees(address sender, uint256 amount) internal view virtual returns (uint256);

    /**
     * @dev A delegate which should return true if the given address is the V2 Pair and false otherwise
     */
    function _isV2Pair(address account) internal view virtual returns(bool);

    /**
     * @dev Redistributes the specified amount among the current holders via the reflect.finance
     * algorithm, i.e. by updating the _reflectedSupply (_rSupply) which ultimately adjusts the
     * current rate used by `tokenFromReflection` and, in turn, the value returns from `balanceOf`. 
     * This is the bit of clever math which allows rfi to redistribute the fee without 
     * having to iterate through all holders. 
     * 
     * Visit our discord at https://discord.gg/dAmr6eUTpM
     */
    function _redistribute(uint256 amount, uint256 currentRate, uint256 fee, uint256 index) internal {
        uint256 tFee = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rFee = tFee.mul(currentRate);

        _reflectedSupply = _reflectedSupply.sub(rFee);
        _addFeeCollectedAmount(index, tFee);
    }

    /**
     * @dev Hook that is called before the `Transfer` event is emitted if fees are enabled for the transfer
     */
    function _takeTransactionFees(uint256 amount, uint256 currentRate) internal virtual;
}

abstract contract MEVProtection is Manageable {

    using SafeMath for uint256;

    // This is a map of addresses to times and is triggered on every transfer.
	mapping(address => uint32) internal _transferTime;
	// Some addresses should never have a time restriction, such as exchange addresses. Those can be added here.
	mapping(address => bool) internal _transferTimeWhitelist;
    address[] private _whitelisted;

    bool private MEVProtectionEnabled = true;

    event MEVProtectionEnabledUpdated(bool enabled);

    /**
     * @dev Sends the swap and liquify flag to the provided value. If set to `false` tokens collected in the contract will
     * NOT be converted into liquidity.
     */
    function setMEVProtectionEnabled(bool enabled) external onlyManager {
        MEVProtectionEnabled = enabled;
        emit MEVProtectionEnabledUpdated(MEVProtectionEnabled);
    }

    function _checkMEV(address sender) internal view {
        // If the sender address is not in the restriction whitelist, verify it is not transferring/selling in the same block. 
		// If it is, prevent the transfer.
		if (MEVProtectionEnabled && _transferTimeWhitelist[sender] != true) {
			// Alter the # of seconds according to the chain specifics.
			require(_transferTime[sender] != uint32(block.timestamp), "Please wait 1 block (~10-15 seconds) before transferring or selling your tokens.");
		}
    }

    function _trackMEV(address recipient) internal {
        // If the to address is not in the restriction whitelist, track the time of buy/receipt.
		if (_transferTimeWhitelist[recipient] != true) {
			_transferTime[recipient] = uint32(block.timestamp);
		}
    }

    function isExcludedFromMEV(address account) external view returns (bool) {
        return _transferTimeWhitelist[account];
    }

    /**
	* Pass in an address to add it to the time restriction whitelist.
	*/
    function excludeFromMEV(address account) external onlyManager() {
        require(!_transferTimeWhitelist[account], "Account is not included");
        _whitelist(account);
    }
    
    function _whitelist(address account) internal {
        _transferTimeWhitelist[account] = true;
        _whitelisted.push(account);
    }

    /**
	* Pass in an address to remove it from the time restriction whitelist.
	*/
    function includeInMEV(address account) external onlyManager() {
        require(_transferTimeWhitelist[account], "Account is not excluded");
        for (uint256 i = 0; i < _whitelisted.length; i++) {
            if (_whitelisted[i] == account) {
                _whitelisted[i] = _whitelisted[_whitelisted.length - 1];
                _transferTimeWhitelist[account] = false;
                _whitelisted.pop();
                break;
            }
        }
    }
}

contract MEGAToken is Reflector, MEVProtection {
    
    using SafeMath for uint256;

    address _pair;

    constructor(address router, address weth){

        _pair = IPulseXFactory(IPulseXRouter(router).factory()).createPair(address(this), weth);

        // exclude the pair address from rewards - we don't want to redistribute
        // tx fees to these two; redistribution is only for holders, dah!
        _exclude(_pair);
        _exclude(address(0));

        //add router and pair to MEV whitelist
        _whitelist(address(router));
        _whitelist(_pair);
        
    }
    
    function _isV2Pair(address account) internal view override returns(bool){
        return (account == _pair);
    }

    function _getSumOfFees(address, uint256) internal view override returns (uint256){ 
        return sumOfFees;
    }
    
    function _beforeTokenTransfer(address sender, address, uint256, bool) internal view override {
        _checkMEV(sender);
    }

    function _afterTokenTransfer(address, address recipient, uint256) internal override {
        _trackMEV(recipient);
    }

    function _takeTransactionFees(uint256 amount, uint256 currentRate) internal override {
        uint256 feesCount = _getFeesCount();
        for (uint256 index = 0; index < feesCount; index++ ){
            (FeeType name, uint256 value,,) = _getFee(index);
            // no need to check value < 0 as the value is uint (i.e. from 0 to 2^256-1)
            if ( value == 0 ) continue;

            if ( name == FeeType.Reflection ){
                _redistribute( amount, currentRate, value, index );
            }
            else if ( name == FeeType.Burn ){
                _burn( amount, currentRate, value, index );
            }
        }
    }

    function _burn(uint256 amount, uint256 currentRate, uint256 fee, uint256 index) private {
        uint256 tBurn = amount.mul(fee).div(FEES_DIVISOR);
        uint256 rBurn = tBurn.mul(currentRate);

        _burnTokens(address(this), tBurn, rBurn);
        _addFeeCollectedAmount(index, tBurn);
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"router","internalType":"address"},{"type":"address","name":"weth","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MEVProtectionEnabledUpdated","inputs":[{"type":"bool","name":"enabled","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"ManagementTransferred","inputs":[{"type":"address","name":"previousManager","internalType":"address","indexed":true},{"type":"address","name":"newManager","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromMEV","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCollectedFeeTotal","inputs":[{"type":"uint256","name":"index","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeInMEV","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeInReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFee","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromMEV","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromReward","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"manager","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionFromToken","inputs":[{"type":"uint256","name":"tAmount","internalType":"uint256"},{"type":"bool","name":"deductTransferFee","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"removeWalletLimits","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExcludedFromFee","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMEVProtectionEnabled","inputs":[{"type":"bool","name":"enabled","internalType":"bool"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferManagement","inputs":[{"type":"address","name":"newManager","internalType":"address"}]}]
              

Contract Creation Code

Verify & Publish
0x6080604052620000126006600a62000a49565b62000025906603287092778e3862000a5a565b620000339060001962000a8a565b620000419060001962000aa1565b6001556064620000546006600a62000a49565b62000067906603287092778e3862000a5a565b62000073919062000ab7565b6002556032620000866006600a62000a49565b62000099906603287092778e3862000a5a565b620000a5919062000ab7565b600355600f805460ff19166001179055348015620000c257600080fd5b5060405162002e2438038062002e24833981016040819052620000e59162000aeb565b600080546001600160a01b031916339081178255604051909182917f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c85908290a3506200013062000427565b600154600660006200014a6000546001600160a01b031690565b6001600160a01b03166001600160a01b0316815260200190815260200160002081905550600160096000620001846200044760201b60201c565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526009909252902080549091166001179055620001e1620001db6000546001600160a01b031690565b62000456565b620001ec3062000456565b600080546001600160a01b0316907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620002296006600a62000a49565b6200023c906603287092778e3862000a5a565b60405190815260200160405180910390a3816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200028c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002b2919062000b23565b6040516364e329cb60e11b81523060048201526001600160a01b038381166024830152919091169063c9c65396906044016020604051808303816000875af115801562000303573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000329919062000b23565b600f8054610100600160a81b0319166101006001600160a01b03938416810291909117918290556200035e9291041662000456565b6200036a600062000456565b620003c4826001600160a01b03166000818152600d60205260408120805460ff19166001908117909155600e8054918201815590915260008051602062002e048339815191520180546001600160a01b0319169091179055565b600f5461010090046001600160a01b03166000818152600d60205260408120805460ff19166001908117909155600e8054918201815590915260008051602062002e048339815191520180546001600160a01b0319169091179055505062000b9f565b62000436600160143062000519565b620004456000600a8162000519565b565b6000546001600160a01b031690565b6001600160a01b03811660009081526006602052604090205415620004b3576001600160a01b0381166000908152600660205260409020546200049990620005fd565b6001600160a01b0382166000908152600760205260409020555b6001600160a01b03166000818152600a60205260408120805460ff19166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319169091179055565b600460405180608001604052808560018111156200053b576200053b62000b41565b815260208082018690526001600160a01b03851660408301526000606090920182905283546001818101865594835291208251600490920201805492939092839160ff1990911690838181111562000597576200059762000b41565b02179055506020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015550508160056000828254620005f3919062000b57565b9091555050505050565b6000600154821115620006695760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b606482015260840160405180910390fd5b60006200067562000698565b9050620006918184620006cb60201b62000ee61790919060201c565b9392505050565b60008080620006a6620006e2565b91509150620006c48183620006cb60201b62000ee61790919060201c565b9250505090565b6000620006d9828462000ab7565b90505b92915050565b600154600090819081620006f96006600a62000a49565b6200070c906603287092778e3862000a5a565b905060005b600b54811015620008a2578260066000600b848154811062000737576200073762000b6d565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180620007a657508160076000600b84815481106200077f576200077f62000b6d565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15620007db57600154620007bd6006600a62000a49565b620007d0906603287092778e3862000a5a565b945094505050509091565b6200083260066000600b8481548110620007f957620007f962000b6d565b60009182526020808320909101546001600160a01b03168352828101939093526040909101902054859162000ef962000928821b17901c565b92506200088b60076000600b848154811062000852576200085262000b6d565b60009182526020808320909101546001600160a01b03168352828101939093526040909101902054849162000ef962000928821b17901c565b915080620008998162000b83565b91505062000711565b50801580620008eb5750620008e8620008be6006600a62000a49565b620008d1906603287092778e3862000a5a565b600154620006cb60201b62000ee61790919060201c565b82105b156200091f57600154620009026006600a62000a49565b62000915906603287092778e3862000a5a565b9350935050509091565b90939092509050565b6000620006d9828462000aa1565b634e487b7160e01b600052601160045260246000fd5b600181815b808511156200098d57816000190482111562000971576200097162000936565b808516156200097f57918102915b93841c939080029062000951565b509250929050565b600082620009a657506001620006dc565b81620009b557506000620006dc565b8160018114620009ce5760028114620009d957620009f9565b6001915050620006dc565b60ff841115620009ed57620009ed62000936565b50506001821b620006dc565b5060208310610133831016604e8410600b841016171562000a1e575081810a620006dc565b62000a2a83836200094c565b806000190482111562000a415762000a4162000936565b029392505050565b6000620006d960ff84168362000995565b8082028115828204841417620006dc57620006dc62000936565b634e487b7160e01b600052601260045260246000fd5b60008262000a9c5762000a9c62000a74565b500690565b81810381811115620006dc57620006dc62000936565b60008262000ac95762000ac962000a74565b500490565b80516001600160a01b038116811462000ae657600080fd5b919050565b6000806040838503121562000aff57600080fd5b62000b0a8362000ace565b915062000b1a6020840162000ace565b90509250929050565b60006020828403121562000b3657600080fd5b620006d98262000ace565b634e487b7160e01b600052602160045260246000fd5b80820180821115620006dc57620006dc62000936565b634e487b7160e01b600052603260045260246000fd5b60006001820162000b985762000b9862000936565b5060010190565b6122558062000baf6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c8063481c6a75116100de5780638d11551e11610097578063a9059cbb11610071578063a9059cbb146103d3578063bdc4b790146103e6578063dd62ed3e146103f9578063e4edf8521461043257600080fd5b80638d11551e1461038d57806395d89b41146103a0578063a457c2d7146103c057600080fd5b8063481c6a75146102e157806352390c02146102fc5780635342acb41461030f5780636612e66f1461033b57806370a082311461034e57806388f820201461036157600080fd5b806327b1369f1161014b578063395093511161012557806339509351146102a0578063398df196146102b357806342966c68146102bb5780634549b039146102ce57600080fd5b806327b1369f14610252578063313ce5671461027e5780633685d4191461028d57600080fd5b806306fdde0314610193578063095ea7b3146101de57806318160ddd146102015780631826e62a1461021757806322ff5df21461022c57806323b872dd1461023f575b600080fd5b60408051808201909152601981527f4d616b6520457468657265756d20477265617420416761696e0000000000000060208201525b6040516101d59190611e1b565b60405180910390f35b6101f16101ec366004611e85565b610445565b60405190151581526020016101d5565b61020961045c565b6040519081526020016101d5565b61022a610225366004611ebf565b610480565b005b61022a61023a366004611eda565b610500565b6101f161024d366004611ef5565b6105fa565b6101f1610260366004611eda565b6001600160a01b03166000908152600d602052604090205460ff1690565b604051600681526020016101d5565b61022a61029b366004611eda565b610663565b6101f16102ae366004611e85565b610813565b61022a610849565b61022a6102c9366004611f31565b61089a565b6102096102dc366004611f4a565b610a17565b6000546040516001600160a01b0390911681526020016101d5565b61022a61030a366004611eda565b610ac7565b6101f161031d366004611eda565b6001600160a01b031660009081526009602052604090205460ff1690565b61022a610349366004611f76565b610b5d565b61020961035c366004611eda565b610bb2565b6101f161036f366004611eda565b6001600160a01b03166000908152600a602052604090205460ff1690565b61020961039b366004611f31565b610c11565b6040805180820190915260048152634d45474160e01b60208201526101c8565b6101f16103ce366004611e85565b610c88565b6101f16103e1366004611e85565b610cd7565b61022a6103f4366004611eda565b610ce4565b610209610407366004611fa0565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b61022a610440366004611eda565b610e61565b6000610452338484610f05565b5060015b92915050565b600061046a6006600a6120c4565b61047b906603287092778e386120d3565b905090565b6000546001600160a01b031633146104b35760405162461bcd60e51b81526004016104aa906120ea565b60405180910390fd5b600f805460ff191682151590811790915560405160ff909116151581527f93fe086589e2785f1c3891e1c046851acf9de9434fd52b9295e17c279bad87b79060200160405180910390a150565b6000546001600160a01b0316331461052a5760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600d602052604090205460ff161561058d5760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd081a5b98db1d591959604a1b60448201526064016104aa565b6105f7816001600160a01b03166000818152600d60205260408120805460ff19166001908117909155600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319169091179055565b50565b6000610607848484611033565b6106598433610654856040518060600160405280602881526020016121d3602891396001600160a01b038a1660009081526008602090815260408083203384529091529020549190611337565b610f05565b5060019392505050565b6000546001600160a01b0316331461068d5760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600a602052604090205460ff166106ef5760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd08195e18db1d591959604a1b60448201526064016104aa565b60005b600b5481101561080f57816001600160a01b0316600b82815481106107195761071961212f565b6000918252602090912001546001600160a01b0316036107fd57600b805461074390600190612145565b815481106107535761075361212f565b600091825260209091200154600b80546001600160a01b03909216918390811061077f5761077f61212f565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600782526040808220829055600a90925220805460ff19169055600b8054806107d7576107d7612158565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806108078161216e565b9150506106f2565b5050565b3360008181526008602090815260408083206001600160a01b038716845290915281205490916104529185906106549086611363565b6000546001600160a01b031633146108735760405162461bcd60e51b81526004016104aa906120ea565b61087f6006600a6120c4565b610890906603287092778e386120d3565b6002556000600355565b33806108f65760405162461bcd60e51b815260206004820152602560248201527f5265666c6563746f723a206275726e2066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104aa565b600061090182610bb2565b9050828110156109625760405162461bcd60e51b815260206004820152602660248201527f5265666c6563746f723a206275726e20616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104aa565b600061097661096f61136f565b8590611392565b6001600160a01b03841660009081526006602052604090205490915061099c9082610ef9565b6001600160a01b038416600090815260066020908152604080832093909355600a9052205460ff1615610a06576001600160a01b0383166000908152600760205260409020546109ec9085610ef9565b6001600160a01b0384166000908152600760205260409020555b610a1183858361139e565b50505050565b6000610a256006600a6120c4565b610a36906603287092778e386120d3565b831115610a855760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016104aa565b81610aa5576000610a978460006114c7565b509294506104569350505050565b6000610ab984610ab460055490565b6114c7565b509194506104569350505050565b6000546001600160a01b03163314610af15760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600a602052604090205460ff1615610b545760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd081a5b98db1d591959604a1b60448201526064016104aa565b6105f78161153d565b6000546001600160a01b03163314610b875760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152600a602052604081205460ff1615610bef57506001600160a01b031660009081526007602052604090205490565b6001600160a01b038216600090815260066020526040902054610456906115fd565b600080610c1d8361167a565b60408051608081019091528154909190829060ff166001811115610c4357610c43612187565b6001811115610c5457610c54612187565b81526001820154602082015260028201546001600160a01b0316604082015260039091015460609182015201519392505050565b60006104523384610654856040518060600160405280602581526020016121fb602591393360009081526008602090815260408083206001600160a01b038d1684529091529020549190611337565b6000610452338484611033565b6000546001600160a01b03163314610d0e5760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600d602052604090205460ff16610d705760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd08195e18db1d591959604a1b60448201526064016104aa565b60005b600e5481101561080f57816001600160a01b0316600e8281548110610d9a57610d9a61212f565b6000918252602090912001546001600160a01b031603610e4f57600e8054610dc490600190612145565b81548110610dd457610dd461212f565b600091825260209091200154600e80546001600160a01b039092169183908110610e0057610e0061212f565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600d90915260409020805460ff19169055600e8054806107d7576107d7612158565b80610e598161216e565b915050610d73565b6000546001600160a01b03163314610e8b5760405162461bcd60e51b81526004016104aa906120ea565b600080546040516001600160a01b03808516939216917f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8591a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610ef2828461219d565b9392505050565b6000610ef28284612145565b6001600160a01b038316610f6c5760405162461bcd60e51b815260206004820152602860248201527f5265666c6563746f723a20617070726f76652066726f6d20746865207a65726f604482015267206164647265737360c01b60648201526084016104aa565b6001600160a01b038216610fd15760405162461bcd60e51b815260206004820152602660248201527f5265666c6563746f723a20617070726f766520746f20746865207a65726f206160448201526564647265737360d01b60648201526084016104aa565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661109b5760405162461bcd60e51b815260206004820152602960248201527f5265666c6563746f723a207472616e736665722066726f6d20746865207a65726044820152686f206164647265737360b81b60648201526084016104aa565b6001600160a01b0382166111015760405162461bcd60e51b815260206004820152602760248201527f5265666c6563746f723a207472616e7366657220746f20746865207a65726f206044820152666164647265737360c81b60648201526084016104aa565b600081116111635760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016104aa565b6002546001908211801561118557506000546001600160a01b03858116911614155b8015611197575061119583611711565b155b156111f55760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016104aa565b600060035411801561121557506000546001600160a01b03858116911614155b8015611227575061122583611711565b155b80156112465750600f546001600160a01b038481166101009092041614155b156112cc57600061125684610bb2565b60035490915061126684836121bf565b11156112ca5760405162461bcd60e51b815260206004820152602d60248201527f4e65772062616c616e636520776f756c642065786365656420746865206d617860448201526c57616c6c657442616c616e636560981b60648201526084016104aa565b505b6001600160a01b03841660009081526009602052604090205460ff168061130b57506001600160a01b03831660009081526009602052604090205460ff165b15611314575060005b61132084848484611737565b61132c84848484611740565b610a118484846118fa565b6000818484111561135b5760405162461bcd60e51b81526004016104aa9190611e1b565b505050900390565b6000610ef282846121bf565b600080600061137c611908565b909250905061138b8282610ee6565b9250505090565b6000610ef282846120d3565b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8546113d39082611363565b600080527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f855600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e35460ff1615611489576000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df5461145d9083611363565b6000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df555b6040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611026565b600080808080806114e46103e86114de8a8a611392565b90610ee6565b905060006114f28983610ef9565b905060006114fe61136f565b9050600061150c8b83611392565b9050600061151a8584611392565b905060006115288383610ef9565b929d929c9b5093995091975095505050505050565b6001600160a01b03811660009081526006602052604090205415611597576001600160a01b03811660009081526006602052604090205461157d906115fd565b6001600160a01b0382166000908152600760205260409020555b6001600160a01b03166000818152600a60205260408120805460ff19166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319169091179055565b60006001548211156116645760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016104aa565b600061166e61136f565b9050610ef28382610ee6565b600060045482106116e95760405162461bcd60e51b815260206004820152603360248201527f4665657353657474696e67732e5f6765744665655374727563743a2046656520604482015272696e646578206f7574206f6620626f756e647360681b60648201526084016104aa565b600482815481106116fc576116fc61212f565b90600052602060002090600402019050919050565b600080546001600160a01b03838116911614806104565750506001600160a01b03161590565b610a1184611aff565b600061174b60055490565b905081611756575060005b600080600080600061176888876114c7565b6001600160a01b038f16600090815260066020526040902054949950929750909550935091506117989086610ef9565b6001600160a01b03808c1660009081526006602052604080822093909355908b16815220546117c79085611363565b6001600160a01b03808b16600090815260066020908152604080832094909455918d168152600a909152205460ff1615611838576001600160a01b038a1660009081526007602052604090205461181e9084610ef9565b6001600160a01b038b166000908152600760205260409020555b6001600160a01b0389166000908152600a602052604090205460ff1615611896576001600160a01b03891660009081526007602052604090205461187c9083611363565b6001600160a01b038a166000908152600760205260409020555b6118a1888288611be3565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118e691815260200190565b60405180910390a350505050505050505050565b61190382611bf3565b505050565b60015460009081908161191d6006600a6120c4565b61192e906603287092778e386120d3565b905060005b600b54811015611a92578260066000600b84815481106119555761195561212f565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806119c057508160076000600b84815481106119995761199961212f565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156119f0576001546119d46006600a6120c4565b6119e5906603287092778e386120d3565b945094505050509091565b611a3660066000600b8481548110611a0a57611a0a61212f565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490610ef9565b9250611a7e60076000600b8481548110611a5257611a5261212f565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390610ef9565b915080611a8a8161216e565b915050611933565b50801580611ac75750611ac4611aaa6006600a6120c4565b611abb906603287092778e386120d3565b60015490610ee6565b82105b15611af657600154611adb6006600a6120c4565b611aec906603287092778e386120d3565b9350935050509091565b90939092509050565b600f5460ff168015611b2f57506001600160a01b0381166000908152600d602052604090205460ff161515600114155b156105f7576001600160a01b0381166000908152600c602052604090205463ffffffff4281169116036105f75760405162461bcd60e51b815260206004820152605060248201527f506c656173652077616974203120626c6f636b20287e31302d3135207365636f60448201527f6e647329206265666f7265207472616e7366657272696e67206f722073656c6c60648201526f34b733903cb7bab9103a37b5b2b7399760811b608482015260a4016104aa565b8015611903576119038383611c44565b6001600160a01b0381166000908152600d602052604090205460ff1615156001146105f7576001600160a01b03166000908152600c60205260409020805463ffffffff19164263ffffffff16179055565b6000611c4f60045490565b905060005b81811015610a1157600080611c6883611ce1565b50509150915080600003611c7d575050611ccf565b6001826001811115611c9157611c91612187565b03611ca757611ca286868386611d7c565b611ccc565b6000826001811115611cbb57611cbb612187565b03611ccc57611ccc86868386611dc1565b50505b80611cd98161216e565b915050611c54565b6000806000806000611cf28661167a565b60408051608081019091528154909190829060ff166001811115611d1857611d18612187565b6001811115611d2957611d29612187565b8152600182015460208083019190915260028301546001600160a01b0316604080840191909152600390930154606092830152835190840151928401519390910151909991985091965090945092505050565b6000611d8e6103e86114de8786611392565b90506000611d9c8286611392565b600154909150611dac9082610ef9565b600155611db98383611df4565b505050505050565b6000611dd36103e86114de8786611392565b90506000611de18286611392565b9050611dee30838361139e565b611db983835b6000611dff8361167a565b6003810154909150611e119083611363565b6003909101555050565b600060208083528351808285015260005b81811015611e4857858101830151858201604001528201611e2c565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611e8057600080fd5b919050565b60008060408385031215611e9857600080fd5b611ea183611e69565b946020939093013593505050565b80358015158114611e8057600080fd5b600060208284031215611ed157600080fd5b610ef282611eaf565b600060208284031215611eec57600080fd5b610ef282611e69565b600080600060608486031215611f0a57600080fd5b611f1384611e69565b9250611f2160208501611e69565b9150604084013590509250925092565b600060208284031215611f4357600080fd5b5035919050565b60008060408385031215611f5d57600080fd5b82359150611f6d60208401611eaf565b90509250929050565b60008060408385031215611f8957600080fd5b611f9283611e69565b9150611f6d60208401611eaf565b60008060408385031215611fb357600080fd5b611fbc83611e69565b9150611f6d60208401611e69565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561201b57816000190482111561200157612001611fca565b8085161561200e57918102915b93841c9390800290611fe5565b509250929050565b60008261203257506001610456565b8161203f57506000610456565b8160018114612055576002811461205f5761207b565b6001915050610456565b60ff84111561207057612070611fca565b50506001821b610456565b5060208310610133831016604e8410600b841016171561209e575081810a610456565b6120a88383611fe0565b80600019048211156120bc576120bc611fca565b029392505050565b6000610ef260ff841683612023565b808202811582820484141761045657610456611fca565b60208082526025908201527f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d616040820152643730b3b2b960d91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b8181038181111561045657610456611fca565b634e487b7160e01b600052603160045260246000fd5b60006001820161218057612180611fca565b5060010190565b634e487b7160e01b600052602160045260246000fd5b6000826121ba57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561045657610456611fca56fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122087515c0d7db8a5d085c4a4df9327701fada493662a8baba5965581944d9b1ccb64736f6c63430008120033bb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d900000000000000000000000002dcdd04e3f455d838cd1249292c58f3b79e3c3c

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c8063481c6a75116100de5780638d11551e11610097578063a9059cbb11610071578063a9059cbb146103d3578063bdc4b790146103e6578063dd62ed3e146103f9578063e4edf8521461043257600080fd5b80638d11551e1461038d57806395d89b41146103a0578063a457c2d7146103c057600080fd5b8063481c6a75146102e157806352390c02146102fc5780635342acb41461030f5780636612e66f1461033b57806370a082311461034e57806388f820201461036157600080fd5b806327b1369f1161014b578063395093511161012557806339509351146102a0578063398df196146102b357806342966c68146102bb5780634549b039146102ce57600080fd5b806327b1369f14610252578063313ce5671461027e5780633685d4191461028d57600080fd5b806306fdde0314610193578063095ea7b3146101de57806318160ddd146102015780631826e62a1461021757806322ff5df21461022c57806323b872dd1461023f575b600080fd5b60408051808201909152601981527f4d616b6520457468657265756d20477265617420416761696e0000000000000060208201525b6040516101d59190611e1b565b60405180910390f35b6101f16101ec366004611e85565b610445565b60405190151581526020016101d5565b61020961045c565b6040519081526020016101d5565b61022a610225366004611ebf565b610480565b005b61022a61023a366004611eda565b610500565b6101f161024d366004611ef5565b6105fa565b6101f1610260366004611eda565b6001600160a01b03166000908152600d602052604090205460ff1690565b604051600681526020016101d5565b61022a61029b366004611eda565b610663565b6101f16102ae366004611e85565b610813565b61022a610849565b61022a6102c9366004611f31565b61089a565b6102096102dc366004611f4a565b610a17565b6000546040516001600160a01b0390911681526020016101d5565b61022a61030a366004611eda565b610ac7565b6101f161031d366004611eda565b6001600160a01b031660009081526009602052604090205460ff1690565b61022a610349366004611f76565b610b5d565b61020961035c366004611eda565b610bb2565b6101f161036f366004611eda565b6001600160a01b03166000908152600a602052604090205460ff1690565b61020961039b366004611f31565b610c11565b6040805180820190915260048152634d45474160e01b60208201526101c8565b6101f16103ce366004611e85565b610c88565b6101f16103e1366004611e85565b610cd7565b61022a6103f4366004611eda565b610ce4565b610209610407366004611fa0565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b61022a610440366004611eda565b610e61565b6000610452338484610f05565b5060015b92915050565b600061046a6006600a6120c4565b61047b906603287092778e386120d3565b905090565b6000546001600160a01b031633146104b35760405162461bcd60e51b81526004016104aa906120ea565b60405180910390fd5b600f805460ff191682151590811790915560405160ff909116151581527f93fe086589e2785f1c3891e1c046851acf9de9434fd52b9295e17c279bad87b79060200160405180910390a150565b6000546001600160a01b0316331461052a5760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600d602052604090205460ff161561058d5760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd081a5b98db1d591959604a1b60448201526064016104aa565b6105f7816001600160a01b03166000818152600d60205260408120805460ff19166001908117909155600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd0180546001600160a01b0319169091179055565b50565b6000610607848484611033565b6106598433610654856040518060600160405280602881526020016121d3602891396001600160a01b038a1660009081526008602090815260408083203384529091529020549190611337565b610f05565b5060019392505050565b6000546001600160a01b0316331461068d5760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600a602052604090205460ff166106ef5760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd08195e18db1d591959604a1b60448201526064016104aa565b60005b600b5481101561080f57816001600160a01b0316600b82815481106107195761071961212f565b6000918252602090912001546001600160a01b0316036107fd57600b805461074390600190612145565b815481106107535761075361212f565b600091825260209091200154600b80546001600160a01b03909216918390811061077f5761077f61212f565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600782526040808220829055600a90925220805460ff19169055600b8054806107d7576107d7612158565b600082815260209020810160001990810180546001600160a01b03191690550190555050565b806108078161216e565b9150506106f2565b5050565b3360008181526008602090815260408083206001600160a01b038716845290915281205490916104529185906106549086611363565b6000546001600160a01b031633146108735760405162461bcd60e51b81526004016104aa906120ea565b61087f6006600a6120c4565b610890906603287092778e386120d3565b6002556000600355565b33806108f65760405162461bcd60e51b815260206004820152602560248201527f5265666c6563746f723a206275726e2066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016104aa565b600061090182610bb2565b9050828110156109625760405162461bcd60e51b815260206004820152602660248201527f5265666c6563746f723a206275726e20616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016104aa565b600061097661096f61136f565b8590611392565b6001600160a01b03841660009081526006602052604090205490915061099c9082610ef9565b6001600160a01b038416600090815260066020908152604080832093909355600a9052205460ff1615610a06576001600160a01b0383166000908152600760205260409020546109ec9085610ef9565b6001600160a01b0384166000908152600760205260409020555b610a1183858361139e565b50505050565b6000610a256006600a6120c4565b610a36906603287092778e386120d3565b831115610a855760405162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c790060448201526064016104aa565b81610aa5576000610a978460006114c7565b509294506104569350505050565b6000610ab984610ab460055490565b6114c7565b509194506104569350505050565b6000546001600160a01b03163314610af15760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600a602052604090205460ff1615610b545760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd081a5b98db1d591959604a1b60448201526064016104aa565b6105f78161153d565b6000546001600160a01b03163314610b875760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b6001600160a01b0381166000908152600a602052604081205460ff1615610bef57506001600160a01b031660009081526007602052604090205490565b6001600160a01b038216600090815260066020526040902054610456906115fd565b600080610c1d8361167a565b60408051608081019091528154909190829060ff166001811115610c4357610c43612187565b6001811115610c5457610c54612187565b81526001820154602082015260028201546001600160a01b0316604082015260039091015460609182015201519392505050565b60006104523384610654856040518060600160405280602581526020016121fb602591393360009081526008602090815260408083206001600160a01b038d1684529091529020549190611337565b6000610452338484611033565b6000546001600160a01b03163314610d0e5760405162461bcd60e51b81526004016104aa906120ea565b6001600160a01b0381166000908152600d602052604090205460ff16610d705760405162461bcd60e51b81526020600482015260176024820152761058d8dbdd5b9d081a5cc81b9bdd08195e18db1d591959604a1b60448201526064016104aa565b60005b600e5481101561080f57816001600160a01b0316600e8281548110610d9a57610d9a61212f565b6000918252602090912001546001600160a01b031603610e4f57600e8054610dc490600190612145565b81548110610dd457610dd461212f565b600091825260209091200154600e80546001600160a01b039092169183908110610e0057610e0061212f565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600d90915260409020805460ff19169055600e8054806107d7576107d7612158565b80610e598161216e565b915050610d73565b6000546001600160a01b03163314610e8b5760405162461bcd60e51b81526004016104aa906120ea565b600080546040516001600160a01b03808516939216917f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8591a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000610ef2828461219d565b9392505050565b6000610ef28284612145565b6001600160a01b038316610f6c5760405162461bcd60e51b815260206004820152602860248201527f5265666c6563746f723a20617070726f76652066726f6d20746865207a65726f604482015267206164647265737360c01b60648201526084016104aa565b6001600160a01b038216610fd15760405162461bcd60e51b815260206004820152602660248201527f5265666c6563746f723a20617070726f766520746f20746865207a65726f206160448201526564647265737360d01b60648201526084016104aa565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661109b5760405162461bcd60e51b815260206004820152602960248201527f5265666c6563746f723a207472616e736665722066726f6d20746865207a65726044820152686f206164647265737360b81b60648201526084016104aa565b6001600160a01b0382166111015760405162461bcd60e51b815260206004820152602760248201527f5265666c6563746f723a207472616e7366657220746f20746865207a65726f206044820152666164647265737360c81b60648201526084016104aa565b600081116111635760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b60648201526084016104aa565b6002546001908211801561118557506000546001600160a01b03858116911614155b8015611197575061119583611711565b155b156111f55760405162461bcd60e51b815260206004820152602860248201527f5472616e7366657220616d6f756e74206578636565647320746865206d6178546044820152673c20b6b7bab73a1760c11b60648201526084016104aa565b600060035411801561121557506000546001600160a01b03858116911614155b8015611227575061122583611711565b155b80156112465750600f546001600160a01b038481166101009092041614155b156112cc57600061125684610bb2565b60035490915061126684836121bf565b11156112ca5760405162461bcd60e51b815260206004820152602d60248201527f4e65772062616c616e636520776f756c642065786365656420746865206d617860448201526c57616c6c657442616c616e636560981b60648201526084016104aa565b505b6001600160a01b03841660009081526009602052604090205460ff168061130b57506001600160a01b03831660009081526009602052604090205460ff165b15611314575060005b61132084848484611737565b61132c84848484611740565b610a118484846118fa565b6000818484111561135b5760405162461bcd60e51b81526004016104aa9190611e1b565b505050900390565b6000610ef282846121bf565b600080600061137c611908565b909250905061138b8282610ee6565b9250505090565b6000610ef282846120d3565b6000805260066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f8546113d39082611363565b600080527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f855600a6020527f13da86008ba1c6922daee3e07db95305ef49ebced9f5467a0b8613fcc6b343e35460ff1615611489576000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df5461145d9083611363565b6000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df555b6040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611026565b600080808080806114e46103e86114de8a8a611392565b90610ee6565b905060006114f28983610ef9565b905060006114fe61136f565b9050600061150c8b83611392565b9050600061151a8584611392565b905060006115288383610ef9565b929d929c9b5093995091975095505050505050565b6001600160a01b03811660009081526006602052604090205415611597576001600160a01b03811660009081526006602052604090205461157d906115fd565b6001600160a01b0382166000908152600760205260409020555b6001600160a01b03166000818152600a60205260408120805460ff19166001908117909155600b805491820181559091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319169091179055565b60006001548211156116645760405162461bcd60e51b815260206004820152602a60248201527f416d6f756e74206d757374206265206c657373207468616e20746f74616c207260448201526965666c656374696f6e7360b01b60648201526084016104aa565b600061166e61136f565b9050610ef28382610ee6565b600060045482106116e95760405162461bcd60e51b815260206004820152603360248201527f4665657353657474696e67732e5f6765744665655374727563743a2046656520604482015272696e646578206f7574206f6620626f756e647360681b60648201526084016104aa565b600482815481106116fc576116fc61212f565b90600052602060002090600402019050919050565b600080546001600160a01b03838116911614806104565750506001600160a01b03161590565b610a1184611aff565b600061174b60055490565b905081611756575060005b600080600080600061176888876114c7565b6001600160a01b038f16600090815260066020526040902054949950929750909550935091506117989086610ef9565b6001600160a01b03808c1660009081526006602052604080822093909355908b16815220546117c79085611363565b6001600160a01b03808b16600090815260066020908152604080832094909455918d168152600a909152205460ff1615611838576001600160a01b038a1660009081526007602052604090205461181e9084610ef9565b6001600160a01b038b166000908152600760205260409020555b6001600160a01b0389166000908152600a602052604090205460ff1615611896576001600160a01b03891660009081526007602052604090205461187c9083611363565b6001600160a01b038a166000908152600760205260409020555b6118a1888288611be3565b886001600160a01b03168a6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516118e691815260200190565b60405180910390a350505050505050505050565b61190382611bf3565b505050565b60015460009081908161191d6006600a6120c4565b61192e906603287092778e386120d3565b905060005b600b54811015611a92578260066000600b84815481106119555761195561212f565b60009182526020808320909101546001600160a01b0316835282019290925260400190205411806119c057508160076000600b84815481106119995761199961212f565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b156119f0576001546119d46006600a6120c4565b6119e5906603287092778e386120d3565b945094505050509091565b611a3660066000600b8481548110611a0a57611a0a61212f565b60009182526020808320909101546001600160a01b031683528201929092526040019020548490610ef9565b9250611a7e60076000600b8481548110611a5257611a5261212f565b60009182526020808320909101546001600160a01b031683528201929092526040019020548390610ef9565b915080611a8a8161216e565b915050611933565b50801580611ac75750611ac4611aaa6006600a6120c4565b611abb906603287092778e386120d3565b60015490610ee6565b82105b15611af657600154611adb6006600a6120c4565b611aec906603287092778e386120d3565b9350935050509091565b90939092509050565b600f5460ff168015611b2f57506001600160a01b0381166000908152600d602052604090205460ff161515600114155b156105f7576001600160a01b0381166000908152600c602052604090205463ffffffff4281169116036105f75760405162461bcd60e51b815260206004820152605060248201527f506c656173652077616974203120626c6f636b20287e31302d3135207365636f60448201527f6e647329206265666f7265207472616e7366657272696e67206f722073656c6c60648201526f34b733903cb7bab9103a37b5b2b7399760811b608482015260a4016104aa565b8015611903576119038383611c44565b6001600160a01b0381166000908152600d602052604090205460ff1615156001146105f7576001600160a01b03166000908152600c60205260409020805463ffffffff19164263ffffffff16179055565b6000611c4f60045490565b905060005b81811015610a1157600080611c6883611ce1565b50509150915080600003611c7d575050611ccf565b6001826001811115611c9157611c91612187565b03611ca757611ca286868386611d7c565b611ccc565b6000826001811115611cbb57611cbb612187565b03611ccc57611ccc86868386611dc1565b50505b80611cd98161216e565b915050611c54565b6000806000806000611cf28661167a565b60408051608081019091528154909190829060ff166001811115611d1857611d18612187565b6001811115611d2957611d29612187565b8152600182015460208083019190915260028301546001600160a01b0316604080840191909152600390930154606092830152835190840151928401519390910151909991985091965090945092505050565b6000611d8e6103e86114de8786611392565b90506000611d9c8286611392565b600154909150611dac9082610ef9565b600155611db98383611df4565b505050505050565b6000611dd36103e86114de8786611392565b90506000611de18286611392565b9050611dee30838361139e565b611db983835b6000611dff8361167a565b6003810154909150611e119083611363565b6003909101555050565b600060208083528351808285015260005b81811015611e4857858101830151858201604001528201611e2c565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114611e8057600080fd5b919050565b60008060408385031215611e9857600080fd5b611ea183611e69565b946020939093013593505050565b80358015158114611e8057600080fd5b600060208284031215611ed157600080fd5b610ef282611eaf565b600060208284031215611eec57600080fd5b610ef282611e69565b600080600060608486031215611f0a57600080fd5b611f1384611e69565b9250611f2160208501611e69565b9150604084013590509250925092565b600060208284031215611f4357600080fd5b5035919050565b60008060408385031215611f5d57600080fd5b82359150611f6d60208401611eaf565b90509250929050565b60008060408385031215611f8957600080fd5b611f9283611e69565b9150611f6d60208401611eaf565b60008060408385031215611fb357600080fd5b611fbc83611e69565b9150611f6d60208401611e69565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561201b57816000190482111561200157612001611fca565b8085161561200e57918102915b93841c9390800290611fe5565b509250929050565b60008261203257506001610456565b8161203f57506000610456565b8160018114612055576002811461205f5761207b565b6001915050610456565b60ff84111561207057612070611fca565b50506001821b610456565b5060208310610133831016604e8410600b841016171561209e575081810a610456565b6120a88383611fe0565b80600019048211156120bc576120bc611fca565b029392505050565b6000610ef260ff841683612023565b808202811582820484141761045657610456611fca565b60208082526025908201527f4d616e61676561626c653a2063616c6c6572206973206e6f7420746865206d616040820152643730b3b2b960d91b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b8181038181111561045657610456611fca565b634e487b7160e01b600052603160045260246000fd5b60006001820161218057612180611fca565b5060010190565b634e487b7160e01b600052602160045260246000fd5b6000826121ba57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561045657610456611fca56fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122087515c0d7db8a5d085c4a4df9327701fada493662a8baba5965581944d9b1ccb64736f6c63430008120033