ETH Price: $2,502.71 (-1.29%)

Token

PEPETH (PEPETH)
 

Overview

Max Total Supply

69,000,000,000,000 PEPETH

Holders

97

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
ProofFactoryTokenCutter

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 17 : ProofFactoryTokenCutter.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "../libraries/Ownable.sol";
import "../libraries/Context.sol";
import "../libraries/ProofFactoryFees.sol";
import "../interfaces/IFACTORY.sol";
import "../interfaces/IDividendDistributor.sol";
import "../interfaces/IUniswapV2Router02.sol";
import "../DividendDistributor.sol";
import "../interfaces/IProofFactoryTokenCutter.sol";

contract ProofFactoryTokenCutter is Context, IProofFactoryTokenCutter {

    //This token was created with PROOF, and audited by Solidity Finance — https://proofplatform.io/projects
    IDividendDistributor public dividendDistributor;
    uint256 distributorGas = 500000;

    mapping(address => bool) public userWhitelist;
    address[] public nftWhitelist;
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;
    uint256 public whitelistEndTime;
    uint256 public whitelistPeriod;
    bool public whitelistMode = true;
    string private _name;
    string private _symbol;

    address constant DEAD = 0x000000000000000000000000000000000000dEaD;
    address constant ZERO = 0x0000000000000000000000000000000000000000;
    address public proofAdmin;

    bool public restrictWhales = true;

    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public isTxLimitExempt;
    mapping(address => bool) public isDividendExempt;

    uint256 public launchedAt;
    uint256 public revenueFee = 2;

    uint256 public reflectionFee;
    uint256 public lpFee;
    uint256 public devFee;

    uint256 public reflectionFeeOnSell;
    uint256 public lpFeeOnSell;
    uint256 public devFeeOnSell;

    uint256 public totalFee;
    uint256 public totalFeeIfSelling;

    IUniswapV2Router02 public router;
    address public pair;
    address public factory;
    address public tokenOwner;
    address payable public devWallet;

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    bool public tradingStatus = true;

    uint256 public _maxTxAmount;
    uint256 public _walletMax;
    uint256 public swapThreshold;


    constructor() {
        factory = msg.sender;
    }

    modifier lockTheSwap() {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    modifier onlyProofAdmin() {
        require(
            proofAdmin == _msgSender(),
            "not the proofAdmin"
        );
        _;
    }

    modifier onlyOwner() {
        require(tokenOwner == _msgSender(), "not the owner");
        _;
    }

    modifier onlyFactory() {
        require(factory == _msgSender(), "not the factory");
        _;
    }

    function setBasicData(
        BaseData memory _baseData,
        ProofFactoryFees.allFees memory fees
    ) external onlyFactory {
        _name = _baseData.tokenName;
        _symbol = _baseData.tokenSymbol;
        _totalSupply += _baseData.initialSupply;

        //Initial supply
        require(_baseData.percentToLP >= 70, "low lp");
        uint256 forLP = (_baseData.initialSupply * _baseData.percentToLP) / 100; //95%
        uint256 forOwner = _baseData.initialSupply - forLP; //5%

        _balances[msg.sender] += forLP;
        _balances[_baseData.owner] += forOwner;

        emit Transfer(address(0), msg.sender, forLP);
        emit Transfer(address(0), _baseData.owner, forOwner);

        _maxTxAmount = (_baseData.initialSupply * 5) / 1000;
        _walletMax = (_baseData.initialSupply * 1) / 100;
        swapThreshold = (_baseData.initialSupply * 5) / 4000;

        router = IUniswapV2Router02(_baseData.routerAddress);
        pair = IUniswapV2Factory(router.factory()).createPair(
            router.WETH(),
            address(this)
        );

        _allowances[address(this)][address(router)] = type(uint256).max;

        dividendDistributor = new DividendDistributor(
            _baseData.routerAddress,
            _baseData.reflectionToken,
            address(this)
        );

        userWhitelist[address(this)] = true;
        userWhitelist[factory] = true;
        userWhitelist[pair] = true;
        userWhitelist[_baseData.owner] = true;
        userWhitelist[_baseData.initialProofAdmin] = true;
        userWhitelist[_baseData.routerAddress] = true;
        _addWhitelist(_baseData.whitelists);

        nftWhitelist = _baseData.nftWhitelist;

        isFeeExempt[address(this)] = true;
        isFeeExempt[factory] = true;

        isTxLimitExempt[address(this)] = true;
        isTxLimitExempt[_baseData.owner] = true;
        isTxLimitExempt[pair] = true;
        isTxLimitExempt[factory] = true;
        isTxLimitExempt[DEAD] = true;
        isTxLimitExempt[ZERO] = true;

        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;
        isDividendExempt[ZERO] = true;

        whitelistPeriod = _baseData.whitelistPeriod;

        reflectionFee = fees.reflectionFee;
        lpFee = fees.lpFee;
        devFee = fees.devFee;

        reflectionFeeOnSell = fees.reflectionFeeOnSell;
        lpFeeOnSell = fees.lpFeeOnSell;
        devFeeOnSell = fees.devFeeOnSell;

        _calcTotalFee();

        tokenOwner = _baseData.owner;
        devWallet = payable(_baseData.devWallet);
        proofAdmin = _baseData.initialProofAdmin;
    }

    //proofAdmin functions
    function updateProofAdmin(
        address newAdmin
    ) external virtual onlyProofAdmin {
        proofAdmin = newAdmin;
        userWhitelist[newAdmin] = true;
    }

    function updateWhitelistPeriod(
        uint256 _whitelistPeriod
    ) external onlyProofAdmin {
        whitelistPeriod = _whitelistPeriod;
        whitelistEndTime = launchedAt + (60 * _whitelistPeriod);
        whitelistMode = true;
    }

    //Factory functions
    function updateProofFactory(address newFactory) external onlyFactory {
        userWhitelist[newFactory] = true;
        isTxLimitExempt[newFactory] = true;
        isFeeExempt[newFactory] = true;	
        factory = newFactory;
    }

    function swapTradingStatus() external onlyFactory {
        tradingStatus = !tradingStatus;
    }

    function setLaunchedAt() external onlyFactory {
        require(launchedAt == 0, "already launched");
        launchedAt = block.timestamp;
        whitelistEndTime = block.timestamp + (60 * whitelistPeriod);
        whitelistMode = true;
    }

    function cancelToken() external onlyFactory {
        isFeeExempt[address(router)] = true;
        isTxLimitExempt[address(router)] = true;
        isTxLimitExempt[tokenOwner] = true;
        tradingStatus = true;
        restrictWhales = false;
        swapAndLiquifyEnabled = false;
    }

    //Owner functions
    function changeFees(
        uint256 initialReflectionFee,
        uint256 initialReflectionFeeOnSell,
        uint256 initialLpFee,
        uint256 initialLpFeeOnSell,
        uint256 initialDevFee,
        uint256 initialDevFeeOnSell
    ) external onlyOwner {
        reflectionFee = initialReflectionFee;
        lpFee = initialLpFee;
        devFee = initialDevFee;

        reflectionFeeOnSell = initialReflectionFeeOnSell;
        lpFeeOnSell = initialLpFeeOnSell;
        devFeeOnSell = initialDevFeeOnSell;

        _calcTotalFee();
    }

    function changeTxLimit(uint256 newLimit) external onlyOwner {
        _checkLimit(newLimit);
        _maxTxAmount = newLimit;
    }

    function changeWalletLimit(uint256 newLimit) external onlyOwner {
        _checkLimit(newLimit);
        _walletMax = newLimit;
    }

    function changeRestrictWhales(bool newValue) external onlyOwner {
        restrictWhales = newValue;
    }

    function changeIsFeeExempt(address holder, bool exempt) external onlyOwner {
        isFeeExempt[holder] = exempt;
    }

    function changeIsTxLimitExempt(
        address holder,
        bool exempt
    ) external onlyOwner {
        isTxLimitExempt[holder] = exempt;
    }

    function changeDistributorGas(uint256 _distributorGas) external onlyOwner {
        distributorGas = _distributorGas;
    }

    function changeMinDistSettings(
        uint256 _minPeriod,
        uint256 _minDistLimit
    ) external onlyOwner {
        dividendDistributor.setMinPeriod(_minPeriod);
        dividendDistributor.setMinDistribution(_minDistLimit);
    }

    function reduceProofFee() external onlyOwner {
        require(revenueFee == 2, "!already reduced");
        _checkTimestamp72();

        revenueFee = 1;
        _calcTotalFee();
    }

    function adjustProofFee(uint256 _proofFee) external onlyProofAdmin {	
        require(launchedAt != 0, "!launched");	
        if (block.timestamp >= launchedAt + 72 hours) {	
            require(_proofFee <= 1);	
            revenueFee = _proofFee;	
            totalFee = devFee + lpFee + reflectionFee + revenueFee;	
            totalFeeIfSelling =	
                devFeeOnSell +	
                lpFeeOnSell +	
                reflectionFeeOnSell +	
                revenueFee;	
        } else {	
            require(_proofFee <= 2);	
            revenueFee = _proofFee;	
            totalFee = devFee + lpFee + reflectionFee + revenueFee;	
            totalFeeIfSelling =	
                devFeeOnSell +	
                lpFeeOnSell +	
                reflectionFeeOnSell +	
                revenueFee;	
        }	
    }

    function setDevWallet(address payable newDevWallet) external onlyOwner {
        devWallet = payable(newDevWallet);
    }

    function setOwnerWallet(address payable newOwnerWallet) external onlyOwner {
        tokenOwner = newOwnerWallet;
    }

    function changeSwapBackSettings(
        bool enableSwapBack,
        uint256 newSwapBackLimit
    ) external onlyOwner {
        swapAndLiquifyEnabled = enableSwapBack;
        swapThreshold = newSwapBackLimit;
    }

    function setDistributionCriteria(
        uint256 newMinPeriod_,
        uint256 newMinDistribution_
    ) external onlyOwner {
        dividendDistributor.setDistributionCriteria(
            newMinPeriod_,
            newMinDistribution_
        );
    }

    function getCirculatingSupply() external view returns (uint256) {
        return _totalSupply - balanceOf(DEAD) - balanceOf(ZERO);
    }

    function rewardTokenAddress() external view returns(address) {	
        return dividendDistributor.rewardTokenAddress();	
    }

    function isWhitelisted(address user) public view returns (bool) {
        return userWhitelist[user];
    }

    function holdsSupportedNFT(address user) public view returns (bool) {
        for (uint256 i = 0; i < nftWhitelist.length; i++) {
            if (IERC721(nftWhitelist[i]).balanceOf(user) > 0) {
                return true;
            }
        }
        return false;
    }

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

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

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

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

    function balanceOf(
        address account
    ) public view virtual override returns (uint256) {
        return _balances[account];
    }

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

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

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

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function increaseAllowance(
        address spender,
        uint256 addedValue
    ) external virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(
        address spender,
        uint256 subtractedValue
    ) external virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = _allowances[owner][spender];
        require(
            currentAllowance >= subtractedValue,
            "Decreased allowance below zero"
        );
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        require(tradingStatus, "!trading");
        
        if(whitelistMode) {
            if (block.timestamp >= whitelistEndTime ) {
                whitelistMode = false;
            } else {
                if (sender == pair) { //buy
                    require(isWhitelisted(recipient) || holdsSupportedNFT(recipient), "Not whitelisted");
                } else if (recipient == pair) { //sell
                    require(isWhitelisted(sender) || holdsSupportedNFT(sender), "Not whitelisted");
                } else { //transfer
                    require((isWhitelisted(sender) || holdsSupportedNFT(sender)) && (isWhitelisted(recipient) || holdsSupportedNFT(recipient)), "Not Whitelisted");
                }
            }
        }

        if (inSwapAndLiquify) {
            return _basicTransfer(sender, recipient, amount);
        }

        if (recipient == pair && restrictWhales) {	
            require(	
                amount <= _maxTxAmount ||	
                    (isTxLimitExempt[sender] && isTxLimitExempt[recipient]),	
                "Max TX"	
            );	
        }

        if (!isTxLimitExempt[recipient] && restrictWhales) {
            require(_balances[recipient] + amount <= _walletMax, "wallet");
        }

        if (
            sender != pair &&
            !inSwapAndLiquify &&
            swapAndLiquifyEnabled &&
            _balances[address(this)] >= swapThreshold
        ) {
            swapBack();
        }

        _balances[sender] = _balances[sender] - amount;
        uint256 finalAmount = amount;

        if (sender == pair || recipient == pair) {
            finalAmount = !isFeeExempt[sender] && !isFeeExempt[recipient]
                ? takeFee(sender, recipient, amount)
                : amount;
        }

        _balances[recipient] = _balances[recipient] + finalAmount;

        // Dividend tracker
        if (!isDividendExempt[sender]) {	
            try dividendDistributor.setShare(sender, _balances[sender]) {} catch {	
                emit DistributorFail();	
            }	
        }	
        if (!isDividendExempt[recipient]) {	
            try dividendDistributor.setShare(recipient, _balances[recipient]) {} catch {	
                    emit DistributorFail();	
                }	
        }	
        try dividendDistributor.process(distributorGas) {} catch {	
            emit DistributorFail();	
        }

        emit Transfer(sender, recipient, finalAmount);
        return true;
    }

    function _basicTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (bool) {
        _balances[sender] = _balances[sender] - amount;
        _balances[recipient] = _balances[recipient] + amount;
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "Approve from the zero address");
        require(spender != address(0), "Approve to the zero address");

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

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(
                currentAllowance >= amount,
                "Insufficient allowance"
            );
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function takeFee(
        address sender,
        address recipient,
        uint256 amount
    ) internal returns (uint256) {
        uint256 feeApplicable = pair == recipient
            ? totalFeeIfSelling
            : totalFee;
        uint256 feeAmount = (amount * feeApplicable) / 100;

        _balances[address(this)] = _balances[address(this)] + feeAmount;
        emit Transfer(sender, address(this), feeAmount);

        return amount - feeAmount;
    }

    function swapBack() internal lockTheSwap {
        uint256 tokensToLiquify = _balances[address(this)];
        uint256 amountToLiquify = (tokensToLiquify * lpFee) / totalFee / 2;
        uint256 amountToSwap = tokensToLiquify - amountToLiquify;

        if (amountToSwap == 0) return;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();
        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );
        uint256 amountETH = address(this).balance;
        uint256 amountEthLiquidity = (amountETH * lpFee) / totalFee / 2;

        if (amountToLiquify > 0) {
            router.addLiquidityETH{value: amountEthLiquidity}(
                address(this),
                amountToLiquify,
                0,
                0,
                0x000000000000000000000000000000000000dEaD,
                block.timestamp
            );
        }

        uint256 amountETHafterLP = address(this).balance;
        uint256 devBalance = (amountETHafterLP * devFee) / totalFee;
        uint256 revenueBalance = (amountETHafterLP * revenueFee) / totalFee;
        uint256 amountEthReflection = amountETHafterLP -
            devBalance -
            revenueBalance;

        if (amountETHafterLP > 0) {
            if (revenueBalance > 0) {
                uint256 revenueSplit = revenueBalance / 2;
                (bool sent, ) = payable(IFACTORY(factory).proofRevenueAddress()).call{value: revenueSplit}("");
                require(sent);
                (bool sent1, ) = payable(IFACTORY(factory).proofRewardPoolAddress()).call{value: revenueSplit}("");
                require(sent1);
            }
            if (devBalance > 0) {
                (bool sent, ) = devWallet.call{value: devBalance}("");
                require(sent);
            }
        }

        try dividendDistributor.deposit{value: amountEthReflection}() {} catch {
            emit DistributorFail();
        }
    }

    function _checkLimit(uint256 _newLimit) internal view {	
        require(launchedAt != 0, "!launched");	
        require(_newLimit >= (_totalSupply * 5) / 1000, "Min 0.5%");	
        require(_newLimit <= (_totalSupply * 3) / 100, "Max 3%");	
    }

    function _checkTimestamp72() internal view {	
        require(launchedAt != 0, "!launched");	
        require(block.timestamp >= launchedAt + 72 hours, "too soon");	
    }

    function _calcTotalFee() internal {
        totalFee = devFee + lpFee + reflectionFee + revenueFee;
        totalFeeIfSelling =
            devFeeOnSell +
            lpFeeOnSell +
            reflectionFeeOnSell +
            revenueFee;
        require(totalFee <= 12, "high fee");
        require(totalFeeIfSelling <= 17, "high fee");
    }

    function _addWhitelist(address[] memory _whitelists) internal {
        uint256 length = _whitelists.length;
        for (uint256 i = 0; i < length; i++) {
            userWhitelist[_whitelists[i]] = true;
        }
    }

    function addMoreToWhitelist(WhitelistAdd_ memory _WhitelistAdd) external onlyFactory {
        _addWhitelist(_WhitelistAdd.whitelists);
    }

    receive() external payable {}
}

