false
true
0

Contract Address Details

0xbF19F45F0c05a76C4B7d0ad196E53014341cfc56

Token
B6FBBD084 (B6FBBD084)
Creator
0xe6cb23–e9842a at 0xd5d30c–c4a7e4
Balance
0 tPLS
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
25348791
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
pBSKR




Optimization enabled
true
Compiler version
v0.8.19+commit.7dd6d404




Optimization runs
200
EVM Version
default




Verified at
2023-05-31T03:09:16.547474Z

Constructor Arguments

0x0000000000000000000000000a4740b91d6fa3ee8e993540169a04069fe72b4a000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000004f06fccaa501b7bb9f9afcefb20f7862be050b7d0000000000000000000000001135fab3645529d12fad9b44898034d57cbba92e000000000000000000000000000000015d3638a850b12d1d3fcf284b5dd529d50000000000000000000000001988d578de9a3468329de348e5a0e6cdc4369df9000000000000000000000000000000146e609e2eb40346c668a17fc32aa4bd7c00000000000000000000000053e011d48f0164a3d58fb8591060e7b05e744818000000000000000000000000000000180803cdb49fb17a098338af68ffb831360000000000000000000000000000000000000000000000000000000000000009423646424244303834000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094236464242443038340000000000000000000000000000000000000000000000
              

contracts/pBSKR.sol

