false
true
0

Contract Address Details

0x1DcbF345bC44696BbBed402367f7C62e524Fe8B5

Token
pBSKR - pulselorian.com (pBSKR)
Creator
0xb0c2b1–982523 at 0x0943c5–8f32c2
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
2,349 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26039548
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
1000000
EVM Version
default




Verified at
2023-06-03T22:25:00.895799Z

Constructor Arguments

0x00000000000000000000000019ea5fa4d1dbd7413752b93f856b1cd165f2f21900000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000fb7103d7011dfa60c18c6961c5a38038d8048fe0000000000000000000000000d493b22ac1e70c0da743b0c61311aeea4f817eef00000000000000000000000035cef302da66733c076c10f85fc8097dce90bcc00000000000000000000000001988d578de9a3468329de348e5a0e6cdc4369df9000000000000000000000000cd75d401a91b076f274418c7fa6a973d7fb7fece00000000000000000000000053e011d48f0164a3d58fb8591060e7b05e7448180000000000000000000000007d6e237a514fbe12c65c3aa72525f61aa6a722d200000000000000000000000000000000000000000000000000000000000000177042534b52202d2070756c73656c6f7269616e2e636f6d00000000000000000000000000000000000000000000000000000000000000000000000000000000057042534b52000000000000000000000000000000000000000000000000000000
              

contracts/pBSKR.sol