File 2 of 17 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../token/ERC20/extensions/IERC20Metadata.sol";

File 3 of 17 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 4 of 17 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

File 5 of 17 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 6 of 17 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 7 of 17 : DividendDistributor.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./libraries/TokenUtils.sol";
import "./interfaces/IDividendDistributor.sol";
import "./interfaces/IUniswapV2Router02.sol";
import "./interfaces/IUniswapV2Factory.sol";
import "./interfaces/IWETH.sol";

contract DividendDistributor is IDividendDistributor {
    address _token;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }

    IUniswapV2Router02 router;
    IERC20 public RewardToken;

    address[] shareholders;
    mapping(address => uint256) public shareholderIndexes;
    mapping(address => uint256) public shareholderClaims;
    mapping(address => Share) public shares;

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    uint256 public minPeriod = 30 minutes;
    uint256 public minDistribution = 1 * (10 ** 18);

    uint256 currentIndex;
    bool initialized;

    modifier onlyToken() {
        require(msg.sender == _token);
        _;
    }

    constructor(address _router, address _reflectionToken, address token) {
        router = IUniswapV2Router02(_router);
        RewardToken = IERC20(_reflectionToken);
        _token = token;
        uint8 rewardTokenDecimals = TokenUtils.expectDecimals(token);
        uint256 fixedPoint = 10 ** rewardTokenDecimals;
        minDistribution = 1 * fixedPoint;
    }

    function setDistributionCriteria(
        uint256 _minPeriod,
        uint256 _minDistribution
    ) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
    }

    function getShareHolders() external view returns (address[] memory) {
        return shareholders;
    }

    function setMinPeriod(uint256 _minPeriod) external override onlyToken {
        minPeriod = _minPeriod;
    }

    function setMinDistribution(
        uint256 _minDistribution
    ) external override onlyToken {
        minDistribution = _minDistribution;
    }

    function setShare(
        address shareholder,
        uint256 amount
    ) external override onlyToken {
        if (shares[shareholder].amount > 0) {
            distributeDividend(shareholder);
        }

        if (amount > 0 && shares[shareholder].amount == 0) {
            addShareholder(shareholder);
        } else if (amount == 0 && shares[shareholder].amount > 0) {
            removeShareholder(shareholder);
        }

        totalShares = totalShares - shares[shareholder].amount + amount;
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(
            shares[shareholder].amount
        );
    }

    function deposit() external payable override onlyToken {
        uint256 balanceBefore = RewardToken.balanceOf(address(this));

        address[] memory path = new address[](2);
        path[0] = router.WETH();
        path[1] = address(RewardToken);

        if (path[0] == path[1]) { //reward token is weth
            IWETH(path[0]).deposit{value: msg.value}();
        } else {
            router.swapExactETHForTokensSupportingFeeOnTransferTokens{
                value: msg.value
            }(0, path, address(this), block.timestamp);
        }
        uint256 amount = RewardToken.balanceOf(address(this)) - balanceBefore;
        totalDividends = totalDividends + amount;
        if (totalShares > 0) {
            dividendsPerShare =
                dividendsPerShare +
                (dividendsPerShareAccuracyFactor * amount) /
                totalShares;
        }
    }

    function process(uint256 gas) external override onlyToken {
        uint256 shareholderCount = shareholders.length;

        if (shareholderCount == 0) {
            return;
        }

        uint256 iterations = 0;
        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();

        while (gasUsed < gas && iterations < shareholderCount) {
            if (currentIndex >= shareholderCount) {
                currentIndex = 0;
            }

            if (shouldDistribute(shareholders[currentIndex])) {
                distributeDividend(shareholders[currentIndex]);
            }

            gasUsed = gasUsed + gasLeft - gasleft();
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }
    }

    function shouldDistribute(
        address shareholder
    ) internal view returns (bool) {
        return
            shareholderClaims[shareholder] + minPeriod <= block.timestamp &&
            getUnpaidEarnings(shareholder) >= minDistribution;
    }

    function distributeDividend(address shareholder) internal {
        if (shares[shareholder].amount == 0) {
            return;
        }

        uint256 amount = getUnpaidEarnings(shareholder);
        if (amount > 0) {
            totalDistributed = totalDistributed + amount;
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised =
                shares[shareholder].totalRealised +
                amount;
            shares[shareholder].totalExcluded = getCumulativeDividends(
                shares[shareholder].amount
            );
            RewardToken.transfer(shareholder, amount);
        }
    }

    function rewardTokenAddress() external view returns(address) {
        return address(RewardToken);
    }

    function claimDividend() external {
        require(shouldDistribute(msg.sender), "Too soon. Need to wait!");
        distributeDividend(msg.sender);
    }

    function getUnpaidEarnings(
        address shareholder
    ) public view returns (uint256) {
        if (shares[shareholder].amount == 0) {
            return 0;
        }

        uint256 shareholderTotalDividends = getCumulativeDividends(
            shares[shareholder].amount
        );
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;
        if (shareholderTotalDividends <= shareholderTotalExcluded) {
            return 0;
        }

        return shareholderTotalDividends - shareholderTotalExcluded;
    }

    function getCumulativeDividends(
        uint256 share
    ) internal view returns (uint256) {
        return (share * dividendsPerShare) / dividendsPerShareAccuracyFactor;
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[
            shareholders.length - 1
        ];
        shareholderIndexes[
            shareholders[shareholders.length - 1]
        ] = shareholderIndexes[shareholder];
        shareholders.pop();
    }
}

File 8 of 17 : IDividendDistributor.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

interface IDividendDistributor {
    function setDistributionCriteria(
        uint256 _minPeriod,
        uint256 _minDistribution
    ) external;

    function setShare(address shareholder, uint256 amount) external;

    function deposit() external payable;

    function process(uint256 gas) external;

    function setMinPeriod(uint256 _minPeriod) external;

    function setMinDistribution(uint256 _minDistribution) external;

    function rewardTokenAddress() external view returns(address);
}

File 9 of 17 : IFACTORY.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

interface IFACTORY {
    function proofRevenueAddress() external view returns (address);

    function proofRewardPoolAddress() external view returns (address);
}

File 10 of 17 : IProofFactoryTokenCutter.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import "../libraries/ProofFactoryFees.sol";

interface IProofFactoryTokenCutter is IERC20, IERC20Metadata {
    struct BaseData {
        string tokenName;
        string tokenSymbol;
        uint256 initialSupply;
        uint256 percentToLP;
        uint256 whitelistPeriod;
        address owner;
        address devWallet;
        address reflectionToken;
        address routerAddress;
        address initialProofAdmin;
        address[] whitelists;
        address[] nftWhitelist;
    }

    struct WhitelistAdd_ {
        address [] whitelists;
    }

    function setBasicData(
        BaseData memory _baseData,
        ProofFactoryFees.allFees memory fees
    ) external;

    function pair() external view returns (address);

    function swapTradingStatus() external;

    function updateProofFactory(address _newFactory) external;

    function addMoreToWhitelist(
        WhitelistAdd_ memory _WhitelistAdd
    ) external;

    function updateWhitelistPeriod(
        uint256 _whitelistPeriod
    ) external;

    function changeIsTxLimitExempt(
        address holder,
        bool exempt
    ) external;

    event DistributorFail();
}

File 11 of 17 : IUniswapV2Factory.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

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

File 12 of 17 : IUniswapV2Router02.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

interface IUniswapV2Router02 {
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

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

    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);
}

File 13 of 17 : IWETH.sol
interface IWETH {
    function deposit() external payable;
    function transfer(address to, uint value) external returns (bool);
    function withdraw(uint) external;
}

File 14 of 17 : Context.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

File 15 of 17 : Ownable.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

import "./Context.sol";

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "caller is not the owner");
    }

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

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

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

File 16 of 17 : ProofFactoryFees.sol
// SPDX-License-Identifier: None
pragma solidity ^0.8.17;

library ProofFactoryFees {
    struct allFees {
        uint256 reflectionFee;
        uint256 reflectionFeeOnSell;
        uint256 lpFee;
        uint256 lpFeeOnSell;
        uint256 devFee;
        uint256 devFeeOnSell;
    }
}

File 17 of 17 : TokenUtils.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/interfaces/IERC20Metadata.sol";