/**
 * @title BSKR - Brings Serenity, Knowledge and Richness
 * @author Ra Murd <pulselorian@gmail.com>
 * @notice website: https://pulselorian.com/
 * @notice telegram: https://t.me/ThePulselorian
 * @notice twitter: https://twitter.com/ThePulseLorian
 *
 * BSKR is our attempt to develop a better internet currency
 * It's deflationary, burns some fees, reflects some fees and adds some fees to liquidity pool
 * It may also pay quarterly bonus to net buyers
 *
 *    (   (  (  (     (   (( (   .  (   (    (( (   ((
 *    )\  )\ )\ )\    )\ (\())\   . )\  )\   ))\)\  ))\
 *   ((_)((_)(_)(_)  ((_))(_)(_)   ((_)((_)(((_)_()((_)))
 *   | _ \ | | | |  / __| __| |   / _ \| _ \_ _|   \ \| |
 *   |  _/ |_| | |__\__ \ _|| |__| (_) |   /| || - | .  |
 *   |_|  \___/|____|___/___|____|\___/|_|_\___|_|_|_|\_|
 *
 * Tokenomics:
 * Reflection       2.0%      40.00%
 * Burn             2.0%      40.00%
 * Growth           0.5%      10.00%
 * Liquidity        0.5%      10.00%
 *
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.19;

import "./imports/BaseBSKR.sol";
import "./imports/IBSKR.sol";

contract pBSKR is BaseBSKR {
    enum Field {
        tTransferAmount,
        rAmount,
        rTransferAmount,
        tRfiFee,
        tOtherFees,
        rRfiFee,
        rOtherFees
    }

    enum Fees {
        RfiFee,
        OtherFees,
        GrossFees
    }

    IBSKR private _oldBSKR;
    address private _LBSKRAddr;
    address private _ammBSKRPair;
    address[] private _noRfi;
    bool private _addLPEnabled = true;
    bool private _addingLiquidity;
    mapping(address => bool) private _getsNoRfi;
    mapping(address => uint256) private _rBalances;
    uint256 private _rTotal = (type(uint256).max -
        (type(uint256).max % _totalSupply));
    uint256 private _num_tokens_for_lp =
        100_000_000_000 * 1_000_000_000_000_000_000;
    uint256 private totalReflection;
    uint32[3] private _currFees = [200, 50, 500];

    event AddLPEnabledUpdated(bool enabled);
    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    constructor(
        IBSKR oldBSKR_,
        string memory name_,
        string memory symbol_,
        address growthAddress_,
        address lbskrAddr_,
        address[5] memory sisterOAs_
    ) BaseBSKR(name_, symbol_, growthAddress_, sisterOAs_) {
        _oldBSKR = oldBSKR_;
        _LBSKRAddr = lbskrAddr_;
        _rBalances[msg.sender] = _rTotal;
        _balances[msg.sender] = _totalSupply;

        _ammBSKRPair = _dexFactoryV2.createPair(address(this), wethAddr);
        _approve(_ammBSKRPair, _ammBSKRPair, type(uint256).max);
        _isAMMPair[_ammBSKRPair] = true;
        _setNoRfi(_ammBSKRPair);

        for (uint256 index = 0; index < _sisterOAs.length; ++index) {
            _paysNoFee[_sisterOAs[index]] = true;
            _setNoRfi(_sisterOAs[index]);
        }

        _setNoRfi(msg.sender);
        _setNoRfi(address(this));
        _setNoRfi(_ammBSKRPair);
        // _setNoRfi(address(0));
        _setNoRfi(_BURN_ADDRESS);

        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    function _airdropTokens(address to_, uint256 amount_) internal override {
        _transferTokens(
            owner(),
            to_,
            amount_,
            false,
            true,
            _getsNoRfi[to_]
        );
    }

    function _getRate() private view returns (uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _totalSupply;

        for (uint256 index = 0; index < _noRfi.length; ++index) {
            if (
                _rBalances[_noRfi[index]] > rSupply ||
                _balances[_noRfi[index]] > tSupply
            ) return (_rTotal / _totalSupply);
            rSupply -= _rBalances[_noRfi[index]];
            tSupply -= _balances[_noRfi[index]];
        }
        if (rSupply < _rTotal / _totalSupply) return (_rTotal / _totalSupply);

        return rSupply / tSupply;
    }

    function _getValues(
        uint256 tAmount_,
        uint256 feeMultiplier_
    ) private view returns (uint256[7] memory response) {
        uint256 currentRate = _getRate();

        response[uint256(Field.rAmount)] = (tAmount_ * currentRate);

        if (feeMultiplier_ == 0) {
            response[uint256(Field.tTransferAmount)] = tAmount_;
            response[uint256(Field.rTransferAmount)] = tAmount_ * currentRate;
        } else {
            response[uint256(Field.tRfiFee)] =
                (((tAmount_ * _currFees[uint256(Fees.RfiFee)]) / _BIPS) *
                    feeMultiplier_) /
                10;
            response[uint256(Field.tOtherFees)] =
                (((tAmount_ * _currFees[uint256(Fees.OtherFees)]) / _BIPS) *
                    feeMultiplier_) /
                10;
            response[uint256(Field.tTransferAmount)] =
                tAmount_ -
                ((((tAmount_ * _currFees[uint256(Fees.GrossFees)]) / _BIPS) *
                    feeMultiplier_) / 10);

            response[uint256(Field.rRfiFee)] = (response[
                uint256(Field.tRfiFee)
            ] * currentRate);
            response[uint256(Field.rOtherFees)] = (response[
                uint256(Field.tOtherFees)
            ] * currentRate);
            response[uint256(Field.rTransferAmount)] = (response[
                uint256(Field.tTransferAmount)
            ] * currentRate);
        }

        return (response);
    }

    function _setNoRfi(address wallet_) private {
        if (!_getsNoRfi[wallet_]) {
            _getsNoRfi[wallet_] = true;
            _noRfi.push(wallet_);
        }
    }

    function _takeFee(address target_, uint256 tFee_, uint256 rFee_) private {
        _rBalances[target_] += rFee_;
        if (_getsNoRfi[target_]) {
            _balances[target_] += tFee_;
        }
    }

    function _transfer(
        address from_,
        address to_,
        uint256 amount_
    ) internal override {
        _checkIfAMMPair(from_);
        if (_isAMMPair[from_]) {
            _setNoRfi(from_);
        }
        _checkIfAMMPair(to_);
        if (_isAMMPair[to_]) {
            _setNoRfi(to_);
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        if (
            (contractTokenBalance >= _num_tokens_for_lp) &&
            !_addingLiquidity &&
            from_ != _ammBSKRPair &&
            _addLPEnabled
        ) {
            _addingLiquidity = true;

            uint256 amount2Eth = _num_tokens_for_lp >> 1;
            uint256 tokenAmount = _num_tokens_for_lp - amount2Eth;

            uint256 initialBalance = address(this).balance;

            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = wethAddr;

            _approve(address(this), address(this), amount2Eth);
            _approve(address(this), address(_dexRouterV2), amount2Eth);

            _dexRouterV2.swapExactTokensForETHSupportingFeeOnTransferTokens(
                amount2Eth,
                0, 
                path,
                address(this),
                block.timestamp + 15
            );

            uint256 ethAmount = address(this).balance - initialBalance;

            _approve(address(this), address(_dexRouterV2), tokenAmount);

            _dexRouterV2.addLiquidityETH{value: ethAmount}(
                address(this),
                tokenAmount,
                0, 
                0,
                _getOriginAddress(),
                block.timestamp + 15
            );

            emit SwapAndLiquify(amount2Eth, ethAmount, tokenAmount);

            _num_tokens_for_lp =
                (_totalSupply - balanceOf(address(_BURN_ADDRESS))) /
                _BIPS;
            _addingLiquidity = false;
        }

        bool takeFee = true;

        if (_paysNoFee[from_] || _paysNoFee[to_]) {
            takeFee = false;
        }

        if (!_isAMMPair[from_] && !_isAMMPair[to_]) {
            takeFee = false;
        }

        _transferTokens(
            from_,
            to_,
            amount_,
            takeFee,
            _getsNoRfi[from_],
            _getsNoRfi[to_]
        );
    }

    function _transferTokens(
        address sender_,
        address recipient_,
        uint256 tAmount_,
        bool takeFee_,
        bool senderExcluded_,
        bool recipientExcluded_
    ) private whenNotPaused {
        uint256 reducedFees = 10;

        if (!takeFee_) {
            reducedFees = 0;
        }

        uint256[7] memory response = _getValues(tAmount_, reducedFees);

        if (senderExcluded_) {
            _balances[sender_] -= tAmount_;
        }
        _rBalances[sender_] -= response[uint256(Field.rAmount)];

        if (recipientExcluded_) {
            _balances[recipient_] += response[uint256(Field.tTransferAmount)];
        }
        _rBalances[recipient_] += response[uint256(Field.rTransferAmount)];

        uint256 _tRfiFee_ = response[uint256(Field.tRfiFee)];
        if (_tRfiFee_ != 0) {
            uint256 _rRfiFee_ = response[uint256(Field.rRfiFee)];
            _rTotal -= _rRfiFee_;
            totalReflection += _tRfiFee_;

            _takeFee(address(_BURN_ADDRESS), _tRfiFee_, _rRfiFee_);
            emit Transfer(sender_, address(_BURN_ADDRESS), _tRfiFee_);

            uint256 _tOtherFees_ = response[uint256(Field.tOtherFees)];
            uint256 _rOtherFees_ = response[uint256(Field.rOtherFees)];
            _takeFee(_growthAddress, _tOtherFees_, _rOtherFees_);
            emit Transfer(sender_, _growthAddress, _tOtherFees_);
            _takeFee(address(this), _tOtherFees_, _rOtherFees_);
            emit Transfer(sender_, address(this), _tOtherFees_);
        }

        emit Transfer(
            sender_,
            recipient_,
            response[uint256(Field.tTransferAmount)]
        );
    }

    function balanceOf(address wallet_) public view override returns (uint256) {
        if (_getsNoRfi[wallet_]) return _balances[wallet_];

        require(_rBalances[wallet_] <= _rTotal, "B: Amount too large");
        uint256 currentRate = _getRate();
        return _rBalances[wallet_] / currentRate;
    }

    function giftReflection(uint256 tAmount_) external whenNotPaused {
        require(tAmount_ != 0, "B: Zero gift amount");
        require(!_getsNoRfi[msg.sender], "B: Excluded wallet");
        uint256[7] memory response = _getValues(tAmount_, 10);
        require(
            _rBalances[msg.sender] > response[uint256(Field.rAmount)],
            "B: Gift too large"
        );
        _rBalances[msg.sender] -= response[uint256(Field.rAmount)];
        _rTotal -= response[uint256(Field.rAmount)];
        totalReflection += tAmount_;
    }

    function setSwapAndLiquifyEnabled(bool enabled_) external onlyManager {
        _addLPEnabled = enabled_;
        emit AddLPEnabledUpdated(enabled_);
    }

    function migrate() external {
        uint256 tokenBal = _oldBSKR.balanceOf(msg.sender);
        require(_oldBSKR.balanceOf(msg.sender) > 0, "No tokens to migrate");
        _oldBSKR.approve(address(this), tokenBal);
        _oldBSKR.transferFrom(msg.sender, address(_BURN_ADDRESS), tokenBal);
        _transferTokens(
            address(this),
            msg.sender,
            tokenBal,
            false,
            _getsNoRfi[address(this)],
            _getsNoRfi[msg.sender]
        );
    }

    function stakeTransfer(
        address from_,
        address to_,
        uint256 amount_
    ) external returns (bool) {
        require(msg.sender == _LBSKRAddr);
        _transferTokens(
            from_,
            to_,
            amount_,
            false,
            _getsNoRfi[from_],
            _getsNoRfi[to_]
        );
        return true;
    }
}
        

contracts/imports/BaseBSKR.sol

/*
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.19;

import "../lib/Utils.sol";
import "../openzeppelin/access/Ownable.sol";
import "../openzeppelin/security/Pausable.sol";
import "../openzeppelin/token/ERC20/IERC20.sol";
import "../uniswap/v2-core/interfaces/IUniswapV2Factory.sol";
import "../uniswap/v2-periphery/interfaces/IUniswapV2Router02.sol";
import "./Manageable.sol";

abstract contract BaseBSKR is Utils, Ownable, Pausable, IERC20, Manageable {
    struct Airdrop {
        address user;
        uint256 ethers;
    }

    IUniswapV2Factory internal _dexFactoryV2;
    IUniswapV2Router02 internal _dexRouterV2;
    address internal _growthAddress;
    address internal wethAddr;
    address[5] internal _sisterOAs;
    mapping(address => bool) internal _isAMMPair;
    mapping(address => bool) internal _paysNoFee;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => uint256) internal _balances;
    string private _name;
    string private _symbol;
    uint256 internal _oaIndex = 4;
    uint256 internal _totalSupply = 1_000_000_000_000_000_000_000_000_000_000;
    uint256 internal constant _BIPS = 10000;
    uint256 private constant _DECIMALS = 18;
    address internal constant _BURN_ADDRESS = address(0x369);

    constructor(
        string memory nameA,
        string memory symbolA,
        address growthAddressA,
        address[5] memory sisterOAsA
    ) {
        _name = nameA;
        _symbol = symbolA;
        _growthAddress = growthAddressA;
        _sisterOAs = sisterOAsA;

        _dexRouterV2 = IUniswapV2Router02(
            0xDaE9dd3d1A52CfCe9d5F2fAC7fDe164D500E50f7
            // 0x98bf93ebf5c380C0e6Ae8e192A7e2AE08edAcc02
        );

        _dexFactoryV2 = IUniswapV2Factory(_dexRouterV2.factory());

        wethAddr = _dexRouterV2.WPLS();

        _paysNoFee[msg.sender] = true;
        _paysNoFee[address(this)] = true;
        _paysNoFee[address(_dexRouterV2)] = true;
    }

    receive() external payable {}

    fallback() external payable {}

    function _airdropTokens(address to, uint256 amount) internal virtual;

    function _approve(address owner, address spender, uint256 amount) internal {
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _checkIfAMMPair(address target) internal {
        if (target.code.length == 0) return;
        if (target == address(_dexRouterV2)) return;
        if (target == wethAddr) return;
        if (!_isAMMPair[target]) {
            address token0 = _getToken0(target);
            if (token0 == address(0)) {
                return;
            }

            address token1 = _getToken1(target);
            if (token1 == address(0)) {
                return;
            }

            _approve(target, target, type(uint256).max);
            _isAMMPair[target] = true;
        }
    }

    function _getOriginAddress() internal returns (address) {
        if (_oaIndex < (_sisterOAs.length - 1)) {
            _oaIndex = _oaIndex + 1;
        } else {
            _oaIndex = 0;
        }
        return _sisterOAs[_oaIndex];
    }

    function _transfer(
        address owner,
        address to,
        uint256 amount
    ) internal virtual;

    function airdrop(Airdrop[] calldata receivers) external onlyOwner {
        for (uint256 index; index < receivers.length; ++index) {
            if (
                receivers[index].user != address(0) &&
                receivers[index].ethers != 0
            ) {
                _airdropTokens(
                    receivers[index].user,
                    receivers[index].ethers * 1_000_000_000_000_000_000
                );
            }
        }
    }

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

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

    function decimals() external pure returns (uint256) {
        return _DECIMALS;
    }

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) external returns (bool) {
        address owner = msg.sender;
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "BSKR: Decreases below 0");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) external returns (bool) {
        address owner = msg.sender;
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

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

    function pauseContract() external onlyManager {
        _pause();
    }

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

    function totalSupply() external view override returns (uint256) {
        return _totalSupply;
    }

    function transfer(
        address to,
        uint256 amount
    ) external override returns (bool) {
        address owner = msg.sender;
        _transfer(owner, to, amount);
        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external override returns (bool) {
        address spender = msg.sender;
        uint256 currentAllowance = allowance(from, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "BB: Insufficient allowance");
            unchecked {
                _approve(from, spender, currentAllowance - amount);
            }
        }
        _transfer(from, to, amount);
        return true;
    }

    function unPauseContract() external onlyManager {
        _unpause();
    }

    function withdraw() external payable {
        uint256 amount = address(this).balance;
        require(amount > 0, "Zero Balance");

        (bool sent, ) = owner().call{value: amount}("");
        require(sent, "Send Failed");
    }

    function reclaimToken(IERC20 token) external onlyOwner {
        uint256 balance = token.balanceOf(address(this));
        token.transfer(owner(), balance);
    }

    function burn(uint256 amount_) external whenNotPaused {
        _balances[msg.sender] -= amount_;
        _balances[_BURN_ADDRESS] += amount_;
        emit Transfer(msg.sender, _BURN_ADDRESS, amount_);
    }

    function burnFrom(address account_, uint256 amount_) public virtual whenNotPaused {
        uint256 currentAllowance = _allowances[account_][msg.sender];
        if (currentAllowance != type(uint256).max) {
            _approve(account_, msg.sender, currentAllowance - amount_);
        }
        _balances[account_] -= amount_;
        _balances[_BURN_ADDRESS] += amount_;
        emit Transfer(account_, _BURN_ADDRESS, amount_);
    }
}
          

contracts/imports/IBSKR.sol

/*
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.19;

interface IBSKR {
    function approve(address spender, uint256 amount) external returns (bool);

    function balanceOf(address wallet) external view returns (uint256);

    function stakeTransfer(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

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

contracts/imports/Manageable.sol

/*
 * SPDX-License-Identifier: MIT
 */