/*
 * @title BSKR - Brings Serenity, Knowledge and Richness
 * @author Ra Murd <pulselorian@gmail.com>
 * @notice https://pulselorian.com/
 * @notice https://t.me/ThePulselorian
 * @notice 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 _num_tokens_for_lp = _TOTAL_SUPPLY / _BIPS;
    uint256 private _rTotal = (type(uint256).max -
        (type(uint256).max % _TOTAL_SUPPLY));
    uint256 private totalReflection;
    uint256[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] = _TOTAL_SUPPLY;
        emit Transfer(address(0), msg.sender, _TOTAL_SUPPLY);

        _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(_BURN_ADDRESS);

        uint256 balBurn = _oldBSKR.balanceOf(address(0));
        _balances[_BURN_ADDRESS] += balBurn;
        _balances[msg.sender] -= balBurn;
        emit Transfer(msg.sender, _BURN_ADDRESS, balBurn);
    }

    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 = _TOTAL_SUPPLY;

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

        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 =
                (_TOTAL_SUPPLY - balanceOf(_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(_BURN_ADDRESS, _tRfiFee_, _rRfiFee_);
            emit Transfer(sender_, _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:Amt large");
        uint256 currentRate = _getRate();
        return _rBalances[wallet_] / currentRate;
    }

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

    function migrateOwner(address wallet) external onlyOwner {
        migrateInt(wallet);
    }

    function migrate() external {
        require(!_migrated[msg.sender], "B:Already migrated");
        migrateInt(msg.sender);
    }

    function migrateInt(address wallet) internal {
        uint256 tokenBal = _oldBSKR.balanceOf(wallet);
        if (tokenBal > 0) {
            _transferTokens(
                owner(),
                wallet,
                tokenBal,
                false,
                true,
                _getsNoRfi[wallet]
            );
        }
        require(balanceOf(wallet) >= tokenBal, "B:Migrate Issue");
        _migrated[wallet] = true;
    }

    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 constant _BURN_ADDRESS = address(0x369);
    address internal wethAddr;
    address[5] internal _sisterOAs;
    mapping(address => bool) internal _isAMMPair;
    mapping(address => bool) internal _migrated;
    mapping(address => bool) internal _paysNoFee;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => uint256) internal _balances;
    string private _name;
    string private _symbol;
    uint8 private constant _DECIMALS = 18;
    uint16 internal constant _BIPS = 10000;
    uint128 internal constant _TOTAL_SUPPLY =
        1_000_000_000_000_000_000_000_000_000_000;
    uint256 internal _oaIndex = 4;

    constructor(
        string memory name_,
        string memory symbol_,
        address growthAddress_,
        address[5] memory sisterOAs_
    ) {
        _name = name_;
        _symbol = symbol_;
        _growthAddress = growthAddress_;
        _sisterOAs = sisterOAs_;

        _dexRouterV2 = IUniswapV2Router02(
            // 0xDaE9dd3d1A52CfCe9d5F2fAC7fDe164D500E50f7 // testnet
            0x98bf93ebf5c380C0e6Ae8e192A7e2AE08edAcc02 // mainnet
        );
        _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_
    ) external 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 (uint8) {
        return _DECIMALS;
    }

    function decreaseAllowance(
        address spender_,
        uint256 subtractedValue_
    ) external returns (bool) {
        address owner = msg.sender;
        uint256 currentAllowance = _allowances[owner][spender_];
        require(currentAllowance >= subtractedValue_, "BB: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_, _allowances[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 pure override returns (uint256) {
        return _TOTAL_SUPPLY;
    }

    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 = _allowances[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 reclaimETH() external payable {
        uint256 amount = address(this).balance;
        require(amount > 0, "BB:0 Balance");

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

    function reclaimToken(IERC20 token_, uint256 amount_) external payable {
        uint256 balance = token_.balanceOf(address(this));
        require(amount_ <= balance, "BB:Too much");
        token_.transfer(owner(), balance);
    }

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

contracts/imports/IBSKR.sol

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

pragma solidity ^0.8.19;

interface IBSKR {
    function balanceOf(address wallet_) external view returns (uint256);

    function stakeTransfer(
        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, "O:Caller not owner");
    }

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

    function transferOwnership(address newOwner) external virtual onlyOwner {
        require(newOwner != address(0), "O:0 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(), "P:Paused");
    }

    function _requirePaused() internal view virtual {
        require(paused(), "P: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 Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function allowance(
        address owner,
        address spender
    ) external view returns (uint256);

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

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

    function totalSupply() external view returns (uint256);

    function transfer(address to, 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 addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

    function 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 swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    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":1000000,"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":"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":[{"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":"nonpayable","outputs":[],"name":"migrateOwner","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"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":"payable","outputs":[],"name":"reclaimETH","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"reclaimToken","inputs":[{"type":"address","name":"token_","internalType":"contract IERC20"},{"type":"uint256","name":"amount_","internalType":"uint256"}]},{"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":"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":"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":"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

0x608060405260046012556017805460ff19166001179055620000316127106c0c9f2c9cd04674edea400000006200095c565b6001600160801b0316601a55620000586c0c9f2c9cd04674edea4000000060001962000985565b62000066906000196200099c565b601b556040805160608101825260c88152603260208201526101f4918101919091526200009890601d90600362000885565b50348015620000a657600080fd5b506040516200398238038062003982833981016040819052620000c99162000acf565b84848483620000d8336200074a565b6000805460ff60a01b19168155600180546001600160a01b031916339081179091556040519091907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c85908290a3601062000133858262000c6b565b50601162000142848262000c6b565b50600480546001600160a01b0319166001600160a01b0384161790556200016d6006826005620008ce565b50600380546001600160a01b0319167398bf93ebf5c380c0e6ae8e192a7e2ae08edacc029081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620001d3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f9919062000d37565b600280546001600160a01b0319166001600160a01b039283161790556003546040805163ef8ef56f60e01b81529051919092169163ef8ef56f9160048083019260209291908290030181865afa15801562000258573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027e919062000d37565b600560006101000a8154816001600160a01b0302191690836001600160a01b031602179055506001600d6000336001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d6000306001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600d6000600360009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505050505085601360006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081601460006101000a8154816001600160a01b0302191690836001600160a01b03160217905550601b5460196000336001600160a01b03166001600160a01b03168152602001908152602001600020819055506c0c9f2c9cd04674edea400000006001600160801b0316600f6000336001600160a01b03166001600160a01b0316815260200190815260200160002081905550336001600160a01b031660006001600160a01b0316600080516020620039628339815191526c0c9f2c9cd04674edea400000006040516200048191906001600160801b0391909116815260200190565b60405180910390a36002546005546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015620004de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000504919062000d37565b601580546001600160a01b0319166001600160a01b039290921691821790556200053290806000196200079a565b601580546001600160a01b039081166000908152600b60205260409020805460ff191660011790559054620005689116620007fb565b60005b6005811015620005f9576001600d60006006846005811062000591576200059162000d5e565b01546001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620005e660068260058110620005d557620005d562000d5e565b01546001600160a01b0316620007fb565b620005f18162000d74565b90506200056b565b506200060533620007fb565b6200061030620007fb565b60155462000627906001600160a01b0316620007fb565b62000634610369620007fb565b6013546040516370a0823160e01b8152600060048201819052916001600160a01b0316906370a0823190602401602060405180830381865afa1580156200067f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006a5919062000d90565b6103696000908152600f6020527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed5914280549293508392909190620006ea90849062000daa565b9091555050336000908152600f602052604081208054839290620007109084906200099c565b9091555050604051818152610369903390600080516020620039628339815191529060200160405180910390a35050505050505062000dc0565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038381166000818152600e602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03811660009081526018602052604090205460ff1662000882576001600160a01b0381166000818152601860205260408120805460ff191660019081179091556016805491820181559091527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890180546001600160a01b03191690911790555b50565b8260038101928215620008bc579160200282015b82811115620008bc578251829061ffff1690559160200191906001019062000899565b50620008ca92915062000919565b5090565b8260058101928215620008bc579160200282015b82811115620008bc57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620008e2565b5b80821115620008ca57600081556001016200091a565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001600160801b038381168062000979576200097962000930565b92169190910492915050565b60008262000997576200099762000930565b500690565b81810381811115620009b257620009b262000946565b92915050565b6001600160a01b03811681146200088257600080fd5b634e487b7160e01b600052604160045260246000fd5b60405160a081016001600160401b038111828210171562000a095762000a09620009ce565b60405290565b604051601f8201601f191681016001600160401b038111828210171562000a3a5762000a3a620009ce565b604052919050565b600082601f83011262000a5457600080fd5b81516001600160401b0381111562000a705762000a70620009ce565b602062000a86601f8301601f1916820162000a0f565b828152858284870101111562000a9b57600080fd5b60005b8381101562000abb57858101830151828201840152820162000a9e565b506000928101909101919091529392505050565b60008060008060008061014080888a03121562000aeb57600080fd5b875162000af881620009b8565b602089810151919850906001600160401b038082111562000b1857600080fd5b62000b268c838d0162000a42565b985060408b015191508082111562000b3d57600080fd5b5062000b4c8b828c0162000a42565b965050606089015162000b5f81620009b8565b60808a015190955062000b7281620009b8565b935060bf89018a1362000b8457600080fd5b62000b8e620009e4565b91890191808b84111562000ba157600080fd5b60a08b015b8481101562000bca57805162000bbc81620009b8565b835291830191830162000ba6565b50809450505050509295509295509295565b600181811c9082168062000bf157607f821691505b60208210810362000c1257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000c6657600081815260208120601f850160051c8101602086101562000c415750805b601f850160051c820191505b8181101562000c625782815560010162000c4d565b5050505b505050565b81516001600160401b0381111562000c875762000c87620009ce565b62000c9f8162000c98845462000bdc565b8462000c18565b602080601f83116001811462000cd7576000841562000cbe5750858301515b600019600386901b1c1916600185901b17855562000c62565b600085815260208120601f198616915b8281101562000d085788860151825594840194600190910190840162000ce7565b508582101562000d275787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000d4a57600080fd5b815162000d5781620009b8565b9392505050565b634e487b7160e01b600052603260045260246000fd5b60006001820162000d895762000d8962000946565b5060010190565b60006020828403121562000da357600080fd5b5051919050565b80820180821115620009b257620009b262000946565b612b928062000dd06000396000f3fe6080604052600436106101985760003560e01c80636c74dd51116100e0578063a9059cbb11610084578063dd62ed3e11610061578063dd62ed3e1461048d578063e0c9ffc6146104e0578063e4edf85214610500578063f2fde38b1461052057005b8063a9059cbb14610438578063bac1520314610458578063c49b9a801461046d57005b80638da5cb5b116100bd5780638da5cb5b146103c35780638fd3ab80146103ee57806395d89b4114610403578063a457c2d71461041857005b80636c74dd511461036e57806370a082311461038e578063715018a6146103ae57005b8063313ce56711610147578063439766ce11610124578063439766ce146102ca578063481c6a75146102df5780635c975abb1461032b57806361ce35291461035b57005b8063313ce5671461026e578063395093511461028a57806342966c68146102aa57005b806318160ddd1161017557806318160ddd1461020457806323a12df21461022e57806323b872dd1461024e57005b806306fdde03146101a1578063095ea7b3146101cc5780630f144a48146101fc57005b3661019f57005b005b3480156101ad57600080fd5b506101b6610540565b6040516101c391906126e4565b60405180910390f35b3480156101d857600080fd5b506101ec6101e7366004612757565b6105d2565b60405190151581526020016101c3565b61019f6105ec565b34801561021057600080fd5b506c0c9f2c9cd04674edea400000005b6040519081526020016101c3565b34801561023a57600080fd5b5061019f610249366004612783565b610727565b34801561025a57600080fd5b506101ec6102693660046127a0565b61073b565b34801561027a57600080fd5b50604051601281526020016101c3565b34801561029657600080fd5b506101ec6102a5366004612757565b610821565b3480156102b657600080fd5b5061019f6102c53660046127e1565b61086d565b3480156102d657600080fd5b5061019f610910565b3480156102eb57600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c3565b34801561033757600080fd5b5060005474010000000000000000000000000000000000000000900460ff166101ec565b61019f610369366004612757565b610922565b34801561037a57600080fd5b506101ec6103893660046127a0565b610af6565b34801561039a57600080fd5b506102206103a9366004612783565b610b6d565b3480156103ba57600080fd5b5061019f610c9a565b3480156103cf57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610306565b3480156103fa57600080fd5b5061019f610cac565b34801561040f57600080fd5b506101b6610d2f565b34801561042457600080fd5b506101ec610433366004612757565b610d3e565b34801561044457600080fd5b506101ec610453366004612757565b610df4565b34801561046457600080fd5b5061019f610e02565b34801561047957600080fd5b5061019f610488366004612808565b610e12565b34801561049957600080fd5b506102206104a8366004612825565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600e6020908152604080832093909416825291909152205490565b3480156104ec57600080fd5b5061019f6104fb36600461285e565b610e7f565b34801561050c57600080fd5b5061019f61051b366004612783565b610f75565b34801561052c57600080fd5b5061019f61053b366004612783565b61100b565b60606010805461054f906128d3565b80601f016020809104026020016040519081016040528092919081815260200182805461057b906128d3565b80156105c85780601f1061059d576101008083540402835291602001916105c8565b820191906000526020600020905b8154815290600101906020018083116105ab57829003601f168201915b5050505050905090565b6000336105e0818585611099565b60019150505b92915050565b4780610659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f42423a302042616c616e6365000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff9091169083908381818185875af1925050503d80600081146106b3576040519150601f19603f3d011682016040523d82523d6000602084013e6106b8565b606091505b5050905080610723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f42423a53656e64204661696c65640000000000000000000000000000000000006044820152606401610650565b5050565b61072f611107565b610738816111a4565b50565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e602090815260408083203380855292528220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461080a57838110156107fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42423a496e73756666696369656e7420616c6c6f77616e6365000000000000006044820152606401610650565b61080a8683868403611099565b61081586868661135a565b50600195945050505050565b336000818152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906105e09082908690610868908790612955565b611099565b336000908152600f60205260408120805483929061088c908490612968565b90915550506103696000908152600f6020527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed5914280548392906108cf908490612955565b90915550506040518181526103699033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350565b6109186118c1565b610920611942565b565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa15801561098f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b3919061297b565b905080821115610a1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f42423a546f6f206d7563680000000000000000000000000000000000000000006044820152606401610650565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610a5a60005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af1158015610acc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af09190612994565b50505050565b60145460009073ffffffffffffffffffffffffffffffffffffffff163314610b1d57600080fd5b73ffffffffffffffffffffffffffffffffffffffff808516600090815260186020526040808220549286168252812054610b639287928792879260ff90811691166119bf565b5060019392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526018602052604081205460ff1615610bc4575073ffffffffffffffffffffffffffffffffffffffff166000908152600f602052604090205490565b601b5473ffffffffffffffffffffffffffffffffffffffff83166000908152601960205260409020541115610c55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f423a416d74206c617267650000000000000000000000000000000000000000006044820152606401610650565b6000610c5f611cbe565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260196020526040902054909150610c939082906129b1565b9392505050565b610ca2611107565b6109206000611eac565b336000908152600c602052604090205460ff1615610d26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f423a416c7265616479206d6967726174656400000000000000000000000000006044820152606401610650565b610920336111a4565b60606011805461054f906128d3565b336000818152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610ddc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42423a4465637265617365732062656c6f7720300000000000000000000000006044820152606401610650565b610de98286868403611099565b506001949350505050565b6000336105e081858561135a565b610e0a6118c1565b610920611f21565b610e1a6118c1565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f91c8e5d8409e58da1d940ede98e9b35e17b453932366ea0a790416ab922ca4129060200160405180910390a150565b610e87611107565b60005b81811015610f70576000838383818110610ea657610ea66129ec565b610ebc9260206040909202019081019150612783565b73ffffffffffffffffffffffffffffffffffffffff1614158015610efc5750828282818110610eed57610eed6129ec565b90506040020160200135600014155b15610f6057610f60838383818110610f1657610f166129ec565b610f2c9260206040909202019081019150612783565b848484818110610f3e57610f3e6129ec565b90506040020160200135670de0b6b3a7640000610f5b9190612a1b565b611f81565b610f6981612a32565b9050610e8a565b505050565b610f7d6118c1565b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8590600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611013611107565b73ffffffffffffffffffffffffffffffffffffffff8116611090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4f3a3020616464726573730000000000000000000000000000000000000000006044820152606401610650565b61073881611eac565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152600e602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b3361112760005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4f3a43616c6c6572206e6f74206f776e657200000000000000000000000000006044820152606401610650565b6013546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009216906370a0823190602401602060405180830381865afa158015611215573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611239919061297b565b905080156112985761129861126360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff84166000908152601860205260408120548591859160019060ff166119bf565b806112a283610b6d565b101561130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f423a4d69677261746520497373756500000000000000000000000000000000006044820152606401610650565b5073ffffffffffffffffffffffffffffffffffffffff166000908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b61136383611fa3565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600b602052604090205460ff161561139a5761139a83612115565b6113a382611fa3565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600b602052604090205460ff16156113da576113da82612115565b60006113e530610b6d565b9050601a5481101580156114015750601754610100900460ff16155b8015611428575060155473ffffffffffffffffffffffffffffffffffffffff858116911614155b8015611436575060175460ff165b156117a857601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055601a54600181901c9060009061147e908390612968565b604080516002808252606082018352929350479260009260208301908036833701905050905030816000815181106114b8576114b86129ec565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526005548251911690829060019081106114f6576114f66129ec565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061153b303086611099565b60035461156090309073ffffffffffffffffffffffffffffffffffffffff1686611099565b60035473ffffffffffffffffffffffffffffffffffffffff1663791ac947856000843061158e42600f612955565b6040518663ffffffff1660e01b81526004016115ae959493929190612a6a565b600060405180830381600087803b1580156115c857600080fd5b505af11580156115dc573d6000803e3d6000fd5b50505050600082476115ee9190612968565b60035490915061161690309073ffffffffffffffffffffffffffffffffffffffff1686611099565b60035473ffffffffffffffffffffffffffffffffffffffff1663f305d7198230876000806116426121eb565b61164d42600f612955565b60405160e089901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff9687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af11580156116df573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117049190612af5565b505060408051878152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a1612710611756610369610b6d565b61176d906c0c9f2c9cd04674edea40000000612968565b61177791906129b1565b601a555050601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050505b73ffffffffffffffffffffffffffffffffffffffff84166000908152600d602052604090205460019060ff1680611804575073ffffffffffffffffffffffffffffffffffffffff84166000908152600d602052604090205460ff165b1561180d575060005b73ffffffffffffffffffffffffffffffffffffffff85166000908152600b602052604090205460ff16158015611869575073ffffffffffffffffffffffffffffffffffffffff84166000908152600b602052604090205460ff16155b15611872575060005b73ffffffffffffffffffffffffffffffffffffffff8086166000908152601860205260408082205492871682529020546118ba91879187918791869160ff90811691166119bf565b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4d3a43616c6c6572206e6f74206d616e616765720000000000000000000000006044820152606401610650565b61194a612250565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020015b60405180910390a1565b6119c7612250565b600a836119d2575060005b60006119de86836122d5565b90508315611a215773ffffffffffffffffffffffffffffffffffffffff88166000908152600f602052604081208054889290611a1b908490612968565b90915550505b60208082015173ffffffffffffffffffffffffffffffffffffffff8a166000908152601990925260408220805491929091611a5d908490612968565b90915550508215611aa557805173ffffffffffffffffffffffffffffffffffffffff88166000908152600f602052604081208054909190611a9f908490612955565b90915550505b60408082015173ffffffffffffffffffffffffffffffffffffffff891660009081526019602052918220805491929091611ae0908490612955565b909155505060608101518015611c615760a0820151601b8054829190600090611b0a908490612968565b9250508190555081601c6000828254611b239190612955565b90915550611b369050610369838361240e565b6040518281526103699073ffffffffffffffffffffffffffffffffffffffff8c16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3608083015160c0840151600454611bb39073ffffffffffffffffffffffffffffffffffffffff16838361240e565b60045460405183815273ffffffffffffffffffffffffffffffffffffffff918216918e16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611c1030838361240e565b604051828152309073ffffffffffffffffffffffffffffffffffffffff8e16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505b815160405190815273ffffffffffffffffffffffffffffffffffffffff89811691908b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050505050565b601b546000906c0c9f2c9cd04674edea40000000825b601654811015611e5d57826019600060168481548110611cf657611cf66129ec565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020541180611d7b575081600f600060168481548110611d4757611d476129ec565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054115b15611da357601b54611d9b906c0c9f2c9cd04674edea40000000906129b1565b935050505090565b6019600060168381548110611dba57611dba6129ec565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054611df69084612968565b9250600f600060168381548110611e0f57611e0f6129ec565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054611e4b9083612968565b9150611e5681612a32565b9050611cd4565b50601b54611e79906c0c9f2c9cd04674edea40000000906129b1565b821015611ea257601b54611e9b906c0c9f2c9cd04674edea40000000906129b1565b9250505090565b611e9b81836129b1565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611f296124b5565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020016119b5565b61072361126360005473ffffffffffffffffffffffffffffffffffffffff1690565b8073ffffffffffffffffffffffffffffffffffffffff163b600003611fc55750565b60035473ffffffffffffffffffffffffffffffffffffffff90811690821603611feb5750565b60055473ffffffffffffffffffffffffffffffffffffffff908116908216036120115750565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602052604090205460ff1661073857600061204982612539565b905073ffffffffffffffffffffffffffffffffffffffff811661206a575050565b600061207583612565565b905073ffffffffffffffffffffffffffffffffffffffff811661209757505050565b6120c283847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611099565b505073ffffffffffffffffffffffffffffffffffffffff81166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b73ffffffffffffffffffffffffffffffffffffffff811660009081526018602052604090205460ff166107385773ffffffffffffffffffffffffffffffffffffffff16600081815260186020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556016805491820181559091527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b60006121f960016005612968565b601254101561221857601254612210906001612955565b60125561221e565b60006012555b600660125460058110612233576122336129ec565b015473ffffffffffffffffffffffffffffffffffffffff16919050565b60005474010000000000000000000000000000000000000000900460ff1615610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f503a5061757365640000000000000000000000000000000000000000000000006044820152606401610650565b6122dd6126a2565b60006122e7611cbe565b90506122f38185612a1b565b602083015260008390036123185783825261230e8185612a1b565b6040830152612407565b600a83612710601d6000015461232e9088612a1b565b61233891906129b1565b6123429190612a1b565b61234c91906129b1565b6060830152601e54600a908490612710906123679088612a1b565b61237191906129b1565b61237b9190612a1b565b61238591906129b1565b6080830152601f54600a908490612710906123a09088612a1b565b6123aa91906129b1565b6123b49190612a1b565b6123be91906129b1565b6123c89085612968565b825260608201516123da908290612a1b565b60a083015260808201516123ef908290612a1b565b60c08301528151612401908290612a1b565b60408301525b5092915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526019602052604081208054839290612443908490612955565b909155505073ffffffffffffffffffffffffffffffffffffffff831660009081526018602052604090205460ff1615610f705773ffffffffffffffffffffffffffffffffffffffff83166000908152600f6020526040812080548492906124ab908490612955565b9091555050505050565b60005474010000000000000000000000000000000000000000900460ff16610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f503a4e6f742070617573656400000000000000000000000000000000000000006044820152606401610650565b60006105e6827f0dfe16810000000000000000000000000000000000000000000000000000000061258d565b60006105e6827fd21220a7000000000000000000000000000000000000000000000000000000005b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000851617905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8716916126109190612b23565b600060405180830381855afa9150503d806000811461264b576040519150601f19603f3d011682016040523d82523d6000602084013e612650565b606091505b509150915081158061266157508051155b15612671576000925050506105e6565b8051602003612697578080602001905181019061268e9190612b3f565b925050506105e6565b506000949350505050565b6040518060e001604052806007906020820280368337509192915050565b60005b838110156126db5781810151838201526020016126c3565b50506000910152565b60208152600082518060208401526127038160408501602087016126c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461073857600080fd5b6000806040838503121561276a57600080fd5b823561277581612735565b946020939093013593505050565b60006020828403121561279557600080fd5b8135610c9381612735565b6000806000606084860312156127b557600080fd5b83356127c081612735565b925060208401356127d081612735565b929592945050506040919091013590565b6000602082840312156127f357600080fd5b5035919050565b801515811461073857600080fd5b60006020828403121561281a57600080fd5b8135610c93816127fa565b6000806040838503121561283857600080fd5b823561284381612735565b9150602083013561285381612735565b809150509250929050565b6000806020838503121561287157600080fd5b823567ffffffffffffffff8082111561288957600080fd5b818501915085601f83011261289d57600080fd5b8135818111156128ac57600080fd5b8660208260061b85010111156128c157600080fd5b60209290920196919550909350505050565b600181811c908216806128e757607f821691505b602082108103612920577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156105e6576105e6612926565b818103818111156105e6576105e6612926565b60006020828403121561298d57600080fd5b5051919050565b6000602082840312156129a657600080fd5b8151610c93816127fa565b6000826129e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820281158282048414176105e6576105e6612926565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a6357612a63612926565b5060010190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612ac757845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101612a95565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b600080600060608486031215612b0a57600080fd5b8351925060208401519150604084015190509250925092565b60008251612b358184602087016126c0565b9190910192915050565b600060208284031215612b5157600080fd5b8151610c938161273556fea2646970667358221220658b77126ab740e754080ff0b8ccc21075ebf35b78f4077cd5ebe226ee6b6cc664736f6c63430008130033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef00000000000000000000000019ea5fa4d1dbd7413752b93f856b1cd165f2f21900000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000180000000000000000000000000fb7103d7011dfa60c18c6961c5a38038d8048fe0000000000000000000000000d493b22ac1e70c0da743b0c61311aeea4f817eef00000000000000000000000035cef302da66733c076c10f85fc8097dce90bcc00000000000000000000000001988d578de9a3468329de348e5a0e6cdc4369df9000000000000000000000000cd75d401a91b076f274418c7fa6a973d7fb7fece00000000000000000000000053e011d48f0164a3d58fb8591060e7b05e7448180000000000000000000000007d6e237a514fbe12c65c3aa72525f61aa6a722d200000000000000000000000000000000000000000000000000000000000000177042534b52202d2070756c73656c6f7269616e2e636f6d00000000000000000000000000000000000000000000000000000000000000000000000000000000057042534b52000000000000000000000000000000000000000000000000000000

Deployed ByteCode

0x6080604052600436106101985760003560e01c80636c74dd51116100e0578063a9059cbb11610084578063dd62ed3e11610061578063dd62ed3e1461048d578063e0c9ffc6146104e0578063e4edf85214610500578063f2fde38b1461052057005b8063a9059cbb14610438578063bac1520314610458578063c49b9a801461046d57005b80638da5cb5b116100bd5780638da5cb5b146103c35780638fd3ab80146103ee57806395d89b4114610403578063a457c2d71461041857005b80636c74dd511461036e57806370a082311461038e578063715018a6146103ae57005b8063313ce56711610147578063439766ce11610124578063439766ce146102ca578063481c6a75146102df5780635c975abb1461032b57806361ce35291461035b57005b8063313ce5671461026e578063395093511461028a57806342966c68146102aa57005b806318160ddd1161017557806318160ddd1461020457806323a12df21461022e57806323b872dd1461024e57005b806306fdde03146101a1578063095ea7b3146101cc5780630f144a48146101fc57005b3661019f57005b005b3480156101ad57600080fd5b506101b6610540565b6040516101c391906126e4565b60405180910390f35b3480156101d857600080fd5b506101ec6101e7366004612757565b6105d2565b60405190151581526020016101c3565b61019f6105ec565b34801561021057600080fd5b506c0c9f2c9cd04674edea400000005b6040519081526020016101c3565b34801561023a57600080fd5b5061019f610249366004612783565b610727565b34801561025a57600080fd5b506101ec6102693660046127a0565b61073b565b34801561027a57600080fd5b50604051601281526020016101c3565b34801561029657600080fd5b506101ec6102a5366004612757565b610821565b3480156102b657600080fd5b5061019f6102c53660046127e1565b61086d565b3480156102d657600080fd5b5061019f610910565b3480156102eb57600080fd5b5060015473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c3565b34801561033757600080fd5b5060005474010000000000000000000000000000000000000000900460ff166101ec565b61019f610369366004612757565b610922565b34801561037a57600080fd5b506101ec6103893660046127a0565b610af6565b34801561039a57600080fd5b506102206103a9366004612783565b610b6d565b3480156103ba57600080fd5b5061019f610c9a565b3480156103cf57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610306565b3480156103fa57600080fd5b5061019f610cac565b34801561040f57600080fd5b506101b6610d2f565b34801561042457600080fd5b506101ec610433366004612757565b610d3e565b34801561044457600080fd5b506101ec610453366004612757565b610df4565b34801561046457600080fd5b5061019f610e02565b34801561047957600080fd5b5061019f610488366004612808565b610e12565b34801561049957600080fd5b506102206104a8366004612825565b73ffffffffffffffffffffffffffffffffffffffff9182166000908152600e6020908152604080832093909416825291909152205490565b3480156104ec57600080fd5b5061019f6104fb36600461285e565b610e7f565b34801561050c57600080fd5b5061019f61051b366004612783565b610f75565b34801561052c57600080fd5b5061019f61053b366004612783565b61100b565b60606010805461054f906128d3565b80601f016020809104026020016040519081016040528092919081815260200182805461057b906128d3565b80156105c85780601f1061059d576101008083540402835291602001916105c8565b820191906000526020600020905b8154815290600101906020018083116105ab57829003601f168201915b5050505050905090565b6000336105e0818585611099565b60019150505b92915050565b4780610659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f42423a302042616c616e6365000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff9091169083908381818185875af1925050503d80600081146106b3576040519150601f19603f3d011682016040523d82523d6000602084013e6106b8565b606091505b5050905080610723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f42423a53656e64204661696c65640000000000000000000000000000000000006044820152606401610650565b5050565b61072f611107565b610738816111a4565b50565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600e602090815260408083203380855292528220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461080a57838110156107fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f42423a496e73756666696369656e7420616c6c6f77616e6365000000000000006044820152606401610650565b61080a8683868403611099565b61081586868661135a565b50600195945050505050565b336000818152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091906105e09082908690610868908790612955565b611099565b336000908152600f60205260408120805483929061088c908490612968565b90915550506103696000908152600f6020527fae12794d17f0f8d91a7af352510ec4a568a230a07a4208197af414971ed5914280548392906108cf908490612955565b90915550506040518181526103699033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350565b6109186118c1565b610920611942565b565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa15801561098f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b3919061297b565b905080821115610a1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f42423a546f6f206d7563680000000000000000000000000000000000000000006044820152606401610650565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb610a5a60005473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303816000875af1158015610acc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af09190612994565b50505050565b60145460009073ffffffffffffffffffffffffffffffffffffffff163314610b1d57600080fd5b73ffffffffffffffffffffffffffffffffffffffff808516600090815260186020526040808220549286168252812054610b639287928792879260ff90811691166119bf565b5060019392505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526018602052604081205460ff1615610bc4575073ffffffffffffffffffffffffffffffffffffffff166000908152600f602052604090205490565b601b5473ffffffffffffffffffffffffffffffffffffffff83166000908152601960205260409020541115610c55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f423a416d74206c617267650000000000000000000000000000000000000000006044820152606401610650565b6000610c5f611cbe565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260196020526040902054909150610c939082906129b1565b9392505050565b610ca2611107565b6109206000611eac565b336000908152600c602052604090205460ff1615610d26576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f423a416c7265616479206d6967726174656400000000000000000000000000006044820152606401610650565b610920336111a4565b60606011805461054f906128d3565b336000818152600e6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919083811015610ddc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f42423a4465637265617365732062656c6f7720300000000000000000000000006044820152606401610650565b610de98286868403611099565b506001949350505050565b6000336105e081858561135a565b610e0a6118c1565b610920611f21565b610e1a6118c1565b601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f91c8e5d8409e58da1d940ede98e9b35e17b453932366ea0a790416ab922ca4129060200160405180910390a150565b610e87611107565b60005b81811015610f70576000838383818110610ea657610ea66129ec565b610ebc9260206040909202019081019150612783565b73ffffffffffffffffffffffffffffffffffffffff1614158015610efc5750828282818110610eed57610eed6129ec565b90506040020160200135600014155b15610f6057610f60838383818110610f1657610f166129ec565b610f2c9260206040909202019081019150612783565b848484818110610f3e57610f3e6129ec565b90506040020160200135670de0b6b3a7640000610f5b9190612a1b565b611f81565b610f6981612a32565b9050610e8a565b505050565b610f7d6118c1565b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f80f15e9dbc60884fdb59fb8ed4fc48a9a689e028f055e893ed45ca5be67c5c8590600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b611013611107565b73ffffffffffffffffffffffffffffffffffffffff8116611090576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f4f3a3020616464726573730000000000000000000000000000000000000000006044820152606401610650565b61073881611eac565b73ffffffffffffffffffffffffffffffffffffffff8381166000818152600e602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b3361112760005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4f3a43616c6c6572206e6f74206f776e657200000000000000000000000000006044820152606401610650565b6013546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015260009216906370a0823190602401602060405180830381865afa158015611215573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611239919061297b565b905080156112985761129861126360005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff84166000908152601860205260408120548591859160019060ff166119bf565b806112a283610b6d565b101561130a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f423a4d69677261746520497373756500000000000000000000000000000000006044820152606401610650565b5073ffffffffffffffffffffffffffffffffffffffff166000908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b61136383611fa3565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600b602052604090205460ff161561139a5761139a83612115565b6113a382611fa3565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600b602052604090205460ff16156113da576113da82612115565b60006113e530610b6d565b9050601a5481101580156114015750601754610100900460ff16155b8015611428575060155473ffffffffffffffffffffffffffffffffffffffff858116911614155b8015611436575060175460ff165b156117a857601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055601a54600181901c9060009061147e908390612968565b604080516002808252606082018352929350479260009260208301908036833701905050905030816000815181106114b8576114b86129ec565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526005548251911690829060019081106114f6576114f66129ec565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061153b303086611099565b60035461156090309073ffffffffffffffffffffffffffffffffffffffff1686611099565b60035473ffffffffffffffffffffffffffffffffffffffff1663791ac947856000843061158e42600f612955565b6040518663ffffffff1660e01b81526004016115ae959493929190612a6a565b600060405180830381600087803b1580156115c857600080fd5b505af11580156115dc573d6000803e3d6000fd5b50505050600082476115ee9190612968565b60035490915061161690309073ffffffffffffffffffffffffffffffffffffffff1686611099565b60035473ffffffffffffffffffffffffffffffffffffffff1663f305d7198230876000806116426121eb565b61164d42600f612955565b60405160e089901b7fffffffff0000000000000000000000000000000000000000000000000000000016815273ffffffffffffffffffffffffffffffffffffffff9687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af11580156116df573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906117049190612af5565b505060408051878152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a1612710611756610369610b6d565b61176d906c0c9f2c9cd04674edea40000000612968565b61177791906129b1565b601a555050601780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555050505b73ffffffffffffffffffffffffffffffffffffffff84166000908152600d602052604090205460019060ff1680611804575073ffffffffffffffffffffffffffffffffffffffff84166000908152600d602052604090205460ff165b1561180d575060005b73ffffffffffffffffffffffffffffffffffffffff85166000908152600b602052604090205460ff16158015611869575073ffffffffffffffffffffffffffffffffffffffff84166000908152600b602052604090205460ff16155b15611872575060005b73ffffffffffffffffffffffffffffffffffffffff8086166000908152601860205260408082205492871682529020546118ba91879187918791869160ff90811691166119bf565b5050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4d3a43616c6c6572206e6f74206d616e616765720000000000000000000000006044820152606401610650565b61194a612250565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020015b60405180910390a1565b6119c7612250565b600a836119d2575060005b60006119de86836122d5565b90508315611a215773ffffffffffffffffffffffffffffffffffffffff88166000908152600f602052604081208054889290611a1b908490612968565b90915550505b60208082015173ffffffffffffffffffffffffffffffffffffffff8a166000908152601990925260408220805491929091611a5d908490612968565b90915550508215611aa557805173ffffffffffffffffffffffffffffffffffffffff88166000908152600f602052604081208054909190611a9f908490612955565b90915550505b60408082015173ffffffffffffffffffffffffffffffffffffffff891660009081526019602052918220805491929091611ae0908490612955565b909155505060608101518015611c615760a0820151601b8054829190600090611b0a908490612968565b9250508190555081601c6000828254611b239190612955565b90915550611b369050610369838361240e565b6040518281526103699073ffffffffffffffffffffffffffffffffffffffff8c16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3608083015160c0840151600454611bb39073ffffffffffffffffffffffffffffffffffffffff16838361240e565b60045460405183815273ffffffffffffffffffffffffffffffffffffffff918216918e16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3611c1030838361240e565b604051828152309073ffffffffffffffffffffffffffffffffffffffff8e16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050505b815160405190815273ffffffffffffffffffffffffffffffffffffffff89811691908b16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050505050505050565b601b546000906c0c9f2c9cd04674edea40000000825b601654811015611e5d57826019600060168481548110611cf657611cf66129ec565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020541180611d7b575081600f600060168481548110611d4757611d476129ec565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054115b15611da357601b54611d9b906c0c9f2c9cd04674edea40000000906129b1565b935050505090565b6019600060168381548110611dba57611dba6129ec565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054611df69084612968565b9250600f600060168381548110611e0f57611e0f6129ec565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054611e4b9083612968565b9150611e5681612a32565b9050611cd4565b50601b54611e79906c0c9f2c9cd04674edea40000000906129b1565b821015611ea257601b54611e9b906c0c9f2c9cd04674edea40000000906129b1565b9250505090565b611e9b81836129b1565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b611f296124b5565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020016119b5565b61072361126360005473ffffffffffffffffffffffffffffffffffffffff1690565b8073ffffffffffffffffffffffffffffffffffffffff163b600003611fc55750565b60035473ffffffffffffffffffffffffffffffffffffffff90811690821603611feb5750565b60055473ffffffffffffffffffffffffffffffffffffffff908116908216036120115750565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602052604090205460ff1661073857600061204982612539565b905073ffffffffffffffffffffffffffffffffffffffff811661206a575050565b600061207583612565565b905073ffffffffffffffffffffffffffffffffffffffff811661209757505050565b6120c283847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff611099565b505073ffffffffffffffffffffffffffffffffffffffff81166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b73ffffffffffffffffffffffffffffffffffffffff811660009081526018602052604090205460ff166107385773ffffffffffffffffffffffffffffffffffffffff16600081815260186020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091556016805491820181559091527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169091179055565b60006121f960016005612968565b601254101561221857601254612210906001612955565b60125561221e565b60006012555b600660125460058110612233576122336129ec565b015473ffffffffffffffffffffffffffffffffffffffff16919050565b60005474010000000000000000000000000000000000000000900460ff1615610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f503a5061757365640000000000000000000000000000000000000000000000006044820152606401610650565b6122dd6126a2565b60006122e7611cbe565b90506122f38185612a1b565b602083015260008390036123185783825261230e8185612a1b565b6040830152612407565b600a83612710601d6000015461232e9088612a1b565b61233891906129b1565b6123429190612a1b565b61234c91906129b1565b6060830152601e54600a908490612710906123679088612a1b565b61237191906129b1565b61237b9190612a1b565b61238591906129b1565b6080830152601f54600a908490612710906123a09088612a1b565b6123aa91906129b1565b6123b49190612a1b565b6123be91906129b1565b6123c89085612968565b825260608201516123da908290612a1b565b60a083015260808201516123ef908290612a1b565b60c08301528151612401908290612a1b565b60408301525b5092915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526019602052604081208054839290612443908490612955565b909155505073ffffffffffffffffffffffffffffffffffffffff831660009081526018602052604090205460ff1615610f705773ffffffffffffffffffffffffffffffffffffffff83166000908152600f6020526040812080548492906124ab908490612955565b9091555050505050565b60005474010000000000000000000000000000000000000000900460ff16610920576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f503a4e6f742070617573656400000000000000000000000000000000000000006044820152606401610650565b60006105e6827f0dfe16810000000000000000000000000000000000000000000000000000000061258d565b60006105e6827fd21220a7000000000000000000000000000000000000000000000000000000005b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000851617905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8716916126109190612b23565b600060405180830381855afa9150503d806000811461264b576040519150601f19603f3d011682016040523d82523d6000602084013e612650565b606091505b509150915081158061266157508051155b15612671576000925050506105e6565b8051602003612697578080602001905181019061268e9190612b3f565b925050506105e6565b506000949350505050565b6040518060e001604052806007906020820280368337509192915050565b60005b838110156126db5781810151838201526020016126c3565b50506000910152565b60208152600082518060208401526127038160408501602087016126c0565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461073857600080fd5b6000806040838503121561276a57600080fd5b823561277581612735565b946020939093013593505050565b60006020828403121561279557600080fd5b8135610c9381612735565b6000806000606084860312156127b557600080fd5b83356127c081612735565b925060208401356127d081612735565b929592945050506040919091013590565b6000602082840312156127f357600080fd5b5035919050565b801515811461073857600080fd5b60006020828403121561281a57600080fd5b8135610c93816127fa565b6000806040838503121561283857600080fd5b823561284381612735565b9150602083013561285381612735565b809150509250929050565b6000806020838503121561287157600080fd5b823567ffffffffffffffff8082111561288957600080fd5b818501915085601f83011261289d57600080fd5b8135818111156128ac57600080fd5b8660208260061b85010111156128c157600080fd5b60209290920196919550909350505050565b600181811c908216806128e757607f821691505b602082108103612920577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156105e6576105e6612926565b818103818111156105e6576105e6612926565b60006020828403121561298d57600080fd5b5051919050565b6000602082840312156129a657600080fd5b8151610c93816127fa565b6000826129e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820281158282048414176105e6576105e6612926565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612a6357612a63612926565b5060010190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015612ac757845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101612a95565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b600080600060608486031215612b0a57600080fd5b8351925060208401519150604084015190509250925092565b60008251612b358184602087016126c0565b9190910192915050565b600060208284031215612b5157600080fd5b8151610c938161273556fea2646970667358221220658b77126ab740e754080ff0b8ccc21075ebf35b78f4077cd5ebe226ee6b6cc664736f6c63430008130033