/// @title  TokenUtils
library TokenUtils  {
    /// @dev A safe function to get the decimals of an ERC20 token.
    ///
    /// @dev Reverts with a {CallFailed} error if execution of the query fails or returns an unexpected value.
    ///
    /// @param token The target token.
    ///
    /// @return The amount of decimals of the token.
    function expectDecimals(address token) internal view returns (uint8) {
        (bool success, bytes memory data) = token.staticcall(
            abi.encodeWithSelector(IERC20Metadata.decimals.selector)
        );

        require (success, "invalid");

        return abi.decode(data, (uint8));
    }   
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"DistributorFail","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_walletMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"whitelists","type":"address[]"}],"internalType":"struct IProofFactoryTokenCutter.WhitelistAdd_","name":"_WhitelistAdd","type":"tuple"}],"name":"addMoreToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proofFee","type":"uint256"}],"name":"adjustProofFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_distributorGas","type":"uint256"}],"name":"changeDistributorGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"initialReflectionFee","type":"uint256"},{"internalType":"uint256","name":"initialReflectionFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"initialLpFee","type":"uint256"},{"internalType":"uint256","name":"initialLpFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"initialDevFee","type":"uint256"},{"internalType":"uint256","name":"initialDevFeeOnSell","type":"uint256"}],"name":"changeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"changeIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"changeIsTxLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minDistLimit","type":"uint256"}],"name":"changeMinDistSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newValue","type":"bool"}],"name":"changeRestrictWhales","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enableSwapBack","type":"bool"},{"internalType":"uint256","name":"newSwapBackLimit","type":"uint256"}],"name":"changeSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"changeTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"changeWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendDistributor","outputs":[{"internalType":"contract IDividendDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"holdsSupportedNFT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isFeeExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isTxLimitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftWhitelist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proofAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reduceProofFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"restrictWhales","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revenueFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"uint256","name":"percentToLP","type":"uint256"},{"internalType":"uint256","name":"whitelistPeriod","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"devWallet","type":"address"},{"internalType":"address","name":"reflectionToken","type":"address"},{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"address","name":"initialProofAdmin","type":"address"},{"internalType":"address[]","name":"whitelists","type":"address[]"},{"internalType":"address[]","name":"nftWhitelist","type":"address[]"}],"internalType":"struct IProofFactoryTokenCutter.BaseData","name":"_baseData","type":"tuple"},{"components":[{"internalType":"uint256","name":"reflectionFee","type":"uint256"},{"internalType":"uint256","name":"reflectionFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"lpFee","type":"uint256"},{"internalType":"uint256","name":"lpFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"devFee","type":"uint256"},{"internalType":"uint256","name":"devFeeOnSell","type":"uint256"}],"internalType":"struct ProofFactoryFees.allFees","name":"fees","type":"tuple"}],"name":"setBasicData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newDevWallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinPeriod_","type":"uint256"},{"internalType":"uint256","name":"newMinDistribution_","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setLaunchedAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newOwnerWallet","type":"address"}],"name":"setOwnerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTradingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeIfSelling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"updateProofAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFactory","type":"address"}],"name":"updateProofFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_whitelistPeriod","type":"uint256"}],"name":"updateWhitelistPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080806040523461006b576207a12060019081556009805460ff19169091179055600c805460ff60a01b1916600160a01b1790556002601155601e805461ffff60a81b191661010160a81b179055601c80546001600160a01b0319163317905561470d90816100718239f35b600080fdfe60808060405260043610156200001f575b5036156200001d57600080fd5b005b600090813560e01c9081630445b66714620022c25750806306fdde03146200220e578063095ea7b314620021e1578063125f9e33146200216757806316d9962b146200213357806318160ddd14620021135780631df4ccfc14620020f35780631f53ac0214620020a157806323b872dd1462001fe057806327193bc41462001f545780632b112e491462001f045780632d48e8961462001e8a578063313ce5671462001e6c57806336e4ec641462001e4c578063395093511462001df35780633af32abf14620008325780633c8228121462001d105780633dab52691462001cb55780633f4218e01462001c725780634355855a1462001c2f57806344de2e4c1462001c075780634509a9881462001bb9578063497a000a1462001b425780634a74bb021462001b1a578063546a88111462001a7d57806359a51c341462001a525780636457f6bf1462000f5a57806364d817fa1462000ecc5780636827e7641462000eac578063704ce43e1462000e8c57806370a082311462000e4f57806370c757ec1462000e2a5780637c0ff2051462000e0a5780637d1db4a51462000dea5780637db1342c1462000dab578063807c2d9c1462000d8c57806383ad79941462000d6c5780638b42507f1462000d295780638ea5220f1462000cfe57806390fbd17f1462000cca5780639502c4261462000caa57806395d89b411462000bb7578063a3a2e89e1462000b51578063a3e676101462000b26578063a457c2d71462000a7d578063a8aa1b311462000a52578063a9059cbb1462000a19578063b48e665e14620009f9578063bad3ea6a14620009d0578063bb542ef01462000981578063bf56b3711462000961578063c45a01551462000936578063ca987b0e1462000916578063cb29813c14620008bd578063cc6badb3146200089d578063d4fb9a011462000875578063d741b9c31462000832578063d920334e14620007f3578063dd62ed3e146200079e578063e4cbd6b314620006af578063e572967b14620005fc578063e66b1d1e14620005a7578063ebdfd7221462000587578063ef92e22214620004a2578063f16fd78d146200043c578063f887ea401462000411578063fabe628314620003a85763fbd7575303620000105734620003a55780600319360112620003a5576200038160018060a01b03601c54163314620024c0565b601e805460ff60b01b19811660b091821c60ff161590911b60ff60b01b1617905580f35b80fd5b5034620003a5576040366003190112620003a5576200040e620003ca6200232b565b620003d46200239a565b601d5490916001600160a01b0391620003f190831633146200261f565b168352600e602052604083209060ff801983541691151516179055565b80f35b5034620003a55780600319360112620003a557601a546040516001600160a01b039091168152602090f35b5034620003a5576020366003190112620003a5576200045a6200232b565b600c54906001600160a01b0390620004768284163314620025dd565b1680916001600160601b0360a01b1617600c558152600260205260408120600160ff1982541617905580f35b5034620003a55780600319360112620003a557620004cc60018060a01b03601d541633146200261f565b6002601154036200054f57601054620004e78115156200265c565b6203f48081018091116200053b5742106200050b5760016011556200040e6200352d565b60405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b6044820152606490fd5b634e487b7160e01b82526011600452602482fd5b60405162461bcd60e51b815260206004820152601060248201526f08585b1c9958591e481c99591d58d95960821b6044820152606490fd5b5034620003a55780600319360112620003a5576020600754604051908152f35b5034620003a5576020366003190112620003a557620005c56200238a565b620005dc60018060a01b03601d541633146200261f565b600c805460ff60a01b191691151560a01b60ff60a01b1691909117905580f35b5034620003a557600319602036820112620006ab57600435906001600160401b03908183116200068d576020908336030112620006a757604051906020820182811082821117620006915760405282600401359081116200068d576200040e9260046200066d923692010162002449565b81526200068660018060a01b03601c54163314620024c0565b5162003591565b8380fd5b634e487b7160e01b600052604160045260246000fd5b8280fd5b5080fd5b5034620003a55780620006c23662002373565b601d5490916001600160a01b0391620006df90831633146200261f565b8184541690813b156200079a57849160248392604051948593849263f821076960e01b845260048401525af19081156200078f57849162000777575b50541690813b1562000773578291602483926040519485938492635117196160e01b845260048401525af180156200076857620007555750f35b6200076090620023aa565b620003a55780f35b6040513d84823e3d90fd5b5050fd5b6200078290620023aa565b620007735782386200071b565b6040513d86823e3d90fd5b8480fd5b5034620003a5576040366003190112620003a557620007bc6200232b565b6040620007c862002347565b9260018060a01b03809316815260056020522091166000526020526020604060002054604051908152f35b5034620003a5576020366003190112620003a5576004356200082160018060a01b03601d541633146200261f565b6200082c8162003447565b601f5580f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b03620008616200232b565b168152600284522054166040519015158152f35b5034620003a55780600319360112620003a557602060ff601e5460b01c166040519015158152f35b5034620003a55780600319360112620003a5576020601554604051908152f35b5034620003a55760c0366003190112620003a557620008e860018060a01b03601d541633146200261f565b60043560125560443560135560843560145560243560155560643560165560a4356017556200040e6200352d565b5034620003a55780600319360112620003a5576020601954604051908152f35b5034620003a55780600319360112620003a557601c546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a5576020601054604051908152f35b5034620003a5576020366003190112620003a5576004356001600160a01b0381811691829003620006a757620009bf601d549133908316146200261f565b6001600160a01b03191617601d5580f35b5034620003a55780600319360112620003a557546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a5576020600854604051908152f35b5034620003a5576040366003190112620003a55762000a4662000a3b6200232b565b6024359033620027b5565b50602060405160018152f35b5034620003a55780600319360112620003a557601b546040516001600160a01b039091168152602090f35b5034620003a5576040366003190112620003a55762000a9b6200232b565b60406024359233815260056020522060018060a01b0382166000526020526040600020549180831062000ae15762000ad69203903362002e91565b602060405160018152f35b60405162461bcd60e51b815260206004820152601e60248201527f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00006044820152606490fd5b5034620003a55780600319360112620003a557601d546040516001600160a01b039091168152602090f35b5034620003a5576040366003190112620003a5576200040e62000b736200232b565b62000b7d6200239a565b601d5490916001600160a01b039162000b9a90831633146200261f565b168352600d602052604083209060ff801983541691151516179055565b5034620003a55780600319360112620003a5576040519080600b5462000bdd81620024ff565b8085529160019180831690811562000c7d575060011462000c1d575b62000c198562000c0c81870382620023be565b60405191829182620022e0565b0390f35b9250600b83527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db95b82841062000c6457505050810160200162000c0c8262000c1962000bf9565b8054602085870181019190915290930192810162000c45565b86955062000c199693506020925062000c0c94915060ff191682840152151560051b820101929362000bf9565b5034620003a55780600319360112620003a5576020601754604051908152f35b5034620003a5576020366003190112620003a557602062000cf462000cee6200232b565b620026a5565b6040519015158152f35b5034620003a55780600319360112620003a557601e546040516001600160a01b039091168152602090f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b0362000d586200232b565b168152600e84522054166040519015158152f35b5034620003a55780600319360112620003a5576020601254604051908152f35b5034620003a55780600319360112620003a55760208054604051908152f35b5034620003a5576020366003190112620003a55760043562000dd960018060a01b03601d541633146200261f565b62000de48162003447565b60205580f35b5034620003a55780600319360112620003a5576020601f54604051908152f35b5034620003a55780600319360112620003a5576020601654604051908152f35b5034620003a55780600319360112620003a557602060ff600954166040519015158152f35b5034620003a5576020366003190112620003a5576020906040906001600160a01b0362000e7b6200232b565b168152600483522054604051908152f35b5034620003a55780600319360112620003a5576020601354604051908152f35b5034620003a55780600319360112620003a5576020601454604051908152f35b5034620003a5576020366003190112620003a55762000eea6200232b565b601c546001600160a01b03919062000f069083163314620024c0565b1680825260026020526040822060ff1990600182825416179055600e60205260408320600182825416179055600d602052600160408420918254161790556001600160601b0360a01b601c541617601c5580f35b5034620003a5576003199060e036830112620003a5576001600160401b0360043511620003a557610180809260043536030112620003a5576040519182018281106001600160401b038211176200069157604052600435600401356001600160401b038111620006ab5762000fd7906004369181350101620023fc565b8252602460043501356001600160401b038111620006ab5762001002906004369181350101620023fc565b6020830152600435604481013560408401526064810135606084015260848101356080840152620010369060a4016200235e565b60a08301526200104b60c4600435016200235e565b60c08301526200106060e4600435016200235e565b60e083015262001076610104600435016200235e565b6101008301526200108d610124600435016200235e565b61012083015261014460043501356001600160401b038111620006ab57620010bd90600436918135010162002449565b6101408301526001600160401b03610164600435013511620003a557620010f03660048035610164810135010162002449565b61016083015260c0366023190112620003a5576040519060c082018281106001600160401b038211176200069157604052602435825260443560208301526064356040830152608435606083015260a435608083015260c43560a08301526200116560018060a01b03601c54163314620024c0565b82519283516001600160401b03811162001a3e5762001186600a54620024ff565b601f8111620019ec575b50602094601f82116001146200196557948394958293949262001959575b50508160011b916000199060031b1c191617600a555b60208101519283516001600160401b0381116200194557620011e8600b54620024ff565b601f8111620018e7575b50602094601f82116001146200186057948495829394959262001854575b50508160011b916000199060031b1c191617600b555b62001238604083015160065462002555565b6006556046606083015110620018265760646200125f604084015160608501519062002579565b048362001271826040860151620025ae565b913382526004602052604082206200128b82825462002555565b905560a08501516001600160a01b031682526004602052604082208054620012b590859062002555565b90556040519081526000805160206200469883398151915290828260203393a360a08501516040519384526001600160a01b031692602090a3604082015160058102908082046005149015171562001812576103e89004601f5560408201518080046001148115171562001812576064900460205560408201518060058102046005148115171562001812576005610fa09102046021558260018060a01b036101008401511681601a54826001600160601b0360a01b821617601a5516176040519063c45a015560e01b8252602082600481845afa90811562001774576004928492620017eb575b50602090604051938480926315ab88c960e31b82525afa91821562001774576020926044918591620017c9575b506040516364e329cb60e11b81526001600160a01b0391821660048201523060248201529485938492165af19081156200078f57849162001793575b50601b80546001600160a01b0319166001600160a01b03928316179055308452600560209081526040808620601a5484166000908152925290819020600019905561010084015160e085015191519291821691166001600160401b0361107a8401908111908411176200177f5761107a620035fe843961107a830190815260208101919091523060408201528190036060019084f08015620017745783546001600160a01b0319166001600160a01b0391821617845530845260026020526040808520805460ff199081166001908117909255601c54841687528287208054821683179055601b5484168752828720805482168317905560a0860151841687528287208054821683179055610120860151841687528287208054821683179055610100860151909316865290852080549092161790556101408201516200154d9062003591565b6101608201518051906001600160401b038211620017605768010000000000000000821162001760576020906003548360035580841062001738575b500160038552845b8281106200170b57505030808552600d602090815260408087208054600160ff199182168117909255601c80546001600160a01b039081168b52848b208054841685179055868b52600e8652848b20805484168517905560a08a81015182168c52858c208054851686179055601b805483168d52868d208054861687179055925482168c52858c20805485168617905561dead808d52868d2080548616871790558c8052868d20805486168717905592549091168b52600f8652848b208054841685179055958a52838a20805483168417905589528289208054821683179055888052828920805490911690911790556080808701516008558551601255908501516013558401516014558301516015556060830151601655919091015160175550620016bd6200352d565b60a0810151601d80546001600160a01b03199081166001600160a01b039384161790915560c0830151601e8054831691841691909117905561012090920151600c8054909316911617905580f35b81516001600160a01b03166000805160206200467883398151915282015560209091019060010162001591565b6200175990846000805160206200467883398151915291820191016200253c565b3862001589565b634e487b7160e01b85526041600452602485fd5b6040513d85823e3d90fd5b634e487b7160e01b86526041600452602486fd5b620017ba915060203d602011620017c1575b620017b18183620023be565b810190620025bc565b3862001406565b503d620017a5565b620017e49150843d8611620017c157620017b18183620023be565b38620013ca565b60209192506200180a90823d8411620017c157620017b18183620023be565b91906200139d565b634e487b7160e01b84526011600452602484fd5b60405162461bcd60e51b815260206004820152600660248201526506c6f77206c760d41b6044820152606490fd5b01519050388062001210565b600b8552601f198216957f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db991865b888110620018ce57508360019596979810620018b4575b505050811b01600b5562001226565b015160001960f88460031b161c19169055388080620018a5565b919260206001819286850151815501940192016200188e565b6200193390600b86527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9601f840160051c810191602085106200193a575b601f0160051c01906200253c565b38620011f2565b909150819062001925565b634e487b7160e01b84526041600452602484fd5b015190503880620011ae565b600a8452601f198216957fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a891855b888110620019d357508360019596979810620019b9575b505050811b01600a55620011c4565b015160001960f88460031b161c19169055388080620019aa565b9192602060018192868501518155019401920162001993565b62001a3790600a85527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8601f840160051c810191602085106200193a57601f0160051c01906200253c565b3862001190565b634e487b7160e01b83526041600452602483fd5b5034620003a55780600319360112620003a557600c546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a557601c546001600160a01b039062001aab9082163314620024c0565b80601a54168252600d602052604082209060ff199160018382541617905580601a54168352600e60205260408320600183825416179055601d5416825260016040832091825416179055601e5460ff60a01b19600c5416600c55600160b01b9061ffff60a81b191617601e5580f35b5034620003a55780600319360112620003a557602060ff601e5460a81c166040519015158152f35b5034620003a5576020366003190112620003a55760043562001b7060018060a01b03600c54163314620025dd565b8060085560105481603c0291603c83040362001ba5579062001b929162002555565b600755600160ff19600954161760095580f35b634e487b7160e01b83526011600452602483fd5b5034620003a5576020366003190112620003a557600435600354811015620006ab5760036000526000805160206200467883398151915201546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a557602060ff600c5460a01c166040519015158152f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b0362001c5e6200232b565b168152600f84522054166040519015158152f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b0362001ca16200232b565b168152600d84522054166040519015158152f35b5034620003a5576040366003190112620003a55762001cd36200238a565b62001cea60018060a01b03601d541633146200261f565b601e805460ff60a81b191691151560a81b60ff60a81b1691909117905560243560215580f35b5034620003a5576020366003190112620003a55760043562001d3e60018060a01b03600c54163314620025dd565b60105462001d4e8115156200265c565b6203f480810180911162001ba557421062001dc75760018111620006ab578062001dc19160115562001d9f8162001d9962001d8f6014546013549062002555565b6012549062002555565b62002555565b60185562001d9962001db76017546016549062002555565b6015549062002555565b60195580f35b60028111620006ab578062001dc19160115562001d9f8162001d9962001d8f6014546013549062002555565b5034620003a5576040366003190112620003a55762000ad690604062001e186200232b565b9133815260056020522060018060a01b03821660005260205262001e4460243560406000205462002555565b903362002e91565b5034620003a55780600319360112620003a5576020601154604051908152f35b5034620003a55780600319360112620003a557602060405160098152f35b5034620003a5578062001e9d3662002373565b601d549192916001600160a01b039062001ebb90821633146200261f565b82541692833b15620006a7576044908360405195869485936316a4744b60e11b8552600485015260248401525af18015620007685762001ef9575080f35b6200040e90620023aa565b5034620003a55780600319360112620003a55762001f4c602091604062001f3b60065461dead8452600486528284205490620025ae565b9180805260048552205490620025ae565b604051908152f35b5034620003a55780600319360112620003a55762001f7e60018060a01b03601c54163314620024c0565b60105462001fa8574260105560085480603c0290603c8204036200053b5762001b92904262002555565b60405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481b185d5b98da195960821b6044820152606490fd5b5034620003a5576060366003190112620003a55762001ffe6200232b565b906200200962002347565b60406044359260018060a01b03851681526005602052818120338252602052205492600019840362002042575b62000a469350620027b5565b82841062002063576200205d8362000a469503338362002e91565b62002036565b60405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606490fd5b5034620003a5576020366003190112620003a5576004356001600160a01b0381811691829003620006a757620020dd90601d541633146200261f565b6001600160601b0360a01b601e541617601e5580f35b5034620003a55780600319360112620003a5576020601854604051908152f35b5034620003a55780600319360112620003a5576020600654604051908152f35b5034620003a5576020366003190112620003a5576200215e60018060a01b03601d541633146200261f565b60043560015580f35b5034620003a55780600319360112620003a557805460405163125f9e3360e01b8152906001600160a01b03906020908390600490829085165afa918215620017745760209392620021bd575b5060405191168152f35b620021d9919250833d8111620017c157620017b18183620023be565b9038620021b3565b5034620003a5576040366003190112620003a55762000ad6620022036200232b565b602435903362002e91565b5034620003a55780600319360112620003a5576040519080600a546200223481620024ff565b8085529160019180831690811562000c7d5750600114620022625762000c198562000c0c81870382620023be565b9250600a83527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85b828410620022a957505050810160200162000c0c8262000c1962000bf9565b805460208587018101919091529093019281016200228a565b905034620006ab5781600319360112620006ab576020906021548152f35b6020808252825181830181905290939260005b8281106200231657505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501620022f3565b600435906001600160a01b03821682036200234257565b600080fd5b602435906001600160a01b03821682036200234257565b35906001600160a01b03821682036200234257565b604090600319011262002342576004359060243590565b6004359081151582036200234257565b6024359081151582036200234257565b6001600160401b0381116200069157604052565b90601f801991011681019081106001600160401b038211176200069157604052565b6001600160401b0381116200069157601f01601f191660200190565b81601f8201121562002342578035906200241682620023e0565b92620024266040519485620023be565b828452602083830101116200234257816000926020809301838601378301015290565b9080601f8301121562002342578135906001600160401b03821162000691578160051b604051936020936200248185840187620023be565b8552838086019282010192831162002342578301905b828210620024a6575050505090565b838091620024b4846200235e565b81520191019062002497565b15620024c857565b60405162461bcd60e51b815260206004820152600f60248201526e6e6f742074686520666163746f727960881b6044820152606490fd5b90600182811c9216801562002531575b60208310146200251b57565b634e487b7160e01b600052602260045260246000fd5b91607f16916200250f565b81811062002548575050565b600081556001016200253c565b919082018092116200256357565b634e487b7160e01b600052601160045260246000fd5b818102929181159184041417156200256357565b811562002598570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116200256357565b908160209103126200234257516001600160a01b0381168103620023425790565b15620025e557565b60405162461bcd60e51b81526020600482015260126024820152713737ba103a343290383937b7b320b236b4b760711b6044820152606490fd5b156200262757565b60405162461bcd60e51b815260206004820152600d60248201526c3737ba103a34329037bbb732b960991b6044820152606490fd5b156200266457565b60405162461bcd60e51b8152602060048201526009602482015268085b185d5b98da195960ba1b6044820152606490fd5b6000198114620025635760010190565b60009060038054925b838110620026bf5750505050600090565b600082905260008051602062004678833981519152810154604080516370a0823160e01b81526001600160a01b0386811660048301529092602091829185916024918391165afa9182156200276c57506000916200273a575b50905062002731576200272b9062002695565b620026ae565b50505050600190565b82813d831162002764575b620027518183620023be565b81010312620003a5575051803862002718565b503d62002745565b513d6000823e3d90fd5b156200277e57565b60405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606490fd5b601e80546000959460ff92909160b01c83161562002e615760095483811662002d0d575b5082815460a01c1662002c9a57601b546001600160a01b038681169691811695918991908888148062002c8b575b62002c15575b888352602096600e88526040958787838188205416158062002c06575b62002baf575b5050838616998a14158062002ba0575b8062002b92575b8062002b7b575b62002b52575b508884526004948589526200286d8888872054620025ae565b8a8652868a5287862055601b54841688818c14801562002b48575b62002a9c575b50508a8552858952620028a5888887205462002555565b8b8652868a5287862055898552600f89528187862054161562002a00575b50898452600f88528584205416156200296a575b508154169160015490833b15620006a757602490838651958694859363ffb2c47960e01b85528401525af190816200294e575b5096600080516020620046988339815191529495969715600014620029475780600080516020620046b883398151915291a15b51908152a3600190565b506200293d565b6200295a8991620023aa565b6200296657386200290a565b8780fd5b818354168488528584205491813b156200079a578651630a5b654b60e11b81526001600160a01b039091168682019081526020810193909352918491829184919082908490829060400103925af19182620029e8575b5050620029e257600080516020620046b88339815191528280a15b38620028d7565b620029db565b620029f390620023aa565b620006a7578238620029c0565b9091929384815416868a528782205490803b15620006a7578851630a5b654b60e11b81526001600160a01b039094168885019081526020810192909252839182908490829060400103925af1908162002a80575b508b9392919062002a7a57600080516020620046b88339815191528480a15b38620028c3565b62002a73565b62002a91909c919493929c620023aa565b9a9091923862002a54565b90919850600d8a528b838988205416158062002b37575b1562002b2e5762002b16920362002b1f57606462002ad56019545b8362002579565b0490308752878b5262002aec828a89205462002555565b308852888c528988205588518281528c600080516020620046988339815191528d3093a3620025ae565b9638806200288e565b606462002ad560185462002ace565b50905062002b16565b5086528b8389882054161562002ab3565b50818d1462002888565b805460ff60a01b19908116600160a01b17825562002b6f62002fb3565b81541690553862002854565b50308552600489528685205460215411156200284e565b5081815460a81c1662002847565b5081815460a01c161562002840565b62002bc4929394959660048c52205462002555565b88541062002bd957908b939291878762002830565b855162461bcd60e51b81526004810189905260066024820152651dd85b1b195d60d21b6044820152606490fd5b5083600c5460a01c166200282a565b9150601f54851180159062002c61575b1562002c335789916200280d565b60405162461bcd60e51b815260206004820152600660248201526509ac2f040a8b60d31b6044820152606490fd5b508083168a52600e6020528560408b205416801562002c255750878a528560408b20541662002c25565b5086600c5460a01c1662002807565b5060209150600080516020620046988339815191529260018060a09897981b03809116948587526004845262002cd5836040892054620025ae565b8688526004855260408820551694858152604062002cf7838284205462002555565b91878152600485522055604051908152a3600190565b600754421062002d265760ff19166009555b38620027d9565b50601b546001600160a01b039085821690821681810362002d8457505085168752600260205282604088205416801562002d6c575b62002d669062002776565b62002d1f565b5062002d6662002d7c86620026a5565b905062002d5b565b9091871690810362002dc157508752600260205282604088205416801562002db15762002d669062002776565b5062002d6662002d7c85620026a5565b90885260026020528360408920541690811562002e4d575b8162002e1d575b5062002d665760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606490fd5b885250600260205260408720548316801562002e3b575b3862002de0565b5062002e4785620026a5565b62002e34565b905062002e5a85620026a5565b9062002dd9565b60405162461bcd60e51b81526020600482015260086024820152672174726164696e6760c01b6044820152606490fd5b6001600160a01b0390811691821562002f39571691821562002ef45760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260058252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152601b60248201527f417070726f766520746f20746865207a65726f206164647265737300000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f417070726f76652066726f6d20746865207a65726f20616464726573730000006044820152606490fd5b3d1562002fae573d9062002f9282620023e0565b9162002fa26040519384620023be565b82523d6000602084013e565b606090565b600030815260046020908082526040908184205462002fe362002fd96013548362002579565b601854906200258d565b62002ff4600191821c8093620025ae565b9182156200343e578451606081018181106001600160401b038211176200342b5786526002815286810193863686378151156200341857308552601a5487516315ab88c960e31b81526001600160a01b039691871692908a818a81875afa9081156200340e578c91620033ec575b508451871015620033d957871689850152823b15620033d557885163791ac94760e01b815288810191909152602481018b905260a06044820152925160a484018190528a928492909160c48401919085898e5b838310620033b15750505050508383809230606483015242608483015203925af18015620033a7576200338f575b50908691620030fa62002fd9476013549062002579565b821c9080620032f3575b50504795620031166014548862002579565b916200313f6200312a60185480956200258d565b93620031396011548b62002579565b6200258d565b90620031578262003151868c620025ae565b620025ae565b98620031c3575b50505050541691823b156200079a579184929183925180958193630d0e30db60e41b83525af19182620031ab575b5050620031a85780600080516020620046b883398151915291a1565b50565b620031b690620023aa565b620006ab5781386200318c565b8162003201575b50505080620031dd575b8080806200315e565b8180809285601e54165af1620031f262002f7e565b50156200079a578438620031d4565b90919293501c90848185601c5416885192838092633690e28760e01b82525afa908115620032c75789808588829583958491620032d1575b50165af16200324762002f7e565b50156200296657848185601c541688519283809263d7e7a9e760e01b82525afa918215620032c7578993868594859485948592620032a5575b5050165af16200328f62002f7e565b5015620032a1578590388080620031ca565b8580fd5b620032bf9250803d10620017c157620017b18183620023be565b388062003280565b87513d8b823e3d90fd5b620032ec9150883d8a11620017c157620017b18183620023be565b3862003239565b60609192935060c485601a5416918851948593849263f305d71960e01b8452308b85015260248401528c60448401528c606484015261dead60848401524260a48401525af1801562003385579087929162003350575b8062003104565b6060809293503d81116200337d575b6200336b8183620023be565b81010312620032a15785903862003349565b503d6200335f565b85513d89823e3d90fd5b6200339e9097919297620023aa565b959038620030e3565b86513d8a823e3d90fd5b929597509295509281908b87511681520194019101908c9492869492898e620030b5565b8a80fd5b634e487b7160e01b8c526032895260248cfd5b6200340791508b3d8d11620017c157620017b18183620023be565b3862003062565b8a513d8e823e3d90fd5b634e487b7160e01b895260328652602489fd5b634e487b7160e01b895260418652602489fd5b50505050505050565b6200345660105415156200265c565b6006546005810281159082810460051482171562002563576103e890048310620034c557600382029182046003141715620025635760649004106200349757565b60405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606490fd5b60405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606490fd5b15620034fd57565b60405162461bcd60e51b8152602060048201526008602482015267686967682066656560c01b6044820152606490fd5b6200358f60116200354862001d8f6014546013549062002555565b62003587600c6200357a620035608554809562002555565b938460185562001d9962001db76017546016549062002555565b92836019551115620034f5565b1115620034f5565b565b805160005b818110620035a357505050565b8251811015620035e757620035e1906002602060018060a01b03818460051b8801015116600052526040600020600160ff1982541617905562002695565b62003596565b634e487b7160e01b600052603260045260246000fdfe608060409080825234620001df576060816200107a8038038091620000258285620001e4565b833981010312620001df576200003b816200021e565b6020906200005884620000508486016200021e565b94016200021e565b6ec097ce7bc90715b34b9f1000000000600b55610708600c55670de0b6b3a7640000600d55600180546001600160a01b03199081166001600160a01b03948516179091556002805482169584169590951790945560008054909416918116919091178355835163313ce56760e01b838201908152600482526001600160401b03929180870184811182821017620001cb5787525185928392905afa3d15620001c1573d918211620001ad578451916200011b601f8201601f1916850184620001e4565b82523d848484013e5b156200017f5781818051810103126200017b5701519060ff82168092036200017857604d8211620001645750600a0a600d5551610e469081620002348239f35b634e487b7160e01b81526011600452602490fd5b80fd5b8280fd5b835162461bcd60e51b81526004810183905260076024820152661a5b9d985b1a5960ca1b6044820152606490fd5b634e487b7160e01b84526041600452602484fd5b6060915062000124565b634e487b7160e01b87526041600452602487fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200020857604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001df5756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826311ce023d146109f357508163125f9e331461018957816314b6ca96146107b657816328fd3198146107895781632d48e896146107595781633a98ef391461073a5781634fab0ae81461071b57816351171961146106f057816366817df5146106b85781638477d9f31461061f578163997664d714610600578163ce7c2ac2146105b2578163d0e30db014610298578163d4fda1f214610262578163e2d2e21914610243578163efca2eed14610224578163f0fc6bca146101b2578163f1e9f1e514610189578163f82107691461015e578163ffb2c4791461012d575063ffd49c841461010c57600080fd5b34610129578160031936011261012957602090600c549051908152f35b5080fd5b8390346101295760203660031901126101295781546001600160a01b031633036101295761015b9035610b8a565b80f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600c5580f35b50503461012957816003193601126101295760025490516001600160a01b039091168152602090f35b919050346102205782600319360112610220576101ce33610c58565b156101dd578261015b33610c9c565b906020606492519162461bcd60e51b8352820152601760248201527f546f6f20736f6f6e2e204e65656420746f2077616974210000000000000000006044820152fd5b8280fd5b5050346101295781600319360112610129576020906009549051908152f35b505034610129578160031936011261012957602090600a549051908152f35b9050346102205760203660031901126102205760209282916001600160a01b0361028a610a0f565b168252845220549051908152f35b919050826003193601126102205782546001600160a01b039190821633036105ae578160025416908051916370a0823160e01b9384845230868501526020918285602481845afa9485156105a4578895610571575b508351906060820182811067ffffffffffffffff82111761055e5785526002825284368584013782600154169085516315ab88c960e31b815285818b81865afa908115610554578b9161051a575b508461034685610ade565b9116905261035383610b01565b52888361035f84610ade565b51168461036b85610b01565b51160361049657505061037e8291610ade565b51169087823b15610493578088938651998a8092630d0e30db60e41b825234905af197881561048757849596979861046a575b50506024905b600254169685519788938492835230908301525afa9182156104615750849161042c575b506103e69250610aae565b6103f281600854610ad1565b6008556007549081610402578280f35b61041d61042392610418600a5493600b54610b11565b610b24565b90610ad1565b600a5538808280f35b905082813d831161045a575b6104428183610a8c565b81010312610455576103e69151386103db565b600080fd5b503d610438565b513d86823e3d90fd5b61047691929450610a62565b61048357829187386103b1565b8680fd5b508451903d90823e3d90fd5b80fd5b9091829894959697983b15610129576104d0928751808095819463b6f9de9560e01b8352868a840152608060248401526084830190610a25565b306044830152426064830152039134905af18015610510576104f8575b5090602483926103b7565b83929197610507602492610a62565b979192506104ed565b85513d8a823e3d90fd5b90508581813d831161054d575b6105318183610a8c565b8101031261054957518481168103610549573861033b565b8a80fd5b503d610527565b87513d8d823e3d90fd5b634e487b7160e01b8a526041895260248afd5b9094508281813d831161059d575b6105898183610a8c565b81010312610599575193386102ed565b8780fd5b503d61057f565b84513d8a823e3d90fd5b8380fd5b5050346101295760203660031901126101295760609181906001600160a01b036105da610a0f565b168152600660205220805491600260018301549201549181519384526020840152820152f35b5050346101295781600319360112610129576020906008549051908152f35b50503461012957816003193601126101295780519081809360035490818552602080950191600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915b868282106106985785906106948861068584890385610a8c565b51928284938452830190610a25565b0390f35b83546001600160a01b03168552889550909301926001928301920161066b565b5050346101295760203660031901126101295760209181906001600160a01b036106e0610a0f565b1681526005845220549051908152f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600d5580f35b505034610129578160031936011261012957602090600d549051908152f35b5050346101295781600319360112610129576020906007549051908152f35b91905034610220573660031901126101295781546001600160a01b031633036101295735600c55602435600d5580f35b505034610129576020366003190112610129576020906107af6107aa610a0f565b610dad565b9051908152f35b8383346101295780600319360112610129576107d0610a0f565b82546024359291906001600160a01b0390811633036109ef5780821693848652600692602092848452858820546109e1575b82158015806109d0575b156108d55750506003548688528884528086892055680100000000000000008110156108c2576001969798509061084b828861086f9401600355610b44565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b61088e81610889600754898b52868652878b205490610aae565b610ad1565b600755858752828252838720556108b76108ae84882054600a5490610b11565b600b5490610b24565b948652528320015580f35b634e487b7160e01b885260418952602488fd5b909150806109be575b6108ef575b5060019495965061086f565b60038054600019908181019081116109ab578361090e61092792610b44565b905490851b1c16898b528b875261084b898c2054610b44565b878952898552868920548254828101908111610998576109478591610b44565b905490851b1c168a528a8652878a20558154801561098557600198999a50019161097083610b44565b9091825491841b1b19169055558695946108e3565b634e487b7160e01b8a5260318b5260248afd5b634e487b7160e01b8b5260118c5260248bfd5b634e487b7160e01b8a5260118b5260248afd5b508587528383528487205415156108de565b50878952858552868920541561080c565b6109ea82610c9c565b610802565b8480fd5b849034610129578160031936011261012957602090600b548152f35b600435906001600160a01b038216820361045557565b90815180825260208080930193019160005b828110610a45575050505090565b83516001600160a01b031685529381019392810192600101610a37565b67ffffffffffffffff8111610a7657604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a7657604052565b91908203918211610abb57565b634e487b7160e01b600052601160045260246000fd5b91908201809211610abb57565b805115610aeb5760200190565b634e487b7160e01b600052603260045260246000fd5b805160011015610aeb5760400190565b81810292918115918404141715610abb57565b8115610b2e570490565b634e487b7160e01b600052601260045260246000fd5b600354811015610aeb5760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b6000198114610abb5760010190565b906003908154908115610c525792916000908180955a5b86881080610c49575b15610c3f57610bfd610bf6610c1192600e9a898c541015610c37575b8b54610bea610bd482610b44565b90546001600160a01b0392918c1b1c8216610c58565b610c18575b5050610ad1565b5a90610aae565b945a98610c0a8154610b7b565b9055610b7b565b9396610ba1565b610c24610c3092610b44565b9054908b1b1c16610c9c565b3880610bef565b868c55610bc6565b5095505050505050565b50858510610baa565b92505050565b6001600160a01b038116600090815260056020526040902054600c54610c7d91610ad1565b4210159081610c8a575090565b610c949150610dad565b600d54111590565b60018060a01b0380821690600092828452602091600683526040918286205415610ccf57610cc990610dad565b80610cd7575b505050505050565b60448492610ce783600954610ad1565b60095586885260058452428589205560068452610d0a836002878b200154610ad1565b878952600685526002868a200155610d2b6108ae868a2054600a5490610b11565b878952600685526001868a2001556002541695878551978894859363a9059cbb60e01b8552600485015260248401525af1908115610da45750610d71575b808080610ccf565b81813d8311610d9d575b610d858183610a8c565b81010312610129575180151503610493578080610d69565b503d610d7b565b513d85823e3d90fd5b6001600160a01b031660008181526006602052604081205490919015610e0c57610de16108ae6040842054600a5490610b11565b908252600660205260016040832001549081811115610e0757610e049250610aae565b90565b505090565b509056fea2646970667358221220bdfc7f0abe73f0bfce3c2f01f9220a81c0e23741e935cc0ee148b2d50c15ded964736f6c63430008110033c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85bddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efd491e240ecd34d50a8e73bc9d6e4edd4580d0daf50f4cea2ae5d0a527615281ca2646970667358221220ecfeaa3592127e6068b536b47f112cc8829ce899c958931f3974056fd48866c064736f6c63430008110033