pragma solidity ^0.8.19;

abstract contract Manageable {
    address private _manager;

    event ManagementTransferred(
        address indexed previousManager,
        address indexed newManager
    );

    constructor() {
        _manager = msg.sender;
        emit ManagementTransferred(address(0), msg.sender);
    }

    function _checkManager() private view {
        require(_manager == msg.sender, "M: Caller not manager");
    }

    function manager() external view returns (address) {
        return _manager;
    }

    modifier onlyManager() {
        _checkManager();
        _;
    }

    function transferManagement(address newManager) external onlyManager {
        emit ManagementTransferred(_manager, newManager);
        _manager = newManager;
    }
}
          

contracts/lib/Utils.sol

/*
 * SPDX-License-Identifier: MIT
 */
pragma solidity ^0.8.19;

contract Utils {
    uint24 private constant _SECS_IN_FOUR_WEEKS = 2419200;

    function _callAndParseAddressReturn(
        address token,
        bytes4 selector
    ) internal view returns (address) {
        (bool success, bytes memory data) = token.staticcall(
            abi.encodeWithSelector(selector)
        );

        if (!success || data.length == 0) {
            return address(0);
        }

        if (data.length == 32) {
            return abi.decode(data, (address));
        }

        return address(0);
    }

    function _getToken0(
        address target
    ) internal view returns (address targetToken0) {
        targetToken0 = _callAndParseAddressReturn(
            target,
            hex"0dfe1681"
        );

        return targetToken0;
    }

    function _getToken1(
        address target
    ) internal view returns (address targetToken1) {
        targetToken1 = _callAndParseAddressReturn(
            target,
            hex"d21220a7"
        );

        return targetToken1;
    }

    function _penaltyFor(
        uint256 fromTimestamp,
        uint256 toTimestamp
    ) internal pure returns (uint256 penaltyBasis) {
        if (fromTimestamp + 52 weeks > toTimestamp) {
            uint256 fourWeeksElapsed = (toTimestamp - fromTimestamp) /
                _SECS_IN_FOUR_WEEKS;
            if (fourWeeksElapsed < 13) {
                penaltyBasis = ((13 - fourWeeksElapsed) * 100);
            }
        }
        return penaltyBasis;
    }
}
          

contracts/openzeppelin/access/Ownable.sol

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

abstract contract Ownable {
    address private _owner;

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

    constructor() {
        _transferOwnership(msg.sender);
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        require(owner() == msg.sender, "Ownable: caller is not the owner");
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
          

contracts/openzeppelin/security/Pausable.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

abstract contract Pausable {
    event Paused(address account);

    event Unpaused(address account);

    bool private _paused;

    constructor() {
        _paused = false;
    }

    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    modifier whenPaused() {
        _requirePaused();
        _;
    }

    function paused() public view virtual returns (bool) {
        return _paused;
    }

    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(msg.sender);
    }

    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(msg.sender);
    }
}
          

contracts/openzeppelin/token/ERC20/IERC20.sol

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

interface IERC20 {
    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address to, 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}
          

contracts/uniswap/v2-core/interfaces/IUniswapV2Factory.sol

/*
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.19;

interface IUniswapV2Factory {
    function createPair(
        address tokenA,
        address tokenB
    ) external returns (address pair);
}
          

contracts/uniswap/v2-periphery/interfaces/IUniswapV2Router01.sol

/*
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.19;

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

    function WPLS() 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);
}
          

contracts/uniswap/v2-periphery/interfaces/IUniswapV2Router02.sol

/*
 * SPDX-License-Identifier: MIT
 */

pragma solidity ^0.8.19;

import "./IUniswapV2Router01.sol";

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

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{}}
              

Contract ABI

[{"type":"constructor","inputs":[{"type":"address","name":"oldBSKR_","internalType":"contract IBSKR"},{"type":"string","name":"name_","internalType":"string"},{"type":"string","name":"symbol_","internalType":"string"},{"type":"address","name":"growthAddress_","internalType":"address"},{"type":"address","name":"lbskrAddr_","internalType":"address"},{"type":"address[5]","name":"sisterOAs_","internalType":"address[5]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"airdrop","inputs":[{"type":"tuple[]","name":"receivers","internalType":"struct BaseBSKR.Airdrop[]","components":[{"type":"address"},{"type":"uint256"}]}]},{"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":"wallet_","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnFrom","inputs":[{"type":"address","name":"account_","internalType":"address"},{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"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":"giftReflection","inputs":[{"type":"uint256","name":"tAmount_","internalType":"uint256"}]},{"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":"address","name":"","internalType":"address"}],"name":"manager","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"migrate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pauseContract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"reclaimToken","inputs":[{"type":"address","name":"token","internalType":"contract IERC20"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapAndLiquifyEnabled","inputs":[{"type":"bool","name":"enabled_","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"stakeTransfer","inputs":[{"type":"address","name":"from_","internalType":"address"},{"type":"address","name":"to_","internalType":"address"},{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","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":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferManagement","inputs":[{"type":"address","name":"newManager","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unPauseContract","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"withdraw","inputs":[]},{"type":"event","name":"AddLPEnabledUpdated","inputs":[{"type":"bool","name":"enabled","indexed":false}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","indexed":true},{"type":"address","name":"spender","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false},{"type":"event","name":"ManagementTransferred","inputs":[{"type":"address","name":"previousManager","indexed":true},{"type":"address","name":"newManager","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"type":"address","name":"account","indexed":false}],"anonymous":false},{"type":"event","name":"SwapAndLiquify","inputs":[{"type":"uint256","name":"tokensSwapped","indexed":false},{"type":"uint256","name":"ethReceived","indexed":false},{"type":"uint256","name":"tokensIntoLiqudity","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","indexed":true},{"type":"address","name":"to","indexed":true},{"type":"uint256","name":"value","indexed":false}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"type":"address","name":"account","indexed":false}],"anonymous":false},{"type":"receive"},{"type":"fallback"}]
              

Contract Creation Code

0x608060405260046011556c0c9f2c9cd04674edea4000000060128190556017805460ff19166001179055620000379060001962000876565b6200004590600019620008af565b601a556c01431e0fae6d7217caa0000000601b556040805160608101825260c88152603260208201526101f4918101919091526200008890601d90600362000773565b503480156200009657600080fd5b506040516200321538038062003215833981016040819052620000b991620009e2565b84848483620000c83362000638565b6000805460ff60a01b19168155600180546001600160a01b031916339081179091556040519091907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c85908290a3600f62000123858262000b7e565b50601062000132848262000b7e565b50600480546001600160a01b0319166001600160a01b0384161790556200015d600682600562000814565b50600380546001600160a01b03191673dae9dd3d1a52cfce9d5f2fac7fde164d500e50f79081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620001c3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001e9919062000c4a565b600280546001600160a01b0319166001600160a01b039283161790556003546040805163ef8ef56f60e01b81529051919092169163ef8ef56f9160048083019260209291908290030181865afa15801562000248573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026e919062000c4a565b600560006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001600c6000336001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000306001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600c6000600360009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505085601360006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081601460006101000a8154816001600160a01b0302191690836001600160a01b03160217905550601a5460196000336001600160a01b03166001600160a01b0316815260200190815260200160002081905550601254600e6000336001600160a01b03166001600160a01b0316815260200190815260200160002081905550600260009054906101000a90046001600160a01b03166001600160a01b031663c9c6539630600560009054906101000a90046001600160a01b03166040518363ffffffff1660e01b81526004016200047b9291906001600160a01b0392831681529116602082015260400190565b6020604051808303816000875af11580156200049b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004c1919062000c4a565b601580546001600160a01b0319166001600160a01b03929092169182179055620004ef908060001962000688565b601580546001600160a01b039081166000908152600b60205260409020805460ff191660011790559054620005259116620006e9565b60005b6005811015620005b6576001600c6000600684600581106200054e576200054e62000c71565b01546001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620005a36006826005811062000592576200059262000c71565b01546001600160a01b0316620006e9565b620005ae8162000c87565b905062000528565b50620005c233620006e9565b620005cd30620006e9565b601554620005e4906001600160a01b0316620006e9565b620005f1610369620006e9565b60125460405190815233906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350505050505062000ca3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038381166000818152600d602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03811660009081526018602052604090205460ff1662000770576001600160a01b0381166000818152601860205260408120805460ff191660019081179091556016805491820181559091527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890180546001600160a01b03191690911790555b50565b600183019183908215620008025791602002820160005b83821115620007ce57835183826101000a81548163ffffffff021916908361ffff16021790555092602001926004016020816003010492830192600103026200078a565b8015620008005782816101000a81549063ffffffff0219169055600401602081600301049283019260010302620007ce565b505b50620008109291506200085f565b5090565b826005810192821562000802579160200282015b828111156200080257825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000828565b5b8082111562000810576000815560010162000860565b6000826200089457634e487b7160e01b600052601260045260246000fd5b500690565b634e487b7160e01b600052601160045260246000fd5b81810381811115620008c557620008c562000899565b92915050565b6001600160a01b03811681146200077057600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b03811182821017156200091c576200091c620008e1565b60405290565b604051601f8201601f191681016001600160401b03811182821017156200094d576200094d620008e1565b604052919050565b600082601f8301126200096757600080fd5b81516001600160401b03811115620009835762000983620008e1565b602062000999601f8301601f1916820162000922565b8281528582848701011115620009ae57600080fd5b60005b83811015620009ce578581018301518282018401528201620009b1565b506000928101909101919091529392505050565b60008060008060008061014080888a031215620009fe57600080fd5b875162000a0b81620008cb565b602089810151919850906001600160401b038082111562000a2b57600080fd5b62000a398c838d0162000955565b985060408b015191508082111562000a5057600080fd5b5062000a5f8b828c0162000955565b965050606089015162000a7281620008cb565b60808a015190955062000a8581620008cb565b935060bf89018a1362000a9757600080fd5b62000aa1620008f7565b91890191808b84111562000ab457600080fd5b60a08b015b8481101562000add57805162000acf81620008cb565b835291830191830162000ab9565b50809450505050509295509295509295565b600181811c9082168062000b0457607f821691505b60208210810362000b2557634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000b7957600081815260208120601f850160051c8101602086101562000b545750805b601f850160051c820191505b8181101562000b755782815560010162000b60565b5050505b505050565b81516001600160401b0381111562000b9a5762000b9a620008e1565b62000bb28162000bab845462000aef565b8462000b2b565b602080601f83116001811462000bea576000841562000bd15750858301515b600019600386901b1c1916600185901b17855562000b75565b600085815260208120601f198616915b8281101562000c1b5788860151825594840194600190910190840162000bfa565b508582101562000c3a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000c5d57600080fd5b815162000c6a81620008cb565b9392505050565b634e487b7160e01b600052603260045260246000fd5b60006001820162000c9c5762000c9c62000899565b5060010190565b6125628062000cb36000396000f3fe6080604052600436106101a35760003560e01c8063715018a6116100e0578063bac1520311610084578063e0c9ffc611610061578063e0c9ffc61461047a578063e4edf8521461049a578063f2fde38b146104ba578063f66897f8146104da57005b8063bac1520314610425578063c49b9a801461043a578063dd62ed3e1461045a57005b80638fd3ab80116100bd5780638fd3ab80146103bb57806395d89b41146103d0578063a457c2d7146103e5578063a9059cbb1461040557005b8063715018a61461036857806379cc67901461037d5780638da5cb5b1461039d57005b80633ccfd60b11610147578063481c6a7511610124578063481c6a75146102d75780635c975abb146103095780636c74dd511461032857806370a082311461034857005b80633ccfd60b1461029a57806342966c68146102a2578063439766ce146102c257005b806318160ddd1161018057806318160ddd1461022757806323b872dd14610246578063313ce56714610266578063395093511461027a57005b806306fdde03146101ac578063095ea7b3146101d757806317ffc3201461020757005b366101aa57005b005b3480156101b857600080fd5b506101c16104fa565b6040516101ce919061215c565b60405180910390f35b3480156101e357600080fd5b506101f76101f23660046121a4565b61058c565b60405190151581526020016101ce565b34801561021357600080fd5b506101aa6102223660046121d0565b6105a6565b34801561023357600080fd5b506012545b6040519081526020016101ce565b34801561025257600080fd5b506101f76102613660046121ed565b6106b2565b34801561027257600080fd5b506012610238565b34801561028657600080fd5b506101f76102953660046121a4565b610744565b6101aa610766565b3480156102ae57600080fd5b506101aa6102bd36600461222e565b610838565b3480156102ce57600080fd5b506101aa6108d1565b3480156102e357600080fd5b506001546001600160a01b03165b6040516001600160a01b0390911681526020016101ce565b34801561031557600080fd5b50600054600160a01b900460ff166101f7565b34801561033457600080fd5b506101f76103433660046121ed565b6108e3565b34801561035457600080fd5b506102386103633660046121d0565b610940565b34801561037457600080fd5b506101aa610a15565b34801561038957600080fd5b506101aa6103983660046121a4565b610a27565b3480156103a957600080fd5b506000546001600160a01b03166102f1565b3480156103c757600080fd5b506101aa610b11565b3480156103dc57600080fd5b506101c1610d59565b3480156103f157600080fd5b506101f76104003660046121a4565b610d68565b34801561041157600080fd5b506101f76104203660046121a4565b610de0565b34801561043157600080fd5b506101aa610dee565b34801561044657600080fd5b506101aa610455366004612255565b610dfe565b34801561046657600080fd5b50610238610475366004612272565b610e4d565b34801561048657600080fd5b506101aa6104953660046122ab565b610e78565b3480156104a657600080fd5b506101aa6104b53660046121d0565b610f5c565b3480156104c657600080fd5b506101aa6104d53660046121d0565b610fc0565b3480156104e657600080fd5b506101aa6104f536600461222e565b611036565b6060600f805461050990612320565b80601f016020809104026020016040519081016040528092919081815260200182805461053590612320565b80156105825780601f1061055757610100808354040283529160200191610582565b820191906000526020600020905b81548152906001019060200180831161056557829003601f168201915b5050505050905090565b60003361059a8185856111a5565b60019150505b92915050565b6105ae6111fe565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156105f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610619919061235a565b9050816001600160a01b031663a9059cbb61063c6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ad9190612373565b505050565b600033816106c08683610e4d565b9050600019811461072d57838110156107205760405162461bcd60e51b815260206004820152601a60248201527f42423a20496e73756666696369656e7420616c6c6f77616e636500000000000060448201526064015b60405180910390fd5b61072d86838684036111a5565b610738868686611267565b50600195945050505050565b60003361059a8185856107578383610e4d565b61076191906123a6565b6111a5565b47806107a35760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b6044820152606401610717565b600080546040516001600160a01b039091169083908381818185875af1925050503d80600081146107f0576040519150601f19603f3d011682016040523d82523d6000602084013e6107f5565b606091505b50509050806108345760405162461bcd60e51b815260206004820152600b60248201526a14d95b990811985a5b195960aa1b6044820152606401610717565b5050565b6108406116a2565b336000908152600e60205260408120805483929061085f9084906123b9565b90915550506103696000908152600e6020527fdaba2d923ee891bb3c880839102100d0a0e1a41867de23e44720a64eb0fc032880548392906108a29084906123a6565b909155505060405181815261036990339060008051602061250d8339815191529060200160405180910390a350565b6108d96116ef565b6108e1611741565b565b6014546000906001600160a01b031633146108fd57600080fd5b6001600160a01b038085166000908152601860205260408082205492861682528120546109369287928792879260ff9081169116611792565b5060019392505050565b6001600160a01b03811660009081526018602052604081205460ff161561097d57506001600160a01b03166000908152600e602052604090205490565b601a546001600160a01b03831660009081526019602052604090205411156109dd5760405162461bcd60e51b8152602060048201526013602482015272423a20416d6f756e7420746f6f206c6172676560681b6044820152606401610717565b60006109e76119d4565b6001600160a01b038416600090815260196020526040902054909150610a0e9082906123cc565b9392505050565b610a1d6111fe565b6108e16000611b63565b610a2f6116a2565b6001600160a01b0382166000908152600d602090815260408083203384529091529020546000198114610a6b57610a6b833361076185856123b9565b6001600160a01b0383166000908152600e602052604081208054849290610a939084906123b9565b90915550506103696000908152600e6020527fdaba2d923ee891bb3c880839102100d0a0e1a41867de23e44720a64eb0fc03288054849290610ad69084906123a6565b9091555050604051828152610369906001600160a01b0385169060008051602061250d833981519152906020015b60405180910390a3505050565b6013546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7e919061235a565b6013546040516370a0823160e01b81523360048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610bcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf0919061235a565b11610c345760405162461bcd60e51b81526020600482015260146024820152734e6f20746f6b656e7320746f206d69677261746560601b6044820152606401610717565b60135460405163095ea7b360e01b8152306004820152602481018390526001600160a01b039091169063095ea7b3906044016020604051808303816000875af1158015610c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca99190612373565b506013546040516323b872dd60e01b81523360048201526103696024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d279190612373565b5030600081815260186020526040808220543380845291832054610d5694938692909160ff9182169116611792565b50565b60606010805461050990612320565b60003381610d768286610e4d565b905083811015610dc85760405162461bcd60e51b815260206004820152601760248201527f42534b523a204465637265617365732062656c6f7720300000000000000000006044820152606401610717565b610dd582868684036111a5565b506001949350505050565b60003361059a818585611267565b610df66116ef565b6108e1611bb3565b610e066116ef565b6017805460ff19168215159081179091556040519081527f91c8e5d8409e58da1d940ede98e9b35e17b453932366ea0a790416ab922ca4129060200160405180910390a150565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b610e806111fe565b60005b818110156106ad576000838383818110610e9f57610e9f6123ee565b610eb592602060409092020190810191506121d0565b6001600160a01b031614158015610ee85750828282818110610ed957610ed96123ee565b90506040020160200135600014155b15610f4c57610f4c838383818110610f0257610f026123ee565b610f1892602060409092020190810191506121d0565b848484818110610f2a57610f2a6123ee565b90506040020160200135670de0b6b3a7640000610f479190612404565b611bf8565b610f558161241b565b9050610e83565b610f646116ef565b6001546040516001600160a01b038084169216907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b610fc86111fe565b6001600160a01b03811661102d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610717565b610d5681611b63565b61103e6116a2565b806000036110845760405162461bcd60e51b8152602060048201526013602482015272108e8816995c9bc819da599d08185b5bdd5b9d606a1b6044820152606401610717565b3360009081526018602052604090205460ff16156110d95760405162461bcd60e51b8152602060048201526012602482015271108e88115e18db1d591959081dd85b1b195d60721b6044820152606401610717565b60006110e682600a611c35565b6020808201513360009081526019909252604090912054919250106111415760405162461bcd60e51b8152602060048201526011602482015270423a204769667420746f6f206c6172676560781b6044820152606401610717565b6020808201513360009081526019909252604082208054919290916111679084906123b9565b90915550506020810151601a80546000906111839084906123b9565b9250508190555081601c600082825461119c91906123a6565b90915550505050565b6001600160a01b038381166000818152600d602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610b04565b336112116000546001600160a01b031690565b6001600160a01b0316146108e15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610717565b61127083611d94565b6001600160a01b0383166000908152600b602052604090205460ff161561129a5761129a83611e6f565b6112a382611d94565b6001600160a01b0382166000908152600b602052604090205460ff16156112cd576112cd82611e6f565b60006112d830610940565b9050601b5481101580156112f45750601754610100900460ff16155b801561130e57506015546001600160a01b03858116911614155b801561131c575060175460ff165b156115ca576017805461ff001916610100179055601b54600181901c906000906113479083906123b9565b60408051600280825260608201835292935047926000926020830190803683370190505090503081600081518110611381576113816123ee565b6001600160a01b0392831660209182029290920101526005548251911690829060019081106113b2576113b26123ee565b60200260200101906001600160a01b031690816001600160a01b0316815250506113dd3030866111a5565b6003546113f59030906001600160a01b0316866111a5565b6003546001600160a01b031663791ac947856000843061141642600f6123a6565b6040518663ffffffff1660e01b8152600401611436959493929190612434565b600060405180830381600087803b15801561145057600080fd5b505af1158015611464573d6000803e3d6000fd5b505050506000824761147691906123b9565b6003549091506114919030906001600160a01b0316866111a5565b6003546001600160a01b031663f305d7198230876000806114b0611ef5565b6114bb42600f6123a6565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015611528573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061154d91906124a5565b505060408051878152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a161271061159f610369610940565b6012546115ac91906123b9565b6115b691906123cc565b601b5550506017805461ff00191690555050505b6001600160a01b0384166000908152600c602052604090205460019060ff168061160c57506001600160a01b0384166000908152600c602052604090205460ff165b15611615575060005b6001600160a01b0385166000908152600b602052604090205460ff1615801561165757506001600160a01b0384166000908152600b602052604090205460ff16155b15611660575060005b6001600160a01b0380861660009081526018602052604080822054928716825290205461169b91879187918791869160ff9081169116611792565b5050505050565b600054600160a01b900460ff16156108e15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610717565b6001546001600160a01b031633146108e15760405162461bcd60e51b8152602060048201526015602482015274269d1021b0b63632b9103737ba1036b0b730b3b2b960591b6044820152606401610717565b6117496116a2565b6000805460ff60a01b1916600160a01b1790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020015b60405180910390a1565b61179a6116a2565b600a836117a5575060005b60006117b18683611c35565b905083156117e7576001600160a01b0388166000908152600e6020526040812080548892906117e19084906123b9565b90915550505b6020808201516001600160a01b038a1660009081526019909252604082208054919290916118169084906123b9565b909155505082156118515780516001600160a01b0388166000908152600e60205260408120805490919061184b9084906123a6565b90915550505b6040808201516001600160a01b0389166000908152601960205291822080549192909161187f9084906123a6565b9091555050606081015180156119965760a0820151601a80548291906000906118a99084906123b9565b9250508190555081601c60008282546118c291906123a6565b909155506118d590506103698383611f4d565b604051828152610369906001600160a01b038c169060008051602061250d8339815191529060200160405180910390a3608083015160c0840151600454611926906001600160a01b03168383611f4d565b6004546040518381526001600160a01b03918216918e169060008051602061250d8339815191529060200160405180910390a3611964308383611f4d565b60405182815230906001600160a01b038e169060008051602061250d8339815191529060200160405180910390a35050505b81516040519081526001600160a01b0389811691908b169060008051602061250d8339815191529060200160405180910390a3505050505050505050565b601a5460125460009190825b601654811015611b2a57826019600060168481548110611a0257611a026123ee565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611a6d575081600e600060168481548110611a4657611a466123ee565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611a8a57601254601a54611a8291906123cc565b935050505090565b6019600060168381548110611aa157611aa16123ee565b60009182526020808320909101546001600160a01b03168352820192909252604001902054611ad090846123b9565b9250600e600060168381548110611ae957611ae96123ee565b60009182526020808320909101546001600160a01b03168352820192909252604001902054611b1890836123b9565b9150611b238161241b565b90506119e0565b50601254601a54611b3b91906123cc565b821015611b5957601254601a54611b5291906123cc565b9250505090565b611b5281836123cc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611bbb611fcd565b6000805460ff60a01b191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602001611788565b610834611c0d6000546001600160a01b031690565b6001600160a01b0384166000908152601860205260408120548591859160019060ff16611792565b611c3d61211a565b6000611c476119d4565b9050611c538185612404565b60208301526000839003611c7857838252611c6e8185612404565b6040830152611d8d565b601d54600a90849061271090611c949063ffffffff1688612404565b611c9e91906123cc565b611ca89190612404565b611cb291906123cc565b6060830152601d54600a90849061271090611cdb90640100000000900463ffffffff1688612404565b611ce591906123cc565b611cef9190612404565b611cf991906123cc565b6080830152601d54600a90849061271090611d269068010000000000000000900463ffffffff1688612404565b611d3091906123cc565b611d3a9190612404565b611d4491906123cc565b611d4e90856123b9565b82526060820151611d60908290612404565b60a08301526080820151611d75908290612404565b60c08301528151611d87908290612404565b60408301525b5092915050565b806001600160a01b03163b600003611da95750565b6003546001600160a01b0390811690821603611dc25750565b6005546001600160a01b0390811690821603611ddb5750565b6001600160a01b0381166000908152600b602052604090205460ff16610d56576000611e068261201d565b90506001600160a01b038116611e1a575050565b6000611e2583612030565b90506001600160a01b038116611e3a57505050565b611e4783846000196111a5565b50506001600160a01b0381166000908152600b60205260409020805460ff1916600117905550565b6001600160a01b03811660009081526018602052604090205460ff16610d56576001600160a01b03166000818152601860205260408120805460ff191660019081179091556016805491820181559091527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890180546001600160a01b0319169091179055565b6000611f03600160056123b9565b6011541015611f2257601154611f1a9060016123a6565b601155611f28565b60006011555b600660115460058110611f3d57611f3d6123ee565b01546001600160a01b0316919050565b6001600160a01b03831660009081526019602052604081208054839290611f759084906123a6565b90915550506001600160a01b03831660009081526018602052604090205460ff16156106ad576001600160a01b0383166000908152600e602052604081208054849290611fc39084906123a6565b9091555050505050565b600054600160a01b900460ff166108e15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610717565b60006105a082630dfe168160e01b61203f565b60006105a08263d21220a760e01b5b60408051600481526024810182526020810180516001600160e01b03166001600160e01b031985161790529051600091829182916001600160a01b0387169161208891906124d3565b600060405180830381855afa9150503d80600081146120c3576040519150601f19603f3d011682016040523d82523d6000602084013e6120c8565b606091505b50915091508115806120d957508051155b156120e9576000925050506105a0565b805160200361210f578080602001905181019061210691906124ef565b925050506105a0565b506000949350505050565b6040518060e001604052806007906020820280368337509192915050565b60005b8381101561215357818101518382015260200161213b565b50506000910152565b602081526000825180602084015261217b816040850160208701612138565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610d5657600080fd5b600080604083850312156121b757600080fd5b82356121c28161218f565b946020939093013593505050565b6000602082840312156121e257600080fd5b8135610a0e8161218f565b60008060006060848603121561220257600080fd5b833561220d8161218f565b9250602084013561221d8161218f565b929592945050506040919091013590565b60006020828403121561224057600080fd5b5035919050565b8015158114610d5657600080fd5b60006020828403121561226757600080fd5b8135610a0e81612247565b6000806040838503121561228557600080fd5b82356122908161218f565b915060208301356122a08161218f565b809150509250929050565b600080602083850312156122be57600080fd5b823567ffffffffffffffff808211156122d657600080fd5b818501915085601f8301126122ea57600080fd5b8135818111156122f957600080fd5b8660208260061b850101111561230e57600080fd5b60209290920196919550909350505050565b600181811c9082168061233457607f821691505b60208210810361235457634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561236c57600080fd5b5051919050565b60006020828403121561238557600080fd5b8151610a0e81612247565b634e487b7160e01b600052601160045260246000fd5b808201808211156105a0576105a0612390565b818103818111156105a0576105a0612390565b6000826123e957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176105a0576105a0612390565b60006001820161242d5761242d612390565b5060010190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156124845784516001600160a01b03168352938301939183019160010161245f565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156124ba57600080fd5b8351925060208401519150604084015190509250925092565b600082516124e5818460208701612138565b9190910192915050565b60006020828403121561250157600080fd5b8151610a0e8161218f56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122047712c290dd6b7101ab637f8f1e3789dce663035be5fc456e1b5bb1fa2142cbd64736f6c634300081300330000000000000000000000000a4740b91d6fa3ee8e993540169a04069fe72b4a000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000001800000000000000000000000004f06fccaa501b7bb9f9afcefb20f7862be050b7d0000000000000000000000001135fab3645529d12fad9b44898034d57cbba92e000000000000000000000000000000015d3638a850b12d1d3fcf284b5dd529d50000000000000000000000001988d578de9a3468329de348e5a0e6cdc4369df9000000000000000000000000000000146e609e2eb40346c668a17fc32aa4bd7c00000000000000000000000053e011d48f0164a3d58fb8591060e7b05e744818000000000000000000000000000000180803cdb49fb17a098338af68ffb831360000000000000000000000000000000000000000000000000000000000000009423646424244303834000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000094236464242443038340000000000000000000000000000000000000000000000

Deployed ByteCode

0x6080604052600436106101a35760003560e01c8063715018a6116100e0578063bac1520311610084578063e0c9ffc611610061578063e0c9ffc61461047a578063e4edf8521461049a578063f2fde38b146104ba578063f66897f8146104da57005b8063bac1520314610425578063c49b9a801461043a578063dd62ed3e1461045a57005b80638fd3ab80116100bd5780638fd3ab80146103bb57806395d89b41146103d0578063a457c2d7146103e5578063a9059cbb1461040557005b8063715018a61461036857806379cc67901461037d5780638da5cb5b1461039d57005b80633ccfd60b11610147578063481c6a7511610124578063481c6a75146102d75780635c975abb146103095780636c74dd511461032857806370a082311461034857005b80633ccfd60b1461029a57806342966c68146102a2578063439766ce146102c257005b806318160ddd1161018057806318160ddd1461022757806323b872dd14610246578063313ce56714610266578063395093511461027a57005b806306fdde03146101ac578063095ea7b3146101d757806317ffc3201461020757005b366101aa57005b005b3480156101b857600080fd5b506101c16104fa565b6040516101ce919061215c565b60405180910390f35b3480156101e357600080fd5b506101f76101f23660046121a4565b61058c565b60405190151581526020016101ce565b34801561021357600080fd5b506101aa6102223660046121d0565b6105a6565b34801561023357600080fd5b506012545b6040519081526020016101ce565b34801561025257600080fd5b506101f76102613660046121ed565b6106b2565b34801561027257600080fd5b506012610238565b34801561028657600080fd5b506101f76102953660046121a4565b610744565b6101aa610766565b3480156102ae57600080fd5b506101aa6102bd36600461222e565b610838565b3480156102ce57600080fd5b506101aa6108d1565b3480156102e357600080fd5b506001546001600160a01b03165b6040516001600160a01b0390911681526020016101ce565b34801561031557600080fd5b50600054600160a01b900460ff166101f7565b34801561033457600080fd5b506101f76103433660046121ed565b6108e3565b34801561035457600080fd5b506102386103633660046121d0565b610940565b34801561037457600080fd5b506101aa610a15565b34801561038957600080fd5b506101aa6103983660046121a4565b610a27565b3480156103a957600080fd5b506000546001600160a01b03166102f1565b3480156103c757600080fd5b506101aa610b11565b3480156103dc57600080fd5b506101c1610d59565b3480156103f157600080fd5b506101f76104003660046121a4565b610d68565b34801561041157600080fd5b506101f76104203660046121a4565b610de0565b34801561043157600080fd5b506101aa610dee565b34801561044657600080fd5b506101aa610455366004612255565b610dfe565b34801561046657600080fd5b50610238610475366004612272565b610e4d565b34801561048657600080fd5b506101aa6104953660046122ab565b610e78565b3480156104a657600080fd5b506101aa6104b53660046121d0565b610f5c565b3480156104c657600080fd5b506101aa6104d53660046121d0565b610fc0565b3480156104e657600080fd5b506101aa6104f536600461222e565b611036565b6060600f805461050990612320565b80601f016020809104026020016040519081016040528092919081815260200182805461053590612320565b80156105825780601f1061055757610100808354040283529160200191610582565b820191906000526020600020905b81548152906001019060200180831161056557829003601f168201915b5050505050905090565b60003361059a8185856111a5565b60019150505b92915050565b6105ae6111fe565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa1580156105f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610619919061235a565b9050816001600160a01b031663a9059cbb61063c6000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ad9190612373565b505050565b600033816106c08683610e4d565b9050600019811461072d57838110156107205760405162461bcd60e51b815260206004820152601a60248201527f42423a20496e73756666696369656e7420616c6c6f77616e636500000000000060448201526064015b60405180910390fd5b61072d86838684036111a5565b610738868686611267565b50600195945050505050565b60003361059a8185856107578383610e4d565b61076191906123a6565b6111a5565b47806107a35760405162461bcd60e51b815260206004820152600c60248201526b5a65726f2042616c616e636560a01b6044820152606401610717565b600080546040516001600160a01b039091169083908381818185875af1925050503d80600081146107f0576040519150601f19603f3d011682016040523d82523d6000602084013e6107f5565b606091505b50509050806108345760405162461bcd60e51b815260206004820152600b60248201526a14d95b990811985a5b195960aa1b6044820152606401610717565b5050565b6108406116a2565b336000908152600e60205260408120805483929061085f9084906123b9565b90915550506103696000908152600e6020527fdaba2d923ee891bb3c880839102100d0a0e1a41867de23e44720a64eb0fc032880548392906108a29084906123a6565b909155505060405181815261036990339060008051602061250d8339815191529060200160405180910390a350565b6108d96116ef565b6108e1611741565b565b6014546000906001600160a01b031633146108fd57600080fd5b6001600160a01b038085166000908152601860205260408082205492861682528120546109369287928792879260ff9081169116611792565b5060019392505050565b6001600160a01b03811660009081526018602052604081205460ff161561097d57506001600160a01b03166000908152600e602052604090205490565b601a546001600160a01b03831660009081526019602052604090205411156109dd5760405162461bcd60e51b8152602060048201526013602482015272423a20416d6f756e7420746f6f206c6172676560681b6044820152606401610717565b60006109e76119d4565b6001600160a01b038416600090815260196020526040902054909150610a0e9082906123cc565b9392505050565b610a1d6111fe565b6108e16000611b63565b610a2f6116a2565b6001600160a01b0382166000908152600d602090815260408083203384529091529020546000198114610a6b57610a6b833361076185856123b9565b6001600160a01b0383166000908152600e602052604081208054849290610a939084906123b9565b90915550506103696000908152600e6020527fdaba2d923ee891bb3c880839102100d0a0e1a41867de23e44720a64eb0fc03288054849290610ad69084906123a6565b9091555050604051828152610369906001600160a01b0385169060008051602061250d833981519152906020015b60405180910390a3505050565b6013546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7e919061235a565b6013546040516370a0823160e01b81523360048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa158015610bcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf0919061235a565b11610c345760405162461bcd60e51b81526020600482015260146024820152734e6f20746f6b656e7320746f206d69677261746560601b6044820152606401610717565b60135460405163095ea7b360e01b8152306004820152602481018390526001600160a01b039091169063095ea7b3906044016020604051808303816000875af1158015610c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca99190612373565b506013546040516323b872dd60e01b81523360048201526103696024820152604481018390526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610d03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d279190612373565b5030600081815260186020526040808220543380845291832054610d5694938692909160ff9182169116611792565b50565b60606010805461050990612320565b60003381610d768286610e4d565b905083811015610dc85760405162461bcd60e51b815260206004820152601760248201527f42534b523a204465637265617365732062656c6f7720300000000000000000006044820152606401610717565b610dd582868684036111a5565b506001949350505050565b60003361059a818585611267565b610df66116ef565b6108e1611bb3565b610e066116ef565b6017805460ff19168215159081179091556040519081527f91c8e5d8409e58da1d940ede98e9b35e17b453932366ea0a790416ab922ca4129060200160405180910390a150565b6001600160a01b039182166000908152600d6020908152604080832093909416825291909152205490565b610e806111fe565b60005b818110156106ad576000838383818110610e9f57610e9f6123ee565b610eb592602060409092020190810191506121d0565b6001600160a01b031614158015610ee85750828282818110610ed957610ed96123ee565b90506040020160200135600014155b15610f4c57610f4c838383818110610f0257610f026123ee565b610f1892602060409092020190810191506121d0565b848484818110610f2a57610f2a6123ee565b90506040020160200135670de0b6b3a7640000610f479190612404565b611bf8565b610f558161241b565b9050610e83565b610f646116ef565b6001546040516001600160a01b038084169216907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8590600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b610fc86111fe565b6001600160a01b03811661102d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610717565b610d5681611b63565b61103e6116a2565b806000036110845760405162461bcd60e51b8152602060048201526013602482015272108e8816995c9bc819da599d08185b5bdd5b9d606a1b6044820152606401610717565b3360009081526018602052604090205460ff16156110d95760405162461bcd60e51b8152602060048201526012602482015271108e88115e18db1d591959081dd85b1b195d60721b6044820152606401610717565b60006110e682600a611c35565b6020808201513360009081526019909252604090912054919250106111415760405162461bcd60e51b8152602060048201526011602482015270423a204769667420746f6f206c6172676560781b6044820152606401610717565b6020808201513360009081526019909252604082208054919290916111679084906123b9565b90915550506020810151601a80546000906111839084906123b9565b9250508190555081601c600082825461119c91906123a6565b90915550505050565b6001600160a01b038381166000818152600d602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259101610b04565b336112116000546001600160a01b031690565b6001600160a01b0316146108e15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610717565b61127083611d94565b6001600160a01b0383166000908152600b602052604090205460ff161561129a5761129a83611e6f565b6112a382611d94565b6001600160a01b0382166000908152600b602052604090205460ff16156112cd576112cd82611e6f565b60006112d830610940565b9050601b5481101580156112f45750601754610100900460ff16155b801561130e57506015546001600160a01b03858116911614155b801561131c575060175460ff165b156115ca576017805461ff001916610100179055601b54600181901c906000906113479083906123b9565b60408051600280825260608201835292935047926000926020830190803683370190505090503081600081518110611381576113816123ee565b6001600160a01b0392831660209182029290920101526005548251911690829060019081106113b2576113b26123ee565b60200260200101906001600160a01b031690816001600160a01b0316815250506113dd3030866111a5565b6003546113f59030906001600160a01b0316866111a5565b6003546001600160a01b031663791ac947856000843061141642600f6123a6565b6040518663ffffffff1660e01b8152600401611436959493929190612434565b600060405180830381600087803b15801561145057600080fd5b505af1158015611464573d6000803e3d6000fd5b505050506000824761147691906123b9565b6003549091506114919030906001600160a01b0316866111a5565b6003546001600160a01b031663f305d7198230876000806114b0611ef5565b6114bb42600f6123a6565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015611528573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061154d91906124a5565b505060408051878152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a161271061159f610369610940565b6012546115ac91906123b9565b6115b691906123cc565b601b5550506017805461ff00191690555050505b6001600160a01b0384166000908152600c602052604090205460019060ff168061160c57506001600160a01b0384166000908152600c602052604090205460ff165b15611615575060005b6001600160a01b0385166000908152600b602052604090205460ff1615801561165757506001600160a01b0384166000908152600b602052604090205460ff16155b15611660575060005b6001600160a01b0380861660009081526018602052604080822054928716825290205461169b91879187918791869160ff9081169116611792565b5050505050565b600054600160a01b900460ff16156108e15760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610717565b6001546001600160a01b031633146108e15760405162461bcd60e51b8152602060048201526015602482015274269d1021b0b63632b9103737ba1036b0b730b3b2b960591b6044820152606401610717565b6117496116a2565b6000805460ff60a01b1916600160a01b1790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020015b60405180910390a1565b61179a6116a2565b600a836117a5575060005b60006117b18683611c35565b905083156117e7576001600160a01b0388166000908152600e6020526040812080548892906117e19084906123b9565b90915550505b6020808201516001600160a01b038a1660009081526019909252604082208054919290916118169084906123b9565b909155505082156118515780516001600160a01b0388166000908152600e60205260408120805490919061184b9084906123a6565b90915550505b6040808201516001600160a01b0389166000908152601960205291822080549192909161187f9084906123a6565b9091555050606081015180156119965760a0820151601a80548291906000906118a99084906123b9565b9250508190555081601c60008282546118c291906123a6565b909155506118d590506103698383611f4d565b604051828152610369906001600160a01b038c169060008051602061250d8339815191529060200160405180910390a3608083015160c0840151600454611926906001600160a01b03168383611f4d565b6004546040518381526001600160a01b03918216918e169060008051602061250d8339815191529060200160405180910390a3611964308383611f4d565b60405182815230906001600160a01b038e169060008051602061250d8339815191529060200160405180910390a35050505b81516040519081526001600160a01b0389811691908b169060008051602061250d8339815191529060200160405180910390a3505050505050505050565b601a5460125460009190825b601654811015611b2a57826019600060168481548110611a0257611a026123ee565b60009182526020808320909101546001600160a01b031683528201929092526040019020541180611a6d575081600e600060168481548110611a4657611a466123ee565b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15611a8a57601254601a54611a8291906123cc565b935050505090565b6019600060168381548110611aa157611aa16123ee565b60009182526020808320909101546001600160a01b03168352820192909252604001902054611ad090846123b9565b9250600e600060168381548110611ae957611ae96123ee565b60009182526020808320909101546001600160a01b03168352820192909252604001902054611b1890836123b9565b9150611b238161241b565b90506119e0565b50601254601a54611b3b91906123cc565b821015611b5957601254601a54611b5291906123cc565b9250505090565b611b5281836123cc565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611bbb611fcd565b6000805460ff60a01b191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90602001611788565b610834611c0d6000546001600160a01b031690565b6001600160a01b0384166000908152601860205260408120548591859160019060ff16611792565b611c3d61211a565b6000611c476119d4565b9050611c538185612404565b60208301526000839003611c7857838252611c6e8185612404565b6040830152611d8d565b601d54600a90849061271090611c949063ffffffff1688612404565b611c9e91906123cc565b611ca89190612404565b611cb291906123cc565b6060830152601d54600a90849061271090611cdb90640100000000900463ffffffff1688612404565b611ce591906123cc565b611cef9190612404565b611cf991906123cc565b6080830152601d54600a90849061271090611d269068010000000000000000900463ffffffff1688612404565b611d3091906123cc565b611d3a9190612404565b611d4491906123cc565b611d4e90856123b9565b82526060820151611d60908290612404565b60a08301526080820151611d75908290612404565b60c08301528151611d87908290612404565b60408301525b5092915050565b806001600160a01b03163b600003611da95750565b6003546001600160a01b0390811690821603611dc25750565b6005546001600160a01b0390811690821603611ddb5750565b6001600160a01b0381166000908152600b602052604090205460ff16610d56576000611e068261201d565b90506001600160a01b038116611e1a575050565b6000611e2583612030565b90506001600160a01b038116611e3a57505050565b611e4783846000196111a5565b50506001600160a01b0381166000908152600b60205260409020805460ff1916600117905550565b6001600160a01b03811660009081526018602052604090205460ff16610d56576001600160a01b03166000818152601860205260408120805460ff191660019081179091556016805491820181559091527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890180546001600160a01b0319169091179055565b6000611f03600160056123b9565b6011541015611f2257601154611f1a9060016123a6565b601155611f28565b60006011555b600660115460058110611f3d57611f3d6123ee565b01546001600160a01b0316919050565b6001600160a01b03831660009081526019602052604081208054839290611f759084906123a6565b90915550506001600160a01b03831660009081526018602052604090205460ff16156106ad576001600160a01b0383166000908152600e602052604081208054849290611fc39084906123a6565b9091555050505050565b600054600160a01b900460ff166108e15760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610717565b60006105a082630dfe168160e01b61203f565b60006105a08263d21220a760e01b5b60408051600481526024810182526020810180516001600160e01b03166001600160e01b031985161790529051600091829182916001600160a01b0387169161208891906124d3565b600060405180830381855afa9150503d80600081146120c3576040519150601f19603f3d011682016040523d82523d6000602084013e6120c8565b606091505b50915091508115806120d957508051155b156120e9576000925050506105a0565b805160200361210f578080602001905181019061210691906124ef565b925050506105a0565b506000949350505050565b6040518060e001604052806007906020820280368337509192915050565b60005b8381101561215357818101518382015260200161213b565b50506000910152565b602081526000825180602084015261217b816040850160208701612138565b601f01601f19169190910160400192915050565b6001600160a01b0381168114610d5657600080fd5b600080604083850312156121b757600080fd5b82356121c28161218f565b946020939093013593505050565b6000602082840312156121e257600080fd5b8135610a0e8161218f565b60008060006060848603121561220257600080fd5b833561220d8161218f565b9250602084013561221d8161218f565b929592945050506040919091013590565b60006020828403121561224057600080fd5b5035919050565b8015158114610d5657600080fd5b60006020828403121561226757600080fd5b8135610a0e81612247565b6000806040838503121561228557600080fd5b82356122908161218f565b915060208301356122a08161218f565b809150509250929050565b600080602083850312156122be57600080fd5b823567ffffffffffffffff808211156122d657600080fd5b818501915085601f8301126122ea57600080fd5b8135818111156122f957600080fd5b8660208260061b850101111561230e57600080fd5b60209290920196919550909350505050565b600181811c9082168061233457607f821691505b60208210810361235457634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561236c57600080fd5b5051919050565b60006020828403121561238557600080fd5b8151610a0e81612247565b634e487b7160e01b600052601160045260246000fd5b808201808211156105a0576105a0612390565b818103818111156105a0576105a0612390565b6000826123e957634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176105a0576105a0612390565b60006001820161242d5761242d612390565b5060010190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156124845784516001600160a01b03168352938301939183019160010161245f565b50506001600160a01b03969096166060850152505050608001529392505050565b6000806000606084860312156124ba57600080fd5b8351925060208401519150604084015190509250925092565b600082516124e5818460208701612138565b9190910192915050565b60006020828403121561250157600080fd5b8151610a0e8161218f56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122047712c290dd6b7101ab637f8f1e3789dce663035be5fc456e1b5bb1fa2142cbd64736f6c63430008130033