Deployed Bytecode

0x60808060405260043610156200001f575b5036156200001d57600080fd5b005b600090813560e01c9081630445b66714620022c25750806306fdde03146200220e578063095ea7b314620021e1578063125f9e33146200216757806316d9962b146200213357806318160ddd14620021135780631df4ccfc14620020f35780631f53ac0214620020a157806323b872dd1462001fe057806327193bc41462001f545780632b112e491462001f045780632d48e8961462001e8a578063313ce5671462001e6c57806336e4ec641462001e4c578063395093511462001df35780633af32abf14620008325780633c8228121462001d105780633dab52691462001cb55780633f4218e01462001c725780634355855a1462001c2f57806344de2e4c1462001c075780634509a9881462001bb9578063497a000a1462001b425780634a74bb021462001b1a578063546a88111462001a7d57806359a51c341462001a525780636457f6bf1462000f5a57806364d817fa1462000ecc5780636827e7641462000eac578063704ce43e1462000e8c57806370a082311462000e4f57806370c757ec1462000e2a5780637c0ff2051462000e0a5780637d1db4a51462000dea5780637db1342c1462000dab578063807c2d9c1462000d8c57806383ad79941462000d6c5780638b42507f1462000d295780638ea5220f1462000cfe57806390fbd17f1462000cca5780639502c4261462000caa57806395d89b411462000bb7578063a3a2e89e1462000b51578063a3e676101462000b26578063a457c2d71462000a7d578063a8aa1b311462000a52578063a9059cbb1462000a19578063b48e665e14620009f9578063bad3ea6a14620009d0578063bb542ef01462000981578063bf56b3711462000961578063c45a01551462000936578063ca987b0e1462000916578063cb29813c14620008bd578063cc6badb3146200089d578063d4fb9a011462000875578063d741b9c31462000832578063d920334e14620007f3578063dd62ed3e146200079e578063e4cbd6b314620006af578063e572967b14620005fc578063e66b1d1e14620005a7578063ebdfd7221462000587578063ef92e22214620004a2578063f16fd78d146200043c578063f887ea401462000411578063fabe628314620003a85763fbd7575303620000105734620003a55780600319360112620003a5576200038160018060a01b03601c54163314620024c0565b601e805460ff60b01b19811660b091821c60ff161590911b60ff60b01b1617905580f35b80fd5b5034620003a5576040366003190112620003a5576200040e620003ca6200232b565b620003d46200239a565b601d5490916001600160a01b0391620003f190831633146200261f565b168352600e602052604083209060ff801983541691151516179055565b80f35b5034620003a55780600319360112620003a557601a546040516001600160a01b039091168152602090f35b5034620003a5576020366003190112620003a5576200045a6200232b565b600c54906001600160a01b0390620004768284163314620025dd565b1680916001600160601b0360a01b1617600c558152600260205260408120600160ff1982541617905580f35b5034620003a55780600319360112620003a557620004cc60018060a01b03601d541633146200261f565b6002601154036200054f57601054620004e78115156200265c565b6203f48081018091116200053b5742106200050b5760016011556200040e6200352d565b60405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b6044820152606490fd5b634e487b7160e01b82526011600452602482fd5b60405162461bcd60e51b815260206004820152601060248201526f08585b1c9958591e481c99591d58d95960821b6044820152606490fd5b5034620003a55780600319360112620003a5576020600754604051908152f35b5034620003a5576020366003190112620003a557620005c56200238a565b620005dc60018060a01b03601d541633146200261f565b600c805460ff60a01b191691151560a01b60ff60a01b1691909117905580f35b5034620003a557600319602036820112620006ab57600435906001600160401b03908183116200068d576020908336030112620006a757604051906020820182811082821117620006915760405282600401359081116200068d576200040e9260046200066d923692010162002449565b81526200068660018060a01b03601c54163314620024c0565b5162003591565b8380fd5b634e487b7160e01b600052604160045260246000fd5b8280fd5b5080fd5b5034620003a55780620006c23662002373565b601d5490916001600160a01b0391620006df90831633146200261f565b8184541690813b156200079a57849160248392604051948593849263f821076960e01b845260048401525af19081156200078f57849162000777575b50541690813b1562000773578291602483926040519485938492635117196160e01b845260048401525af180156200076857620007555750f35b6200076090620023aa565b620003a55780f35b6040513d84823e3d90fd5b5050fd5b6200078290620023aa565b620007735782386200071b565b6040513d86823e3d90fd5b8480fd5b5034620003a5576040366003190112620003a557620007bc6200232b565b6040620007c862002347565b9260018060a01b03809316815260056020522091166000526020526020604060002054604051908152f35b5034620003a5576020366003190112620003a5576004356200082160018060a01b03601d541633146200261f565b6200082c8162003447565b601f5580f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b03620008616200232b565b168152600284522054166040519015158152f35b5034620003a55780600319360112620003a557602060ff601e5460b01c166040519015158152f35b5034620003a55780600319360112620003a5576020601554604051908152f35b5034620003a55760c0366003190112620003a557620008e860018060a01b03601d541633146200261f565b60043560125560443560135560843560145560243560155560643560165560a4356017556200040e6200352d565b5034620003a55780600319360112620003a5576020601954604051908152f35b5034620003a55780600319360112620003a557601c546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a5576020601054604051908152f35b5034620003a5576020366003190112620003a5576004356001600160a01b0381811691829003620006a757620009bf601d549133908316146200261f565b6001600160a01b03191617601d5580f35b5034620003a55780600319360112620003a557546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a5576020600854604051908152f35b5034620003a5576040366003190112620003a55762000a4662000a3b6200232b565b6024359033620027b5565b50602060405160018152f35b5034620003a55780600319360112620003a557601b546040516001600160a01b039091168152602090f35b5034620003a5576040366003190112620003a55762000a9b6200232b565b60406024359233815260056020522060018060a01b0382166000526020526040600020549180831062000ae15762000ad69203903362002e91565b602060405160018152f35b60405162461bcd60e51b815260206004820152601e60248201527f44656372656173656420616c6c6f77616e63652062656c6f77207a65726f00006044820152606490fd5b5034620003a55780600319360112620003a557601d546040516001600160a01b039091168152602090f35b5034620003a5576040366003190112620003a5576200040e62000b736200232b565b62000b7d6200239a565b601d5490916001600160a01b039162000b9a90831633146200261f565b168352600d602052604083209060ff801983541691151516179055565b5034620003a55780600319360112620003a5576040519080600b5462000bdd81620024ff565b8085529160019180831690811562000c7d575060011462000c1d575b62000c198562000c0c81870382620023be565b60405191829182620022e0565b0390f35b9250600b83527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db95b82841062000c6457505050810160200162000c0c8262000c1962000bf9565b8054602085870181019190915290930192810162000c45565b86955062000c199693506020925062000c0c94915060ff191682840152151560051b820101929362000bf9565b5034620003a55780600319360112620003a5576020601754604051908152f35b5034620003a5576020366003190112620003a557602062000cf462000cee6200232b565b620026a5565b6040519015158152f35b5034620003a55780600319360112620003a557601e546040516001600160a01b039091168152602090f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b0362000d586200232b565b168152600e84522054166040519015158152f35b5034620003a55780600319360112620003a5576020601254604051908152f35b5034620003a55780600319360112620003a55760208054604051908152f35b5034620003a5576020366003190112620003a55760043562000dd960018060a01b03601d541633146200261f565b62000de48162003447565b60205580f35b5034620003a55780600319360112620003a5576020601f54604051908152f35b5034620003a55780600319360112620003a5576020601654604051908152f35b5034620003a55780600319360112620003a557602060ff600954166040519015158152f35b5034620003a5576020366003190112620003a5576020906040906001600160a01b0362000e7b6200232b565b168152600483522054604051908152f35b5034620003a55780600319360112620003a5576020601354604051908152f35b5034620003a55780600319360112620003a5576020601454604051908152f35b5034620003a5576020366003190112620003a55762000eea6200232b565b601c546001600160a01b03919062000f069083163314620024c0565b1680825260026020526040822060ff1990600182825416179055600e60205260408320600182825416179055600d602052600160408420918254161790556001600160601b0360a01b601c541617601c5580f35b5034620003a5576003199060e036830112620003a5576001600160401b0360043511620003a557610180809260043536030112620003a5576040519182018281106001600160401b038211176200069157604052600435600401356001600160401b038111620006ab5762000fd7906004369181350101620023fc565b8252602460043501356001600160401b038111620006ab5762001002906004369181350101620023fc565b6020830152600435604481013560408401526064810135606084015260848101356080840152620010369060a4016200235e565b60a08301526200104b60c4600435016200235e565b60c08301526200106060e4600435016200235e565b60e083015262001076610104600435016200235e565b6101008301526200108d610124600435016200235e565b61012083015261014460043501356001600160401b038111620006ab57620010bd90600436918135010162002449565b6101408301526001600160401b03610164600435013511620003a557620010f03660048035610164810135010162002449565b61016083015260c0366023190112620003a5576040519060c082018281106001600160401b038211176200069157604052602435825260443560208301526064356040830152608435606083015260a435608083015260c43560a08301526200116560018060a01b03601c54163314620024c0565b82519283516001600160401b03811162001a3e5762001186600a54620024ff565b601f8111620019ec575b50602094601f82116001146200196557948394958293949262001959575b50508160011b916000199060031b1c191617600a555b60208101519283516001600160401b0381116200194557620011e8600b54620024ff565b601f8111620018e7575b50602094601f82116001146200186057948495829394959262001854575b50508160011b916000199060031b1c191617600b555b62001238604083015160065462002555565b6006556046606083015110620018265760646200125f604084015160608501519062002579565b048362001271826040860151620025ae565b913382526004602052604082206200128b82825462002555565b905560a08501516001600160a01b031682526004602052604082208054620012b590859062002555565b90556040519081526000805160206200469883398151915290828260203393a360a08501516040519384526001600160a01b031692602090a3604082015160058102908082046005149015171562001812576103e89004601f5560408201518080046001148115171562001812576064900460205560408201518060058102046005148115171562001812576005610fa09102046021558260018060a01b036101008401511681601a54826001600160601b0360a01b821617601a5516176040519063c45a015560e01b8252602082600481845afa90811562001774576004928492620017eb575b50602090604051938480926315ab88c960e31b82525afa91821562001774576020926044918591620017c9575b506040516364e329cb60e11b81526001600160a01b0391821660048201523060248201529485938492165af19081156200078f57849162001793575b50601b80546001600160a01b0319166001600160a01b03928316179055308452600560209081526040808620601a5484166000908152925290819020600019905561010084015160e085015191519291821691166001600160401b0361107a8401908111908411176200177f5761107a620035fe843961107a830190815260208101919091523060408201528190036060019084f08015620017745783546001600160a01b0319166001600160a01b0391821617845530845260026020526040808520805460ff199081166001908117909255601c54841687528287208054821683179055601b5484168752828720805482168317905560a0860151841687528287208054821683179055610120860151841687528287208054821683179055610100860151909316865290852080549092161790556101408201516200154d9062003591565b6101608201518051906001600160401b038211620017605768010000000000000000821162001760576020906003548360035580841062001738575b500160038552845b8281106200170b57505030808552600d602090815260408087208054600160ff199182168117909255601c80546001600160a01b039081168b52848b208054841685179055868b52600e8652848b20805484168517905560a08a81015182168c52858c208054851686179055601b805483168d52868d208054861687179055925482168c52858c20805485168617905561dead808d52868d2080548616871790558c8052868d20805486168717905592549091168b52600f8652848b208054841685179055958a52838a20805483168417905589528289208054821683179055888052828920805490911690911790556080808701516008558551601255908501516013558401516014558301516015556060830151601655919091015160175550620016bd6200352d565b60a0810151601d80546001600160a01b03199081166001600160a01b039384161790915560c0830151601e8054831691841691909117905561012090920151600c8054909316911617905580f35b81516001600160a01b03166000805160206200467883398151915282015560209091019060010162001591565b6200175990846000805160206200467883398151915291820191016200253c565b3862001589565b634e487b7160e01b85526041600452602485fd5b6040513d85823e3d90fd5b634e487b7160e01b86526041600452602486fd5b620017ba915060203d602011620017c1575b620017b18183620023be565b810190620025bc565b3862001406565b503d620017a5565b620017e49150843d8611620017c157620017b18183620023be565b38620013ca565b60209192506200180a90823d8411620017c157620017b18183620023be565b91906200139d565b634e487b7160e01b84526011600452602484fd5b60405162461bcd60e51b815260206004820152600660248201526506c6f77206c760d41b6044820152606490fd5b01519050388062001210565b600b8552601f198216957f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db991865b888110620018ce57508360019596979810620018b4575b505050811b01600b5562001226565b015160001960f88460031b161c19169055388080620018a5565b919260206001819286850151815501940192016200188e565b6200193390600b86527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9601f840160051c810191602085106200193a575b601f0160051c01906200253c565b38620011f2565b909150819062001925565b634e487b7160e01b84526041600452602484fd5b015190503880620011ae565b600a8452601f198216957fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a891855b888110620019d357508360019596979810620019b9575b505050811b01600a55620011c4565b015160001960f88460031b161c19169055388080620019aa565b9192602060018192868501518155019401920162001993565b62001a3790600a85527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8601f840160051c810191602085106200193a57601f0160051c01906200253c565b3862001190565b634e487b7160e01b83526041600452602483fd5b5034620003a55780600319360112620003a557600c546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a557601c546001600160a01b039062001aab9082163314620024c0565b80601a54168252600d602052604082209060ff199160018382541617905580601a54168352600e60205260408320600183825416179055601d5416825260016040832091825416179055601e5460ff60a01b19600c5416600c55600160b01b9061ffff60a81b191617601e5580f35b5034620003a55780600319360112620003a557602060ff601e5460a81c166040519015158152f35b5034620003a5576020366003190112620003a55760043562001b7060018060a01b03600c54163314620025dd565b8060085560105481603c0291603c83040362001ba5579062001b929162002555565b600755600160ff19600954161760095580f35b634e487b7160e01b83526011600452602483fd5b5034620003a5576020366003190112620003a557600435600354811015620006ab5760036000526000805160206200467883398151915201546040516001600160a01b039091168152602090f35b5034620003a55780600319360112620003a557602060ff600c5460a01c166040519015158152f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b0362001c5e6200232b565b168152600f84522054166040519015158152f35b5034620003a5576020366003190112620003a55760209060ff906040906001600160a01b0362001ca16200232b565b168152600d84522054166040519015158152f35b5034620003a5576040366003190112620003a55762001cd36200238a565b62001cea60018060a01b03601d541633146200261f565b601e805460ff60a81b191691151560a81b60ff60a81b1691909117905560243560215580f35b5034620003a5576020366003190112620003a55760043562001d3e60018060a01b03600c54163314620025dd565b60105462001d4e8115156200265c565b6203f480810180911162001ba557421062001dc75760018111620006ab578062001dc19160115562001d9f8162001d9962001d8f6014546013549062002555565b6012549062002555565b62002555565b60185562001d9962001db76017546016549062002555565b6015549062002555565b60195580f35b60028111620006ab578062001dc19160115562001d9f8162001d9962001d8f6014546013549062002555565b5034620003a5576040366003190112620003a55762000ad690604062001e186200232b565b9133815260056020522060018060a01b03821660005260205262001e4460243560406000205462002555565b903362002e91565b5034620003a55780600319360112620003a5576020601154604051908152f35b5034620003a55780600319360112620003a557602060405160098152f35b5034620003a5578062001e9d3662002373565b601d549192916001600160a01b039062001ebb90821633146200261f565b82541692833b15620006a7576044908360405195869485936316a4744b60e11b8552600485015260248401525af18015620007685762001ef9575080f35b6200040e90620023aa565b5034620003a55780600319360112620003a55762001f4c602091604062001f3b60065461dead8452600486528284205490620025ae565b9180805260048552205490620025ae565b604051908152f35b5034620003a55780600319360112620003a55762001f7e60018060a01b03601c54163314620024c0565b60105462001fa8574260105560085480603c0290603c8204036200053b5762001b92904262002555565b60405162461bcd60e51b815260206004820152601060248201526f185b1c9958591e481b185d5b98da195960821b6044820152606490fd5b5034620003a5576060366003190112620003a55762001ffe6200232b565b906200200962002347565b60406044359260018060a01b03851681526005602052818120338252602052205492600019840362002042575b62000a469350620027b5565b82841062002063576200205d8362000a469503338362002e91565b62002036565b60405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606490fd5b5034620003a5576020366003190112620003a5576004356001600160a01b0381811691829003620006a757620020dd90601d541633146200261f565b6001600160601b0360a01b601e541617601e5580f35b5034620003a55780600319360112620003a5576020601854604051908152f35b5034620003a55780600319360112620003a5576020600654604051908152f35b5034620003a5576020366003190112620003a5576200215e60018060a01b03601d541633146200261f565b60043560015580f35b5034620003a55780600319360112620003a557805460405163125f9e3360e01b8152906001600160a01b03906020908390600490829085165afa918215620017745760209392620021bd575b5060405191168152f35b620021d9919250833d8111620017c157620017b18183620023be565b9038620021b3565b5034620003a5576040366003190112620003a55762000ad6620022036200232b565b602435903362002e91565b5034620003a55780600319360112620003a5576040519080600a546200223481620024ff565b8085529160019180831690811562000c7d5750600114620022625762000c198562000c0c81870382620023be565b9250600a83527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a85b828410620022a957505050810160200162000c0c8262000c1962000bf9565b805460208587018101919091529093019281016200228a565b905034620006ab5781600319360112620006ab576020906021548152f35b6020808252825181830181905290939260005b8281106200231657505060409293506000838284010152601f8019910116010190565b818101860151848201604001528501620022f3565b600435906001600160a01b03821682036200234257565b600080fd5b602435906001600160a01b03821682036200234257565b35906001600160a01b03821682036200234257565b604090600319011262002342576004359060243590565b6004359081151582036200234257565b6024359081151582036200234257565b6001600160401b0381116200069157604052565b90601f801991011681019081106001600160401b038211176200069157604052565b6001600160401b0381116200069157601f01601f191660200190565b81601f8201121562002342578035906200241682620023e0565b92620024266040519485620023be565b828452602083830101116200234257816000926020809301838601378301015290565b9080601f8301121562002342578135906001600160401b03821162000691578160051b604051936020936200248185840187620023be565b8552838086019282010192831162002342578301905b828210620024a6575050505090565b838091620024b4846200235e565b81520191019062002497565b15620024c857565b60405162461bcd60e51b815260206004820152600f60248201526e6e6f742074686520666163746f727960881b6044820152606490fd5b90600182811c9216801562002531575b60208310146200251b57565b634e487b7160e01b600052602260045260246000fd5b91607f16916200250f565b81811062002548575050565b600081556001016200253c565b919082018092116200256357565b634e487b7160e01b600052601160045260246000fd5b818102929181159184041417156200256357565b811562002598570490565b634e487b7160e01b600052601260045260246000fd5b919082039182116200256357565b908160209103126200234257516001600160a01b0381168103620023425790565b15620025e557565b60405162461bcd60e51b81526020600482015260126024820152713737ba103a343290383937b7b320b236b4b760711b6044820152606490fd5b156200262757565b60405162461bcd60e51b815260206004820152600d60248201526c3737ba103a34329037bbb732b960991b6044820152606490fd5b156200266457565b60405162461bcd60e51b8152602060048201526009602482015268085b185d5b98da195960ba1b6044820152606490fd5b6000198114620025635760010190565b60009060038054925b838110620026bf5750505050600090565b600082905260008051602062004678833981519152810154604080516370a0823160e01b81526001600160a01b0386811660048301529092602091829185916024918391165afa9182156200276c57506000916200273a575b50905062002731576200272b9062002695565b620026ae565b50505050600190565b82813d831162002764575b620027518183620023be565b81010312620003a5575051803862002718565b503d62002745565b513d6000823e3d90fd5b156200277e57565b60405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606490fd5b601e80546000959460ff92909160b01c83161562002e615760095483811662002d0d575b5082815460a01c1662002c9a57601b546001600160a01b038681169691811695918991908888148062002c8b575b62002c15575b888352602096600e88526040958787838188205416158062002c06575b62002baf575b5050838616998a14158062002ba0575b8062002b92575b8062002b7b575b62002b52575b508884526004948589526200286d8888872054620025ae565b8a8652868a5287862055601b54841688818c14801562002b48575b62002a9c575b50508a8552858952620028a5888887205462002555565b8b8652868a5287862055898552600f89528187862054161562002a00575b50898452600f88528584205416156200296a575b508154169160015490833b15620006a757602490838651958694859363ffb2c47960e01b85528401525af190816200294e575b5096600080516020620046988339815191529495969715600014620029475780600080516020620046b883398151915291a15b51908152a3600190565b506200293d565b6200295a8991620023aa565b6200296657386200290a565b8780fd5b818354168488528584205491813b156200079a578651630a5b654b60e11b81526001600160a01b039091168682019081526020810193909352918491829184919082908490829060400103925af19182620029e8575b5050620029e257600080516020620046b88339815191528280a15b38620028d7565b620029db565b620029f390620023aa565b620006a7578238620029c0565b9091929384815416868a528782205490803b15620006a7578851630a5b654b60e11b81526001600160a01b039094168885019081526020810192909252839182908490829060400103925af1908162002a80575b508b9392919062002a7a57600080516020620046b88339815191528480a15b38620028c3565b62002a73565b62002a91909c919493929c620023aa565b9a9091923862002a54565b90919850600d8a528b838988205416158062002b37575b1562002b2e5762002b16920362002b1f57606462002ad56019545b8362002579565b0490308752878b5262002aec828a89205462002555565b308852888c528988205588518281528c600080516020620046988339815191528d3093a3620025ae565b9638806200288e565b606462002ad560185462002ace565b50905062002b16565b5086528b8389882054161562002ab3565b50818d1462002888565b805460ff60a01b19908116600160a01b17825562002b6f62002fb3565b81541690553862002854565b50308552600489528685205460215411156200284e565b5081815460a81c1662002847565b5081815460a01c161562002840565b62002bc4929394959660048c52205462002555565b88541062002bd957908b939291878762002830565b855162461bcd60e51b81526004810189905260066024820152651dd85b1b195d60d21b6044820152606490fd5b5083600c5460a01c166200282a565b9150601f54851180159062002c61575b1562002c335789916200280d565b60405162461bcd60e51b815260206004820152600660248201526509ac2f040a8b60d31b6044820152606490fd5b508083168a52600e6020528560408b205416801562002c255750878a528560408b20541662002c25565b5086600c5460a01c1662002807565b5060209150600080516020620046988339815191529260018060a09897981b03809116948587526004845262002cd5836040892054620025ae565b8688526004855260408820551694858152604062002cf7838284205462002555565b91878152600485522055604051908152a3600190565b600754421062002d265760ff19166009555b38620027d9565b50601b546001600160a01b039085821690821681810362002d8457505085168752600260205282604088205416801562002d6c575b62002d669062002776565b62002d1f565b5062002d6662002d7c86620026a5565b905062002d5b565b9091871690810362002dc157508752600260205282604088205416801562002db15762002d669062002776565b5062002d6662002d7c85620026a5565b90885260026020528360408920541690811562002e4d575b8162002e1d575b5062002d665760405162461bcd60e51b815260206004820152600f60248201526e139bdd0815da1a5d195b1a5cdd1959608a1b6044820152606490fd5b885250600260205260408720548316801562002e3b575b3862002de0565b5062002e4785620026a5565b62002e34565b905062002e5a85620026a5565b9062002dd9565b60405162461bcd60e51b81526020600482015260086024820152672174726164696e6760c01b6044820152606490fd5b6001600160a01b0390811691821562002f39571691821562002ef45760207f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925918360005260058252604060002085600052825280604060002055604051908152a3565b60405162461bcd60e51b815260206004820152601b60248201527f417070726f766520746f20746865207a65726f206164647265737300000000006044820152606490fd5b60405162461bcd60e51b815260206004820152601d60248201527f417070726f76652066726f6d20746865207a65726f20616464726573730000006044820152606490fd5b3d1562002fae573d9062002f9282620023e0565b9162002fa26040519384620023be565b82523d6000602084013e565b606090565b600030815260046020908082526040908184205462002fe362002fd96013548362002579565b601854906200258d565b62002ff4600191821c8093620025ae565b9182156200343e578451606081018181106001600160401b038211176200342b5786526002815286810193863686378151156200341857308552601a5487516315ab88c960e31b81526001600160a01b039691871692908a818a81875afa9081156200340e578c91620033ec575b508451871015620033d957871689850152823b15620033d557885163791ac94760e01b815288810191909152602481018b905260a06044820152925160a484018190528a928492909160c48401919085898e5b838310620033b15750505050508383809230606483015242608483015203925af18015620033a7576200338f575b50908691620030fa62002fd9476013549062002579565b821c9080620032f3575b50504795620031166014548862002579565b916200313f6200312a60185480956200258d565b93620031396011548b62002579565b6200258d565b90620031578262003151868c620025ae565b620025ae565b98620031c3575b50505050541691823b156200079a579184929183925180958193630d0e30db60e41b83525af19182620031ab575b5050620031a85780600080516020620046b883398151915291a1565b50565b620031b690620023aa565b620006ab5781386200318c565b8162003201575b50505080620031dd575b8080806200315e565b8180809285601e54165af1620031f262002f7e565b50156200079a578438620031d4565b90919293501c90848185601c5416885192838092633690e28760e01b82525afa908115620032c75789808588829583958491620032d1575b50165af16200324762002f7e565b50156200296657848185601c541688519283809263d7e7a9e760e01b82525afa918215620032c7578993868594859485948592620032a5575b5050165af16200328f62002f7e565b5015620032a1578590388080620031ca565b8580fd5b620032bf9250803d10620017c157620017b18183620023be565b388062003280565b87513d8b823e3d90fd5b620032ec9150883d8a11620017c157620017b18183620023be565b3862003239565b60609192935060c485601a5416918851948593849263f305d71960e01b8452308b85015260248401528c60448401528c606484015261dead60848401524260a48401525af1801562003385579087929162003350575b8062003104565b6060809293503d81116200337d575b6200336b8183620023be565b81010312620032a15785903862003349565b503d6200335f565b85513d89823e3d90fd5b6200339e9097919297620023aa565b959038620030e3565b86513d8a823e3d90fd5b929597509295509281908b87511681520194019101908c9492869492898e620030b5565b8a80fd5b634e487b7160e01b8c526032895260248cfd5b6200340791508b3d8d11620017c157620017b18183620023be565b3862003062565b8a513d8e823e3d90fd5b634e487b7160e01b895260328652602489fd5b634e487b7160e01b895260418652602489fd5b50505050505050565b6200345660105415156200265c565b6006546005810281159082810460051482171562002563576103e890048310620034c557600382029182046003141715620025635760649004106200349757565b60405162461bcd60e51b81526020600482015260066024820152654d617820332560d01b6044820152606490fd5b60405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b6044820152606490fd5b15620034fd57565b60405162461bcd60e51b8152602060048201526008602482015267686967682066656560c01b6044820152606490fd5b6200358f60116200354862001d8f6014546013549062002555565b62003587600c6200357a620035608554809562002555565b938460185562001d9962001db76017546016549062002555565b92836019551115620034f5565b1115620034f5565b565b805160005b818110620035a357505050565b8251811015620035e757620035e1906002602060018060a01b03818460051b8801015116600052526040600020600160ff1982541617905562002695565b62003596565b634e487b7160e01b600052603260045260246000fdfe608060409080825234620001df576060816200107a8038038091620000258285620001e4565b833981010312620001df576200003b816200021e565b6020906200005884620000508486016200021e565b94016200021e565b6ec097ce7bc90715b34b9f1000000000600b55610708600c55670de0b6b3a7640000600d55600180546001600160a01b03199081166001600160a01b03948516179091556002805482169584169590951790945560008054909416918116919091178355835163313ce56760e01b838201908152600482526001600160401b03929180870184811182821017620001cb5787525185928392905afa3d15620001c1573d918211620001ad578451916200011b601f8201601f1916850184620001e4565b82523d848484013e5b156200017f5781818051810103126200017b5701519060ff82168092036200017857604d8211620001645750600a0a600d5551610e469081620002348239f35b634e487b7160e01b81526011600452602490fd5b80fd5b8280fd5b835162461bcd60e51b81526004810183905260076024820152661a5b9d985b1a5960ca1b6044820152606490fd5b634e487b7160e01b84526041600452602484fd5b6060915062000124565b634e487b7160e01b87526041600452602487fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200020857604052565b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b0382168203620001df5756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826311ce023d146109f357508163125f9e331461018957816314b6ca96146107b657816328fd3198146107895781632d48e896146107595781633a98ef391461073a5781634fab0ae81461071b57816351171961146106f057816366817df5146106b85781638477d9f31461061f578163997664d714610600578163ce7c2ac2146105b2578163d0e30db014610298578163d4fda1f214610262578163e2d2e21914610243578163efca2eed14610224578163f0fc6bca146101b2578163f1e9f1e514610189578163f82107691461015e578163ffb2c4791461012d575063ffd49c841461010c57600080fd5b34610129578160031936011261012957602090600c549051908152f35b5080fd5b8390346101295760203660031901126101295781546001600160a01b031633036101295761015b9035610b8a565b80f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600c5580f35b50503461012957816003193601126101295760025490516001600160a01b039091168152602090f35b919050346102205782600319360112610220576101ce33610c58565b156101dd578261015b33610c9c565b906020606492519162461bcd60e51b8352820152601760248201527f546f6f20736f6f6e2e204e65656420746f2077616974210000000000000000006044820152fd5b8280fd5b5050346101295781600319360112610129576020906009549051908152f35b505034610129578160031936011261012957602090600a549051908152f35b9050346102205760203660031901126102205760209282916001600160a01b0361028a610a0f565b168252845220549051908152f35b919050826003193601126102205782546001600160a01b039190821633036105ae578160025416908051916370a0823160e01b9384845230868501526020918285602481845afa9485156105a4578895610571575b508351906060820182811067ffffffffffffffff82111761055e5785526002825284368584013782600154169085516315ab88c960e31b815285818b81865afa908115610554578b9161051a575b508461034685610ade565b9116905261035383610b01565b52888361035f84610ade565b51168461036b85610b01565b51160361049657505061037e8291610ade565b51169087823b15610493578088938651998a8092630d0e30db60e41b825234905af197881561048757849596979861046a575b50506024905b600254169685519788938492835230908301525afa9182156104615750849161042c575b506103e69250610aae565b6103f281600854610ad1565b6008556007549081610402578280f35b61041d61042392610418600a5493600b54610b11565b610b24565b90610ad1565b600a5538808280f35b905082813d831161045a575b6104428183610a8c565b81010312610455576103e69151386103db565b600080fd5b503d610438565b513d86823e3d90fd5b61047691929450610a62565b61048357829187386103b1565b8680fd5b508451903d90823e3d90fd5b80fd5b9091829894959697983b15610129576104d0928751808095819463b6f9de9560e01b8352868a840152608060248401526084830190610a25565b306044830152426064830152039134905af18015610510576104f8575b5090602483926103b7565b83929197610507602492610a62565b979192506104ed565b85513d8a823e3d90fd5b90508581813d831161054d575b6105318183610a8c565b8101031261054957518481168103610549573861033b565b8a80fd5b503d610527565b87513d8d823e3d90fd5b634e487b7160e01b8a526041895260248afd5b9094508281813d831161059d575b6105898183610a8c565b81010312610599575193386102ed565b8780fd5b503d61057f565b84513d8a823e3d90fd5b8380fd5b5050346101295760203660031901126101295760609181906001600160a01b036105da610a0f565b168152600660205220805491600260018301549201549181519384526020840152820152f35b5050346101295781600319360112610129576020906008549051908152f35b50503461012957816003193601126101295780519081809360035490818552602080950191600382527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b915b868282106106985785906106948861068584890385610a8c565b51928284938452830190610a25565b0390f35b83546001600160a01b03168552889550909301926001928301920161066b565b5050346101295760203660031901126101295760209181906001600160a01b036106e0610a0f565b1681526005845220549051908152f35b8390346101295760203660031901126101295781546001600160a01b031633036101295735600d5580f35b505034610129578160031936011261012957602090600d549051908152f35b5050346101295781600319360112610129576020906007549051908152f35b91905034610220573660031901126101295781546001600160a01b031633036101295735600c55602435600d5580f35b505034610129576020366003190112610129576020906107af6107aa610a0f565b610dad565b9051908152f35b8383346101295780600319360112610129576107d0610a0f565b82546024359291906001600160a01b0390811633036109ef5780821693848652600692602092848452858820546109e1575b82158015806109d0575b156108d55750506003548688528884528086892055680100000000000000008110156108c2576001969798509061084b828861086f9401600355610b44565b90919082549060031b9160018060a01b039283811b93849216901b16911916179055565b61088e81610889600754898b52868652878b205490610aae565b610ad1565b600755858752828252838720556108b76108ae84882054600a5490610b11565b600b5490610b24565b948652528320015580f35b634e487b7160e01b885260418952602488fd5b909150806109be575b6108ef575b5060019495965061086f565b60038054600019908181019081116109ab578361090e61092792610b44565b905490851b1c16898b528b875261084b898c2054610b44565b878952898552868920548254828101908111610998576109478591610b44565b905490851b1c168a528a8652878a20558154801561098557600198999a50019161097083610b44565b9091825491841b1b19169055558695946108e3565b634e487b7160e01b8a5260318b5260248afd5b634e487b7160e01b8b5260118c5260248bfd5b634e487b7160e01b8a5260118b5260248afd5b508587528383528487205415156108de565b50878952858552868920541561080c565b6109ea82610c9c565b610802565b8480fd5b849034610129578160031936011261012957602090600b548152f35b600435906001600160a01b038216820361045557565b90815180825260208080930193019160005b828110610a45575050505090565b83516001600160a01b031685529381019392810192600101610a37565b67ffffffffffffffff8111610a7657604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610a7657604052565b91908203918211610abb57565b634e487b7160e01b600052601160045260246000fd5b91908201809211610abb57565b805115610aeb5760200190565b634e487b7160e01b600052603260045260246000fd5b805160011015610aeb5760400190565b81810292918115918404141715610abb57565b8115610b2e570490565b634e487b7160e01b600052601260045260246000fd5b600354811015610aeb5760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b6000198114610abb5760010190565b906003908154908115610c525792916000908180955a5b86881080610c49575b15610c3f57610bfd610bf6610c1192600e9a898c541015610c37575b8b54610bea610bd482610b44565b90546001600160a01b0392918c1b1c8216610c58565b610c18575b5050610ad1565b5a90610aae565b945a98610c0a8154610b7b565b9055610b7b565b9396610ba1565b610c24610c3092610b44565b9054908b1b1c16610c9c565b3880610bef565b868c55610bc6565b5095505050505050565b50858510610baa565b92505050565b6001600160a01b038116600090815260056020526040902054600c54610c7d91610ad1565b4210159081610c8a575090565b610c949150610dad565b600d54111590565b60018060a01b0380821690600092828452602091600683526040918286205415610ccf57610cc990610dad565b80610cd7575b505050505050565b60448492610ce783600954610ad1565b60095586885260058452428589205560068452610d0a836002878b200154610ad1565b878952600685526002868a200155610d2b6108ae868a2054600a5490610b11565b878952600685526001868a2001556002541695878551978894859363a9059cbb60e01b8552600485015260248401525af1908115610da45750610d71575b808080610ccf565b81813d8311610d9d575b610d858183610a8c565b81010312610129575180151503610493578080610d69565b503d610d7b565b513d85823e3d90fd5b6001600160a01b031660008181526006602052604081205490919015610e0c57610de16108ae6040842054600a5490610b11565b908252600660205260016040832001549081811115610e0757610e049250610aae565b90565b505090565b509056fea2646970667358221220bdfc7f0abe73f0bfce3c2f01f9220a81c0e23741e935cc0ee148b2d50c15ded964736f6c63430008110033c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85bddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efd491e240ecd34d50a8e73bc9d6e4edd4580d0daf50f4cea2ae5d0a527615281ca2646970667358221220ecfeaa3592127e6068b536b47f112cc8829ce899c958931f3974056fd48866c064736f6c63430008110033

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

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