ETH Price: $3,443.95 (-0.34%)
Gas: 3 Gwei

Token

TOPIA (TOPIA)
 

Overview

Max Total Supply

1,786,087.547026200376051489 TOPIA

Holders

574

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
robzone.eth
Balance
1,644.79983590310152808 TOPIA

Value
$0.00
0x476Be6B54668FDAf31185C5909Cb8703fe086f34
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:
TOPIA

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license
File 1 of 14 : Topia.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "./interfaces/IPYESwapFactory.sol";
import "./interfaces/IPYESwapRouter.sol";


contract TOPIA is AccessControl, ERC20 {
    using SafeMath for uint256;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant BURNER_ROLE = keccak256("BURNER_ROLE");
    bytes32 public constant FEE_SETTER_ROLE = keccak256("FEE_SETTER_ROLE");

    // Fees
    // Add and remove fee types and destinations here as needed
    struct Fees {
        uint256 buybackFee;
    }

    // Transaction fee values
    // Add and remove fee value types here as needed
    struct FeeValues {
        uint256 transferAmount;
        uint256 buyback;
    }

    // Token details
    mapping (address => uint256) _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
   
    // denylist for WALLETS	
    mapping (address => bool) public isDenylisted;
    mapping (address => bool) public isAddressAllowlistedOut;
    mapping (address => bool) public allowedTransfer;
    bool public transferRestricted;

    // contract whitelist
    mapping (address => bool) allowedContracts; 	
     
    // Set total supply here
    uint256 private _tTotal;

    // Tracker for total burned amount
    uint256 private _bTotal;

    // auto set buyback to false. additional buyback params. blockPeriod acts as a time delay in the shouldAutoBuyback(). Last uint represents last block for buyback occurance.
    struct Settings {
        bool autoBuybackEnabled;
        uint256 autoBuybackCap;
        uint256 autoBuybackAccumulator;
        uint256 autoBuybackAmount;
        uint256 autoBuybackBlockPeriod;
        uint256 autoBuybackBlockLast;
        uint256 minimumBuyBackThreshold;
    }

    // Users states
    mapping (address => bool) private _isExcludedFromFee;

    // Daily Transfer Limit
    bool public transferLimitEnabled = true;
    uint256 public transferLimit = 100 ether;
    struct DailyTransfer {
        uint256 startTime;
        uint256 endTime;
        uint256 periodTransfers;
    }
    mapping (address => DailyTransfer) public DailyTransfers;

    // Outside Swap Pairs
    mapping (address => bool) private _includeSwapFee;


    // Pair Details
    mapping (uint256 => address) private pairs;
    mapping (uint256 => address) private tokens;
    uint256 private pairsLength;
    mapping (address => bool) public _isPairAddress;


    // Set the name, symbol, and decimals here
    string constant _name = "TOPIA";
    string constant _symbol = "TOPIA";
    uint8 constant _decimals = 18;

    Fees private _defaultFees;
    Fees private _previousFees;
    Fees private _emptyFees;
    Fees public _buyFees;
    Fees public _sellFees;
    Fees private _outsideBuyFees;
    Fees private _outsideSellFees;

    Settings public _buyback;

    IPYESwapRouter public pyeSwapRouter;
    address public pyeSwapPair;
    address public WETH;
    address public constant _burnAddress = 0x000000000000000000000000000000000000dEaD;

    bool public swapEnabled = true;
    bool inSwap;

    modifier swapping() { inSwap = true; _; inSwap = false; }
    modifier onlyExchange() {
        bool isPair = false;
        for(uint i = 0; i < pairsLength; i++) {
            if(pairs[i] == msg.sender) isPair = true;
        }
        require(
            msg.sender == address(pyeSwapRouter)
            || isPair
            , "PYE: NOT_ALLOWED"
        );
        _;
    }

    // @dev: disallows contracts from entering
    modifier notContract() {
        require(!_isContract(msg.sender), "Contract not allowed");
        require(msg.sender == tx.origin, "Proxy contract not allowed");
        _;
    }

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    // Edit the constructor in order to declare default fees on deployment
    constructor (address _router, uint256 _buybackFeeBuy, uint256 _buybackFeeSell) ERC20("","") {
        _setupRole(MINTER_ROLE, msg.sender);
        _setupRole(BURNER_ROLE, msg.sender);
        _setupRole(FEE_SETTER_ROLE, msg.sender);
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);

        pyeSwapRouter = IPYESwapRouter(_router);
        WETH = pyeSwapRouter.WETH();
        pyeSwapPair = IPYESwapFactory(pyeSwapRouter.factory())
        .createPair(address(this), WETH, true, address(this));

        tokens[pairsLength] = WETH;
        pairs[pairsLength] = pyeSwapPair;
        pairsLength += 1;
        _isPairAddress[pyeSwapPair] = true;

        _isExcludedFromFee[_msgSender()] = true;
        _isExcludedFromFee[pyeSwapPair] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[_burnAddress] = true;
        allowedTransfer[_msgSender()] = true;
        allowedTransfer[address(this)] = true;
        allowedTransfer[_burnAddress] = true;   
        isAddressAllowlistedOut[msg.sender] = true; 
        isAddressAllowlistedOut[address(this)] = true;   

        // This should match the struct Fee
        _defaultFees = Fees(
            
            _buybackFeeBuy
        );

        _buyFees = Fees(
            
            _buybackFeeBuy
        );

        _sellFees = Fees(
            _buybackFeeSell
        );

        _outsideBuyFees = Fees(
            _buybackFeeBuy
            
        );

        _outsideSellFees = Fees(
            _buybackFeeSell
        );

        transferRestricted = true;
    }

    // @dev: returns the size of the code of an address. If >0, address is a contract. 
    function _isContract(address _addr) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(_addr)
        }
        return size > 0;
    }

    function name() public pure override returns (string memory) {
        return _name;
    }

    function symbol() public pure override returns (string memory) {
        return _symbol;
    }

    function decimals() public pure override returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function totalBurned() public view returns (uint256) {
        return _balances[_burnAddress].add(_bTotal);
    }

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

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        require(msg.sender == tx.origin || allowedContracts[msg.sender], "Proxy contract not allowed");
        if(transferRestricted) { 
            require(allowedTransfer[msg.sender] || allowedTransfer[recipient], "Transfer not allowed"); 
        }
        if (_isContract(msg.sender)) {
            require(allowedContracts[msg.sender], "This contract is not approved to interact with TOPIA");
        }
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        require(msg.sender == tx.origin || allowedContracts[msg.sender], "Proxy contract not allowed");
        if(transferRestricted) { 
            require(allowedTransfer[sender] || allowedTransfer[recipient], "Transfer not allowed"); 
        }
        if (_isContract(msg.sender)) {
            require(allowedContracts[msg.sender], "This contract is not approved to interact with TOPIA");
        }
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "BEP20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual override returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual override returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "BEP20: decreased allowance below zero"));
        return true;
    }

    function excludeFromFee(address account) public {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) public {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        _isExcludedFromFee[account] = false;
    }

    function addOutsideSwapPair(address account) public {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        _includeSwapFee[account] = true;
    }

    function removeOutsideSwapPair(address account) public {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        _includeSwapFee[account] = false;
    }

    // Functions to update fees and addresses 

    function setBuyFees(uint256 _developmentFee, uint256 _buybackFee) external {
        require(hasRole(FEE_SETTER_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        require(_developmentFee.add(_buybackFee) <= 2500, "Fees exceed max limit");
       
        _defaultFees.buybackFee = _buybackFee;
        _buyFees.buybackFee = _buybackFee;
    }

    function setSellFees(uint256 _developmentFee, uint256 _buybackFee) external {
        require(hasRole(FEE_SETTER_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        require(_developmentFee.add(_buybackFee) <= 2500, "Fees exceed max limit");
        
        _sellFees.buybackFee = _buybackFee;
    }

    function updateRouterAndPair(address _router, address _pair) public {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        _isExcludedFromFee[pyeSwapPair] = false;
        pyeSwapRouter = IPYESwapRouter(_router);
        pyeSwapPair = _pair;
        WETH = pyeSwapRouter.WETH();

        _isPairAddress[pyeSwapPair] = true;
        _isExcludedFromFee[pyeSwapPair] = true;
        allowedContracts[pyeSwapPair] = true;
        allowedContracts[_router] = true;
        allowedTransfer[pyeSwapPair] = true;
        allowedTransfer[_router] = true;
        isAddressAllowlistedOut[pyeSwapPair] = true;
        isAddressAllowlistedOut[_router] = true;

        pairs[0] = pyeSwapPair;
        tokens[0] = WETH;
    }

    function enablePYESwap() external {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        allowedContracts[pyeSwapPair] = true;
        allowedContracts[address(pyeSwapRouter)] = true;
        allowedTransfer[pyeSwapPair] = true;
        allowedTransfer[address(pyeSwapRouter)] = true;
        isAddressAllowlistedOut[pyeSwapPair] = true;
        isAddressAllowlistedOut[address(pyeSwapRouter)] = true;

    }

    function setTransferLimit(uint256 _amount) external {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        transferLimit = _amount;
    }

    function setTransferRestricted(bool _restricted) external {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        transferRestricted = _restricted;
    }

    function addGameContract(address _gameAddress) external {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        grantRole(MINTER_ROLE, _gameAddress);
        grantRole(BURNER_ROLE, _gameAddress);
        allowedContracts[_gameAddress] = true;
        allowedTransfer[_gameAddress] = true;
    }

    //to receive BNB from pyeRouter when swapping
    receive() external payable {}

    function _getValues(uint256 tAmount) private view returns (FeeValues memory) {
        FeeValues memory values = FeeValues(
            tAmount,
            calculateFee(tAmount, _defaultFees.buybackFee)
        );

        values.transferAmount = tAmount.sub(values.buyback);
        return values;
    }

    function calculateFee(uint256 _amount, uint256 _fee) private pure returns (uint256) {
        if(_fee == 0) return 0;
        return _amount.mul(_fee).div(
            10**4
        );
    }

    function removeAllFee() private {
        _previousFees = _defaultFees;
        _defaultFees = _emptyFees;
    }

    function setSellFee() private {
        _defaultFees = _sellFees;
    }

    function setOutsideBuyFee() private {
        _previousFees = _defaultFees;
        _defaultFees = _outsideBuyFees;
    }

    function setOutsideSellFee() private {
        _previousFees = _defaultFees;
        _defaultFees = _outsideSellFees;
    }

    function restoreAllFee() private {
        _defaultFees = _previousFees;
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal override {
        require(owner != address(0), "BEP20: approve from the zero address");
        require(spender != address(0), "BEP20: approve to the zero address");

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


    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "BEP20: transfer from the zero address");
        require(to != address(0), "BEP20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(!isDenylisted[to]);
       
        if(shouldAutoBuyback(amount)){ triggerAutoBuyback(); }

        //indicates if fee should be deducted from transfer of tokens
        uint8 takeFee = 0;
        if(_isPairAddress[to] && from != address(pyeSwapRouter) && !isExcludedFromFee(from)) {
            require(dailyAllowed(from, amount));
            takeFee = 1;
        } else if(_includeSwapFee[from]) {
            takeFee = 2;
        } else if(_includeSwapFee[to]) {
            require(dailyAllowed(from, amount));
            takeFee = 3;
        }

        //transfer amount, it will take tax
        _tokenTransfer(from, to, amount, takeFee);
    }

    function dailyAllowed(address from, uint256 amount) internal returns (bool) {
        if(!transferLimitEnabled || isAddressAllowlistedOut[from]) {
            return true;
        } else if(DailyTransfers[from].endTime < block.timestamp && amount <= transferLimit) {
            DailyTransfers[from].startTime = block.timestamp;
            DailyTransfers[from].endTime = block.timestamp + 1 days;
            DailyTransfers[from].periodTransfers = amount;
            return true;
        } else if(DailyTransfers[from].periodTransfers.add(amount) <= transferLimit) {
            DailyTransfers[from].periodTransfers = DailyTransfers[from].periodTransfers.add(amount);
            return true;
        } else {
            return false;
        }
    }

    function getCirculatingSupply() public view returns (uint256) {
        return _tTotal.sub(balanceOf(_burnAddress)).sub(balanceOf(address(0)));
    }

    function getTotalFee(address account) public view returns (uint256) {
        if(_isExcludedFromFee[account]) {
            return 0;
        } else {
        return _defaultFees.buybackFee;
        }
    }

    function getFee() public view returns (uint256) {
        return _defaultFees.buybackFee;
    }

    //this method is responsible for taking all fee, if takeFee is true
    function _tokenTransfer(address sender, address recipient, uint256 amount, uint8 takeFee) private {
        if(takeFee == 0 || takeFee == 1) {
            removeAllFee();
            _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
            _balances[recipient] = _balances[recipient].add(amount);

            emit Transfer(sender, recipient, amount);

            if(takeFee == 0) {
                restoreAllFee();
            } else if(takeFee == 1) {
                setSellFee();
            }
        } else {
            if(takeFee == 2) {
                setOutsideBuyFee();
            } else if(takeFee == 3) {
                setOutsideSellFee();
            }

            FeeValues memory _values = _getValues(amount);
            _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
            _balances[recipient] = _balances[recipient].add(_values.transferAmount);
            _takeFees(_values);

            emit Transfer(sender, recipient, _values.transferAmount);
            emit Transfer(sender, _burnAddress, _values.buyback);

            restoreAllFee();
        }
    }

    function _takeFees(FeeValues memory values) private {
        _takeFee(values.buyback, _burnAddress);
    }

    function _takeFee(uint256 tAmount, address recipient) private {
        if(recipient == address(0)) return;
        if(tAmount == 0) return;

        _balances[address(this)] = _balances[address(this)].add(tAmount);
    }

    // This function transfers the fees to the correct addresses. 
    function handleFee(uint256 amount, address token) public onlyExchange {
        if(amount == 0) {
            restoreAllFee(); 
        } else {
            uint256 tokenIndex = _getTokenIndex(token);
            if(tokenIndex < pairsLength) {
                uint256 allowanceT = IERC20(token).allowance(msg.sender, address(this));
                if(allowanceT >= amount) {
                    IERC20(token).transferFrom(msg.sender, address(this), amount);
                    if(token != WETH) {
                        swapToWETH(amount, token);
                    }
                    restoreAllFee();
                }
            }
        }
    }

    function swapToWETH(uint256 amount, address token) internal {
        address[] memory path = new address[](2);
        path[0] = token;
        path[1] = WETH;

        IERC20(token).approve(address(pyeSwapRouter), amount);
        pyeSwapRouter.swapExactTokensForTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    // runs check to see if autobuyback should trigger
    function shouldAutoBuyback(uint256 amount) internal view returns (bool) {
        return msg.sender != pyeSwapPair
        && !inSwap
        && _buyback.autoBuybackEnabled
        && _buyback.autoBuybackBlockLast + _buyback.autoBuybackBlockPeriod <= block.number // After N blocks from last buyback
        && IERC20(address(WETH)).balanceOf(address(this)) >= _buyback.autoBuybackAmount
        && amount >= _buyback.minimumBuyBackThreshold;
    }

    // triggers auto buyback
    function triggerAutoBuyback() internal {
        buyTokens(_buyback.autoBuybackAmount, _burnAddress);
        _buyback.autoBuybackBlockLast = block.number;
        _buyback.autoBuybackAccumulator = _buyback.autoBuybackAccumulator.add(_buyback.autoBuybackAmount);
        if(_buyback.autoBuybackAccumulator > _buyback.autoBuybackCap){ _buyback.autoBuybackEnabled = false; }
    }

    // logic to purchase tokens
    function buyTokens(uint256 amount, address to) internal swapping {
        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = address(this);

        IERC20(WETH).approve(address(pyeSwapRouter), amount);
        pyeSwapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            to,
            block.timestamp
        );
    }

    // manually adjust the buyback settings to suit your needs
    function setAutoBuybackSettings(bool _enabled, uint256 _cap, uint256 _amount, uint256 _period, uint256 _minimumThreshold) external {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        _buyback.autoBuybackEnabled = _enabled;
        _buyback.autoBuybackCap = _cap;
        _buyback.autoBuybackAccumulator = 0;
        _buyback.autoBuybackAmount = _amount;
        _buyback.autoBuybackBlockPeriod = _period;
        _buyback.autoBuybackBlockLast = block.number;
        _buyback.minimumBuyBackThreshold = _minimumThreshold;
    }

    function _getTokenIndex(address _token) internal view returns (uint256) {
        uint256 index = pairsLength + 1;
        for(uint256 i = 0; i < pairsLength; i++) {
            if(tokens[i] == _token) index = i;
        }

        return index;
    }

    function addPair(address _pair, address _token) public {
        address factory = pyeSwapRouter.factory();
        require(
            msg.sender == factory
            || msg.sender == address(pyeSwapRouter)
            || msg.sender == address(this)
        , "PYE: NOT_ALLOWED"
        );

        if(!_checkPairRegistered(_pair)) {
            _isExcludedFromFee[_pair] = true;
            _isPairAddress[_pair] = true;
            allowedContracts[_pair] = true;
            allowedTransfer[_pair] = true;

            pairs[pairsLength] = _pair;
            tokens[pairsLength] = _token;

            pairsLength += 1;
        }
    }

    function _checkPairRegistered(address _pair) internal view returns (bool) {
        bool isPair = false;
        for(uint i = 0; i < pairsLength; i++) {
            if(pairs[i] == _pair) isPair = true;
        }

        return isPair;
    }

    // Rescue bnb that is sent here by mistake
    function rescueBNB(uint256 amount, address to) external {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        payable(to).transfer(amount);
      }

    // Rescue tokens that are sent here by mistake
    function rescueToken(IERC20 token, uint256 amount, address to) external {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        if( token.balanceOf(address(this)) < amount ) {
            amount = token.balanceOf(address(this));
        }
        token.transfer(to, 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 override virtual {	
        uint256 currentAllowance = allowance(owner, spender);	
        if (currentAllowance != type(uint256).max) {	
            require(currentAllowance >= amount, "ERC20: insufficient allowance");	
            unchecked {	
                _approve(owner, spender, currentAllowance - amount);	
            }	
        }	
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) override internal {
        require(account != address(0), 'BEP20: mint to the zero address');

        _tTotal = _tTotal.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) override internal {	
        require(account != address(0), 'BEP20: burn from the zero address');	
        _balances[account] = _balances[account].sub(amount, 'BEP20: burn amount exceeds balance');	
        _tTotal = _tTotal.sub(amount);
        _bTotal = _bTotal.add(amount);	
        emit Transfer(account, address(0), amount);	
    }

    
    function burnFrom(address _from, uint256 _amount) public {	
        require(hasRole(BURNER_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");	
        _spendAllowance(_from, msg.sender, _amount);
        _burn(_from, _amount);	
        
    }	


    /// @notice Creates `_amount` token to `_to`. Must only be called by the owner (MasterChef).
    function mint(address _to, uint256 _amount) public {
        require(hasRole(MINTER_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        _mint(_to, _amount);
        
    }

    function burn(uint256 _amount) public {
        require(hasRole(BURNER_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        _burn(msg.sender, _amount);

    }

	
    //--------------------------------------BEGIN DENYLIST FUNCTIONS---------|	

    // enter an address to denylist it. This blocks transfers TO that address. Denylisted members can still sell.	
    function denylistAddress(address addressToBlacklist) external {	
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");	
        require(!isDenylisted[addressToBlacklist] , "Address is already denylisted!");	
        isDenylisted[addressToBlacklist] = true;	
    }

    // enter a currently denylisted address to un-denylist it.	
    function removeFromDenylist(address addressToRemove) external {	
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");	
        require(isDenylisted[addressToRemove] , "Address has not been denylisted! Enter an address that is on the denylist.");	
        isDenylisted[addressToRemove] = false;	
    }

    /// Functions to allowlist selected wallets
    function setAllowlistWalletOut(address wallet, bool flag) external {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        isAddressAllowlistedOut[wallet] = flag;
    }

    function setAllowedContract(address _contract, bool flag) external {
        require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "TOPIA: NOT_ALLOWED");
        require(_isContract(_contract), "The address you entered is returning a extcodesize of 0 - please ensure this is a contract and not a wallet!");
        allowedContracts[_contract] = flag;
    }

}

File 2 of 14 : IPYESwapRouter.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2;

import './IPYESwapRouter01.sol';

interface IPYESwapRouter is IPYESwapRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function pairFeeAddress(address pair) external view returns (address);
    function adminFee() external view returns (uint256);
    function feeAddressGet() external view returns (address);
}

File 3 of 14 : IPYESwapFactory.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.5.0;

interface IPYESwapFactory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function pairExist(address pair) external view returns (bool);

    function createPair(address tokenA, address tokenB, bool supportsTokenFee, address feeTaker) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
    function routerInitialize(address) external;
    function routerAddress() external view returns (address);
}

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

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * 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, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 5 of 14 : AccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;

import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

File 6 of 14 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 7 of 14 : IPYESwapRouter01.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IPYESwapRouter01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

File 8 of 14 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

File 9 of 14 : 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 10 of 14 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.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 11 of 14 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 12 of 14 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 13 of 14 : IAccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

File 14 of 14 : 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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"uint256","name":"_buybackFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_buybackFeeSell","type":"uint256"}],"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":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":"BURNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"DailyTransfers","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"uint256","name":"periodTransfers","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEE_SETTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyFees","outputs":[{"internalType":"uint256","name":"buybackFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyback","outputs":[{"internalType":"bool","name":"autoBuybackEnabled","type":"bool"},{"internalType":"uint256","name":"autoBuybackCap","type":"uint256"},{"internalType":"uint256","name":"autoBuybackAccumulator","type":"uint256"},{"internalType":"uint256","name":"autoBuybackAmount","type":"uint256"},{"internalType":"uint256","name":"autoBuybackBlockPeriod","type":"uint256"},{"internalType":"uint256","name":"autoBuybackBlockLast","type":"uint256"},{"internalType":"uint256","name":"minimumBuyBackThreshold","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isPairAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellFees","outputs":[{"internalType":"uint256","name":"buybackFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gameAddress","type":"address"}],"name":"addGameContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addOutsideSwapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pair","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"addPair","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":"","type":"address"}],"name":"allowedTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":[{"internalType":"address","name":"addressToBlacklist","type":"address"}],"name":"denylistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enablePYESwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"token","type":"address"}],"name":"handleFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","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":"isAddressAllowlistedOut","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isDenylisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pyeSwapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pyeSwapRouter","outputs":[{"internalType":"contract IPYESwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addressToRemove","type":"address"}],"name":"removeFromDenylist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeOutsideSwapPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"rescueBNB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"rescueToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"setAllowedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"flag","type":"bool"}],"name":"setAllowlistWalletOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"},{"internalType":"uint256","name":"_minimumThreshold","type":"uint256"}],"name":"setAutoBuybackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_developmentFee","type":"uint256"},{"internalType":"uint256","name":"_buybackFee","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_developmentFee","type":"uint256"},{"internalType":"uint256","name":"_buybackFee","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setTransferLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_restricted","type":"bool"}],"name":"setTransferRestricted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferLimitEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferRestricted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_pair","type":"address"}],"name":"updateRouterAndPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526010805460ff1916600117905568056bc75e2d631000006011556028805460ff60a01b1916600160a01b1790553480156200003e57600080fd5b5060405162005c9b38038062005c9b8339810160408190526200006191620005cd565b6040805160208082018352600080835283519182019093529182529060046200008b8382620006aa565b5060056200009a8282620006aa565b505050620000cf7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620004ed60201b60201c565b620000fb7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84833620004ed565b620001277fe6ad9a47fbda1dc18de1eb5eeb7d935e5e81b4748f3cfc61e233e64f8818206033620004ed565b62000134600033620004ed565b602680546001600160a01b0319166001600160a01b038516908117909155604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa1580156200018e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b4919062000776565b602880546001600160a01b0319166001600160a01b039283161790556026546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa15801562000213573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000239919062000776565b6028546040516322c4f16760e11b815230600482018190526001600160a01b039283166024830152600160448301526064820152911690634589e2ce906084016020604051808303816000875af115801562000299573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002bf919062000776565b602780546001600160a01b039283166001600160a01b03199182161782556028546016805460009081526015602090815260408083208054871695891695909517909455945482548252601490955291822080549093169390941692909217905581546001929190620003349084906200079b565b90915550506027546001600160a01b03166000908152601760205260408120805460ff1916600190811790915590600f906200036d3390565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff199687161790556027549091168152600f909252808220805484166001908117909155308352908220805484168217905561dead82527f99629f56119585bf27511b6b7d295dffb54757453fcc3dabcf51d92028301f1080549093168117909255600a90620004003390565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530808252600a84528282208054861660019081179091557f20677881080440a9b3c87e826370bb5d9c2f74efd4dede686d52d77a6a09f8bb805487168217905533835260098552838320805487168217905590825290829020805485168217905581518084018352869052601886905581518084018352869052601b86905581518084018352859052601c85905581518084018352869052601d9590955580519182019052829052601e91909155600b8054909116909117905550620007bd565b620004f98282620004fd565b5050565b62000509828262000585565b620004f9576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620005413390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff165b92915050565b80516001600160a01b0381168114620005c857600080fd5b919050565b600080600060608486031215620005e357600080fd5b620005ee84620005b0565b925060208401519150604084015190509250925092565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200063057607f821691505b6020821081036200065157634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620006a557600081815260208120601f850160051c81016020861015620006805750805b601f850160051c820191505b81811015620006a1578281556001016200068c565b5050505b505050565b81516001600160401b03811115620006c657620006c662000605565b620006de81620006d784546200061b565b8462000657565b602080601f831160018114620007165760008415620006fd5750858301515b600019600386901b1c1916600185901b178555620006a1565b600085815260208120601f198616915b82811015620007475788860151825594840194600190910190840162000726565b5085821015620007665787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000602082840312156200078957600080fd5b6200079482620005b0565b9392505050565b80820180821115620005aa57634e487b7160e01b600052601160045260246000fd5b6154ce80620007cd6000396000f3fe6080604052600436106103fd5760003560e01c806379cc67901161020d578063c3e0dbe911610128578063de7cf799116100bb578063e93476831161008a578063f8a67a621161006f578063f8a67a6214610dc3578063f943251714610de3578063fa9b768014610df957600080fd5b8063e934768314610d6f578063ea2f0b3714610da357600080fd5b8063de7cf79914610cf1578063e284db3e14610d08578063e4d1a87414610d28578063e877a52614610d3f57600080fd5b8063d5391393116100f7578063d539139314610c35578063d547741f14610c69578063d89135cd14610c89578063dd62ed3e14610c9e57600080fd5b8063c3e0dbe914610bb3578063c80bbbeb14610bd3578063ced72f8714610c00578063d3a866c714610c1557600080fd5b8063a457c2d7116101a0578063b2d8f2081161016f578063b2d8f20814610b06578063b6f3e08714610b26578063bd2f40c014610b46578063bd3900c014610b9d57600080fd5b8063a457c2d714610a79578063a5ee4e7114610a99578063a9059cbb14610ab9578063ad5c464814610ad957600080fd5b806391d14854116101dc57806391d14854146109f357806395d89b41146104b25780639fd8234e14610a44578063a217fddf14610a6457600080fd5b806379cc6790146109735780637a17feff1461099357806381cd08ee146109b35780638c232838146109d357600080fd5b8063313ce56711610318578063437823ec116102ab57806362695eae1161027a57806370a082311161025f57806370a08231146108f657806370bb0a1614610939578063717944e01461095957600080fd5b806362695eae146108945780636ddd1713146108c457600080fd5b8063437823ec146107f457806348709a93146108145780635342acb41461082e57806355de1faf1461087457600080fd5b8063403316d5116102e7578063403316d51461077457806340b28c2f1461079457806340c10f19146107b457806342966c68146107d457600080fd5b8063313ce567146106f857806336568abe1461071457806339509351146107345780633d8a62d31461075457600080fd5b806323b872dd116103905780632bfad3bd1161035f5780632bfad3bd1461062a5780632c77735c1461063f5780632f2ff15d146106a857806330367554146106c857600080fd5b806323b872dd14610591578063248a9ca3146105b1578063282c51f3146105e15780632b112e491461061557600080fd5b8063095ea7b3116103cc578063095ea7b3146104fe578063174ca3ec1461051e57806318160ddd1461053e57806320606b701461055d57600080fd5b806301ffc9a71461040957806302c52db01461043e57806302e8e85f1461046057806306fdde03146104b257600080fd5b3661040457005b600080fd5b34801561041557600080fd5b50610429610424366004614d7b565b610e29565b60405190151581526020015b60405180910390f35b34801561044a57600080fd5b5061045e610459366004614ddf565b610ec2565b005b34801561046c57600080fd5b5060265461048d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610435565b3480156104be57600080fd5b50604080518082018252600581527f544f504941000000000000000000000000000000000000000000000000000000602082015290516104359190614e20565b34801561050a57600080fd5b50610429610519366004614e71565b611086565b34801561052a57600080fd5b5061045e610539366004614eab565b61109c565b34801561054a57600080fd5b50600d545b604051908152602001610435565b34801561056957600080fd5b5061054f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561059d57600080fd5b506104296105ac366004614eef565b61117e565b3480156105bd57600080fd5b5061054f6105cc366004614f30565b60009081526020819052604090206001015490565b3480156105ed57600080fd5b5061054f7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b34801561062157600080fd5b5061054f6113e7565b34801561063657600080fd5b5061045e611458565b34801561064b57600080fd5b50601f546020546021546022546023546024546025546106719660ff1695949392919087565b6040805197151588526020880196909652948601939093526060850191909152608084015260a083015260c082015260e001610435565b3480156106b457600080fd5b5061045e6106c3366004614f49565b6115af565b3480156106d457600080fd5b506104296106e3366004614ddf565b60176020526000908152604090205460ff1681565b34801561070457600080fd5b5060405160128152602001610435565b34801561072057600080fd5b5061045e61072f366004614f49565b6115d9565b34801561074057600080fd5b5061042961074f366004614e71565b61168c565b34801561076057600080fd5b5061045e61076f366004614ddf565b6116cf565b34801561078057600080fd5b5061045e61078f366004614f79565b6117b6565b3480156107a057600080fd5b5061045e6107af366004614fa7565b6118a4565b3480156107c057600080fd5b5061045e6107cf366004614e71565b611bb7565b3480156107e057600080fd5b5061045e6107ef366004614f30565b611c59565b34801561080057600080fd5b5061045e61080f366004614ddf565b611cfe565b34801561082057600080fd5b50600b546104299060ff1681565b34801561083a57600080fd5b50610429610849366004614ddf565b73ffffffffffffffffffffffffffffffffffffffff166000908152600f602052604090205460ff1690565b34801561088057600080fd5b5061045e61088f366004614f79565b611de5565b3480156108a057600080fd5b506104296108af366004614ddf565b600a6020526000908152604090205460ff1681565b3480156108d057600080fd5b506028546104299074010000000000000000000000000000000000000000900460ff1681565b34801561090257600080fd5b5061054f610911366004614ddf565b73ffffffffffffffffffffffffffffffffffffffff1660009081526006602052604090205490565b34801561094557600080fd5b5061045e610954366004614fd5565b611fad565b34801561096557600080fd5b506010546104299060ff1681565b34801561097f57600080fd5b5061045e61098e366004614e71565b612076565b34801561099f57600080fd5b5061045e6109ae366004614f30565b612123565b3480156109bf57600080fd5b5061045e6109ce366004614ddf565b6121c0565b3480156109df57600080fd5b5061054f6109ee366004614ddf565b612313565b3480156109ff57600080fd5b50610429610a0e366004614f49565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610a5057600080fd5b5061045e610a5f366004614ff2565b612351565b348015610a7057600080fd5b5061054f600081565b348015610a8557600080fd5b50610429610a94366004614e71565b612464565b348015610aa557600080fd5b5061045e610ab4366004614ddf565b6124c0565b348015610ac557600080fd5b50610429610ad4366004614e71565b612637565b348015610ae557600080fd5b5060285461048d9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610b1257600080fd5b5061045e610b21366004614ff2565b612821565b348015610b3257600080fd5b5061045e610b41366004614fa7565b612939565b348015610b5257600080fd5b50610b82610b61366004614ddf565b60126020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610435565b348015610ba957600080fd5b5061048d61dead81565b348015610bbf57600080fd5b5061045e610bce366004614f49565b612b75565b348015610bdf57600080fd5b5060275461048d9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610c0c57600080fd5b5060185461054f565b348015610c2157600080fd5b5061045e610c30366004614f49565b612c50565b348015610c4157600080fd5b5061054f7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b348015610c7557600080fd5b5061045e610c84366004614f49565b612ed3565b348015610c9557600080fd5b5061054f612ef8565b348015610caa57600080fd5b5061054f610cb9366004614fa7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260076020908152604080832093909416825291909152205490565b348015610cfd57600080fd5b50601c5461054f9081565b348015610d1457600080fd5b5061045e610d23366004614ddf565b612f36565b348015610d3457600080fd5b50601b5461054f9081565b348015610d4b57600080fd5b50610429610d5a366004614ddf565b60086020526000908152604090205460ff1681565b348015610d7b57600080fd5b5061054f7fe6ad9a47fbda1dc18de1eb5eeb7d935e5e81b4748f3cfc61e233e64f8818206081565b348015610daf57600080fd5b5061045e610dbe366004614ddf565b61301a565b348015610dcf57600080fd5b5061045e610dde366004615014565b6130fe565b348015610def57600080fd5b5061054f60115481565b348015610e0557600080fd5b50610429610e14366004614ddf565b60096020526000908152604090205460ff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610ebc57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f574544000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff1661103a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4164647265737320686173206e6f74206265656e2064656e796c69737465642160448201527f20456e74657220616e20616464726573732074686174206973206f6e2074686560648201527f2064656e796c6973742e00000000000000000000000000000000000000000000608482015260a401610f56565b73ffffffffffffffffffffffffffffffffffffffff16600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6000611093338484613356565b50600192915050565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b601f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001695151595909517909455602092909255600060215560225560235543602455602555565b60003332148061119d5750336000908152600c602052604090205460ff165b611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f7765640000000000006044820152606401610f56565b600b5460ff16156112cd5773ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604090205460ff1680611267575073ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090205460ff165b6112cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5472616e73666572206e6f7420616c6c6f7765640000000000000000000000006044820152606401610f56565b333b1561137357336000908152600c602052604090205460ff16611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5468697320636f6e7472616374206973206e6f7420617070726f76656420746f60448201527f20696e746572616374207769746820544f5049410000000000000000000000006064820152608401610f56565b61137e848484613509565b6113dd84336113d88560405180606001604052806028815260200161542a6028913973ffffffffffffffffffffffffffffffffffffffff8a1660009081526007602090815260408083203384529091529020549190613851565b613356565b5060019392505050565b60066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85461dead60009081527f1aecba4ebe7a4e0673e4891b2b092b2228e4322380b579fb494fad3da8586e2254600d54919261145392909161144d9190613897565b90613897565b905090565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff166114f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b6027805473ffffffffffffffffffffffffffffffffffffffff9081166000908152600c60209081526040808320805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00918216811790925560268054871686528386208054831684179055875487168652600a855283862080548316841790558054871686528386208054831684179055965486168552600990935281842080548416821790559454909316825291902080549091169091179055565b6000828152602081905260409020600101546115ca816138aa565b6115d483836138b4565b505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461167e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610f56565b61168882826139a4565b5050565b33600081815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916110939185906113d89086613a5b565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b73ffffffffffffffffffffffffffffffffffffffff16600090815260136020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff1661184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff1661193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b6027805473ffffffffffffffffffffffffffffffffffffffff9081166000908152600f602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055602680548785167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117909255855494871694169390931790935580517fad5c46480000000000000000000000000000000000000000000000000000000081529051919263ad5c4648926004808401938290030181865afa158015611a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a409190615056565b6028805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216178255602780548416600090815260176020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009081166001908117909255855489168552600f84528285208054821683179055855489168552600c8452828520805482168317905599881680855282852080548c1683179055855489168552600a845282852080548c168317905580855282852080548c16831790558554891685526009845282852080548c1683179055845290832080549099161790975590549080527f4f26c3876aa9f4b92579780beea1161a61f87ebf1ec6ee865b299e447ecba99c80548316918516919091179055905460159094527fa31547ce6245cdb9ecea19cf8c7eb9f5974025bb4075011409251ae855b30aed8054909116939091169290921790915550565b3360009081527f0781d7cac9c378efa22a7481e4d4d29704a680ddf504b3bc50b517700ee11e6c602052604090205460ff16611c4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b6116888282613a67565b3360009081527f6bc61e8d8a7feeba9a3dfbe950298fbca23cf0136992f9ef92f1b5529ac870ae602052604090205460ff16611cf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b611cfb3382613b8e565b50565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16611d96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b73ffffffffffffffffffffffffffffffffffffffff166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16611e7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b813b611f57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152606c60248201527f546865206164647265737320796f7520656e746572656420697320726574757260448201527f6e696e67206120657874636f646573697a65206f662030202d20706c6561736560648201527f20656e737572652074686973206973206120636f6e747261637420616e64206e60848201527f6f7420612077616c6c657421000000000000000000000000000000000000000060a482015260c401610f56565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b3360009081527f6bc61e8d8a7feeba9a3dfbe950298fbca23cf0136992f9ef92f1b5529ac870ae602052604090205460ff1661210e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b612119823383613d0c565b6116888282613b8e565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff166121bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b601155565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16612258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b6122827f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6826115af565b6122ac7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848826115af565b73ffffffffffffffffffffffffffffffffffffffff166000908152600c60209081526040808320805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009182168117909255600a909352922080549091169091179055565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600f602052604081205460ff161561234957506000919050565b505060185490565b3360009081527f14764fde9c05acf7fd0fb570d7a8bd897798cb3f3d82998258b517116344ffbd602052604090205460ff166123e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b6109c46123f68383613a5b565b111561245e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4665657320657863656564206d6178206c696d697400000000000000000000006044820152606401610f56565b601c5550565b600061109333846113d8856040518060600160405280602581526020016154526025913933600090815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d1684529091529020549190613851565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff16156125e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4164647265737320697320616c72656164792064656e796c69737465642100006044820152606401610f56565b73ffffffffffffffffffffffffffffffffffffffff16600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000333214806126565750336000908152600c602052604090205460ff165b6126bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f7765640000000000006044820152606401610f56565b600b5460ff161561277057336000908152600a602052604090205460ff168061270a575073ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090205460ff165b612770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5472616e73666572206e6f7420616c6c6f7765640000000000000000000000006044820152606401610f56565b333b1561281657336000908152600c602052604090205460ff16612816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5468697320636f6e7472616374206973206e6f7420617070726f76656420746f60448201527f20696e746572616374207769746820544f5049410000000000000000000000006064820152608401610f56565b611093338484613509565b3360009081527f14764fde9c05acf7fd0fb570d7a8bd897798cb3f3d82998258b517116344ffbd602052604090205460ff166128b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b6109c46128c68383613a5b565b111561292e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4665657320657863656564206d6178206c696d697400000000000000000000006044820152606401610f56565b6018819055601b5550565b602654604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163c45a01559160048083019260209291908290030181865afa1580156129a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cd9190615056565b90503373ffffffffffffffffffffffffffffffffffffffff82161480612a0a575060265473ffffffffffffffffffffffffffffffffffffffff1633145b80612a1457503330145b612a7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5059453a204e4f545f414c4c4f574544000000000000000000000000000000006044820152606401610f56565b612a8383613ddd565b6115d45773ffffffffffffffffffffffffffffffffffffffff8381166000818152600f60209081526040808320805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009182168117909255601784528285208054821683179055600c84528285208054821683179055600a84528285208054909116821790556016805485526014845282852080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690971790558054855260159093529083208054909416948716949094179092558154612b6b9084906150a2565b9091555050505050565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16612c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b60405173ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f193505050501580156115d4573d6000803e3d6000fd5b6000805b601654811015612ca2576000818152601460205260409020543373ffffffffffffffffffffffffffffffffffffffff90911603612c9057600191505b80612c9a816150b5565b915050612c54565b5060265473ffffffffffffffffffffffffffffffffffffffff16331480612cc65750805b612d2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5059453a204e4f545f414c4c4f574544000000000000000000000000000000006044820152606401610f56565b82600003612d3f576115d4601954601855565b6000612d4a83613e38565b9050601654811015612ecd576040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015260009073ffffffffffffffffffffffffffffffffffffffff85169063dd62ed3e90604401602060405180830381865afa158015612dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ded91906150ed565b9050848110612ecb576040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810186905273ffffffffffffffffffffffffffffffffffffffff8516906323b872dd906064016020604051808303816000875af1158015612e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e939190615106565b5060285473ffffffffffffffffffffffffffffffffffffffff858116911614612ec057612ec08585613e9d565b612ecb601954601855565b505b50505050565b600082815260208190526040902060010154612eee816138aa565b6115d483836139a4565b600e5461dead600090815260066020527f1aecba4ebe7a4e0673e4891b2b092b2228e4322380b579fb494fad3da8586e225490916114539190613a5b565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16612fce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b73ffffffffffffffffffffffffffffffffffffffff16600090815260136020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff166130b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b73ffffffffffffffffffffffffffffffffffffffff166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16613196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015613202573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061322691906150ed565b10156132bd576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015613296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ba91906150ed565b91505b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526024820184905284169063a9059cbb906044016020604051808303816000875af1158015613332573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecd9190615106565b73ffffffffffffffffffffffffffffffffffffffff83166133f8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610f56565b73ffffffffffffffffffffffffffffffffffffffff821661349b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610f56565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166135ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610f56565b73ffffffffffffffffffffffffffffffffffffffff821661364f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610f56565b600081116136df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610f56565b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205460ff161561371257600080fd5b61371b81614080565b156137285761372861419f565b73ffffffffffffffffffffffffffffffffffffffff821660009081526017602052604081205460ff168015613778575060265473ffffffffffffffffffffffffffffffffffffffff858116911614155b80156137aa575073ffffffffffffffffffffffffffffffffffffffff84166000908152600f602052604090205460ff16155b156137ca576137b984836141fa565b6137c257600080fd5b506001613845565b73ffffffffffffffffffffffffffffffffffffffff841660009081526013602052604090205460ff161561380057506002613845565b73ffffffffffffffffffffffffffffffffffffffff831660009081526013602052604090205460ff16156138455761383884836141fa565b61384157600080fd5b5060035b612ecd84848484614398565b6000818484111561388f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f569190614e20565b505050900390565b60006138a38284615123565b9392505050565b611cfb8133614724565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166116885760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556139463390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156116885760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006138a382846150a2565b73ffffffffffffffffffffffffffffffffffffffff8216613ae4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f42455032303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610f56565b600d54613af19082613a5b565b600d5573ffffffffffffffffffffffffffffffffffffffff8216600090815260066020526040902054613b249082613a5b565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600660205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613b829085815260200190565b60405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216613c31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f42455032303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610f56565b613c7b816040518060600160405280602281526020016154776022913973ffffffffffffffffffffffffffffffffffffffff85166000908152600660205260409020549190613851565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260066020526040902055600d54613cae9082613897565b600d55600e54613cbe9082613a5b565b600e5560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001613b82565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600760209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612ecd5781811015613dd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610f56565b612ecd8484848403613356565b600080805b601654811015613e315760008181526014602052604090205473ffffffffffffffffffffffffffffffffffffffff808616911603613e1f57600191505b80613e29816150b5565b915050613de2565b5092915050565b6000806016546001613e4a91906150a2565b905060005b601654811015613e315760008181526015602052604090205473ffffffffffffffffffffffffffffffffffffffff808616911603613e8b578091505b80613e95816150b5565b915050613e4f565b6040805160028082526060820183526000926020830190803683370190505090508181600081518110613ed257613ed2615165565b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152602854825191169082906001908110613f1057613f10615165565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526026546040517f095ea7b30000000000000000000000000000000000000000000000000000000081529082166004820152602481018590529083169063095ea7b3906044016020604051808303816000875af1158015613f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fbb9190615106565b506026546040517f38ed173900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906338ed17399061401b908690600090869030904290600401615194565b6000604051808303816000875af115801561403a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612ecd919081019061521f565b60275460009073ffffffffffffffffffffffffffffffffffffffff1633148015906140c757506028547501000000000000000000000000000000000000000000900460ff16155b80156140d55750601f5460ff165b80156140f0575060235460245443916140ed916150a2565b11155b801561418f57506022546028546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015614168573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061418c91906150ed565b10155b8015610ebc575050602554111590565b6022546141ae9061dead6147f4565b436024556022546021546141c191613a5b565b602181905560205410156141f857601f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b565b60105460009060ff161580614234575073ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205460ff165b1561424157506001610ebc565b73ffffffffffffffffffffffffffffffffffffffff83166000908152601260205260409020600101544211801561427a57506011548211155b156142f15773ffffffffffffffffffffffffffffffffffffffff8316600090815260126020526040902042908190556142b690620151806150a2565b73ffffffffffffffffffffffffffffffffffffffff841660009081526012602052604090206001808201929092556002018390559050610ebc565b60115473ffffffffffffffffffffffffffffffffffffffff84166000908152601260205260409020600201546143279084613a5b565b116143905773ffffffffffffffffffffffffffffffffffffffff831660009081526012602052604090206002015461435f9083613a5b565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260126020526040902060020155506001610ebc565b506000610ebc565b60ff811615806143ab57508060ff166001145b156144ff576143c160188054601955601a549055565b604080518082018252601481527f496e73756666696369656e742042616c616e636500000000000000000000000060208083019190915273ffffffffffffffffffffffffffffffffffffffff8716600090815260069091529190912054614429918490613851565b73ffffffffffffffffffffffffffffffffffffffff80861660009081526006602052604080822093909355908516815220546144659083613a5b565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526006602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906144c69086815260200190565b60405180910390a38060ff166000036144e9576144e4601954601855565b612ecd565b8060ff166001036144e4576144e4601c54601855565b8060ff166002036145205761451b60188054601955601d549055565b61453c565b8060ff1660030361453c5761453c60188054601955601e549055565b600061454783614a3c565b90506145d2836040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138519092919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600660205260408082209390935583519187168152919091205461461291613a5b565b73ffffffffffffffffffffffffffffffffffffffff851660009081526006602052604090205561464181614a8f565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83600001516040516146a491815260200190565b60405180910390a361dead73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836020015160405161471191815260200190565b60405180910390a3612ecb601954601855565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166116885761477a8173ffffffffffffffffffffffffffffffffffffffff166014614a9f565b614785836020614a9f565b6040516020016147969291906152fb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610f5691600401614e20565b602880547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790556040805160028082526060820183526000926020830190803683375050602854825192935073ffffffffffffffffffffffffffffffffffffffff169183915060009061488257614882615165565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106148d0576148d0615165565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526028546026546040517f095ea7b300000000000000000000000000000000000000000000000000000000815290831660048201526024810186905291169063095ea7b3906044016020604051808303816000875af1158015614959573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061497d9190615106565b506026546040517f5c11d79500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690635c11d795906149dd908690600090869088904290600401615194565b600060405180830381600087803b1580156149f757600080fd5b505af1158015614a0b573d6000803e3d6000fd5b5050602880547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555050505050565b604080518082019091526000808252602082015260006040518060400160405280848152602001614a7285601860000154614ce2565b90526020810151909150614a87908490613897565b815292915050565b611cfb816020015161dead614d0a565b60606000614aae83600261537c565b614ab99060026150a2565b67ffffffffffffffff811115614ad157614ad1615136565b6040519080825280601f01601f191660200182016040528015614afb576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110614b3257614b32615165565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110614b9557614b95615165565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000614bd184600261537c565b614bdc9060016150a2565b90505b6001811115614c79577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110614c1d57614c1d615165565b1a60f81b828281518110614c3357614c33615165565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93614c72816153b9565b9050614bdf565b5083156138a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610f56565b600081600003614cf457506000610ebc565b6138a3612710614d048585614d63565b90614d6f565b73ffffffffffffffffffffffffffffffffffffffff8116614d29575050565b81600003614d35575050565b30600090815260066020526040902054614d4f9083613a5b565b306000908152600660205260409020555050565b60006138a3828461537c565b60006138a382846153ee565b600060208284031215614d8d57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146138a357600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611cfb57600080fd5b600060208284031215614df157600080fd5b81356138a381614dbd565b60005b83811015614e17578181015183820152602001614dff565b50506000910152565b6020815260008251806020840152614e3f816040850160208701614dfc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060408385031215614e8457600080fd5b8235614e8f81614dbd565b946020939093013593505050565b8015158114611cfb57600080fd5b600080600080600060a08688031215614ec357600080fd5b8535614ece81614e9d565b97602087013597506040870135966060810135965060800135945092505050565b600080600060608486031215614f0457600080fd5b8335614f0f81614dbd565b92506020840135614f1f81614dbd565b929592945050506040919091013590565b600060208284031215614f4257600080fd5b5035919050565b60008060408385031215614f5c57600080fd5b823591506020830135614f6e81614dbd565b809150509250929050565b60008060408385031215614f8c57600080fd5b8235614f9781614dbd565b91506020830135614f6e81614e9d565b60008060408385031215614fba57600080fd5b8235614fc581614dbd565b91506020830135614f6e81614dbd565b600060208284031215614fe757600080fd5b81356138a381614e9d565b6000806040838503121561500557600080fd5b50508035926020909101359150565b60008060006060848603121561502957600080fd5b833561503481614dbd565b925060208401359150604084013561504b81614dbd565b809150509250925092565b60006020828403121561506857600080fd5b81516138a381614dbd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610ebc57610ebc615073565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150e6576150e6615073565b5060010190565b6000602082840312156150ff57600080fd5b5051919050565b60006020828403121561511857600080fd5b81516138a381614e9d565b81810381811115610ebc57610ebc615073565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156151f157845173ffffffffffffffffffffffffffffffffffffffff16835293830193918301916001016151bf565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b6000602080838503121561523257600080fd5b825167ffffffffffffffff8082111561524a57600080fd5b818501915085601f83011261525e57600080fd5b81518181111561527057615270615136565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156152b3576152b3615136565b6040529182528482019250838101850191888311156152d157600080fd5b938501935b828510156152ef578451845293850193928501926152d6565b98975050505050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351615333816017850160208801614dfc565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351615370816028840160208801614dfc565b01602801949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156153b4576153b4615073565b500290565b6000816153c8576153c8615073565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600082615424577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f42455032303a206275726e20616d6f756e7420657863656564732062616c616e6365a264697066735822122033e69f83cb8fd558240d572ff026044f4f41f985fe6f19d63b4775ebcc42eee764736f6c634300081000330000000000000000000000003b505af97031b75e2be39e7f8fa1fa634857f29d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c4

Deployed Bytecode

0x6080604052600436106103fd5760003560e01c806379cc67901161020d578063c3e0dbe911610128578063de7cf799116100bb578063e93476831161008a578063f8a67a621161006f578063f8a67a6214610dc3578063f943251714610de3578063fa9b768014610df957600080fd5b8063e934768314610d6f578063ea2f0b3714610da357600080fd5b8063de7cf79914610cf1578063e284db3e14610d08578063e4d1a87414610d28578063e877a52614610d3f57600080fd5b8063d5391393116100f7578063d539139314610c35578063d547741f14610c69578063d89135cd14610c89578063dd62ed3e14610c9e57600080fd5b8063c3e0dbe914610bb3578063c80bbbeb14610bd3578063ced72f8714610c00578063d3a866c714610c1557600080fd5b8063a457c2d7116101a0578063b2d8f2081161016f578063b2d8f20814610b06578063b6f3e08714610b26578063bd2f40c014610b46578063bd3900c014610b9d57600080fd5b8063a457c2d714610a79578063a5ee4e7114610a99578063a9059cbb14610ab9578063ad5c464814610ad957600080fd5b806391d14854116101dc57806391d14854146109f357806395d89b41146104b25780639fd8234e14610a44578063a217fddf14610a6457600080fd5b806379cc6790146109735780637a17feff1461099357806381cd08ee146109b35780638c232838146109d357600080fd5b8063313ce56711610318578063437823ec116102ab57806362695eae1161027a57806370a082311161025f57806370a08231146108f657806370bb0a1614610939578063717944e01461095957600080fd5b806362695eae146108945780636ddd1713146108c457600080fd5b8063437823ec146107f457806348709a93146108145780635342acb41461082e57806355de1faf1461087457600080fd5b8063403316d5116102e7578063403316d51461077457806340b28c2f1461079457806340c10f19146107b457806342966c68146107d457600080fd5b8063313ce567146106f857806336568abe1461071457806339509351146107345780633d8a62d31461075457600080fd5b806323b872dd116103905780632bfad3bd1161035f5780632bfad3bd1461062a5780632c77735c1461063f5780632f2ff15d146106a857806330367554146106c857600080fd5b806323b872dd14610591578063248a9ca3146105b1578063282c51f3146105e15780632b112e491461061557600080fd5b8063095ea7b3116103cc578063095ea7b3146104fe578063174ca3ec1461051e57806318160ddd1461053e57806320606b701461055d57600080fd5b806301ffc9a71461040957806302c52db01461043e57806302e8e85f1461046057806306fdde03146104b257600080fd5b3661040457005b600080fd5b34801561041557600080fd5b50610429610424366004614d7b565b610e29565b60405190151581526020015b60405180910390f35b34801561044a57600080fd5b5061045e610459366004614ddf565b610ec2565b005b34801561046c57600080fd5b5060265461048d9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610435565b3480156104be57600080fd5b50604080518082018252600581527f544f504941000000000000000000000000000000000000000000000000000000602082015290516104359190614e20565b34801561050a57600080fd5b50610429610519366004614e71565b611086565b34801561052a57600080fd5b5061045e610539366004614eab565b61109c565b34801561054a57600080fd5b50600d545b604051908152602001610435565b34801561056957600080fd5b5061054f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561059d57600080fd5b506104296105ac366004614eef565b61117e565b3480156105bd57600080fd5b5061054f6105cc366004614f30565b60009081526020819052604090206001015490565b3480156105ed57600080fd5b5061054f7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a84881565b34801561062157600080fd5b5061054f6113e7565b34801561063657600080fd5b5061045e611458565b34801561064b57600080fd5b50601f546020546021546022546023546024546025546106719660ff1695949392919087565b6040805197151588526020880196909652948601939093526060850191909152608084015260a083015260c082015260e001610435565b3480156106b457600080fd5b5061045e6106c3366004614f49565b6115af565b3480156106d457600080fd5b506104296106e3366004614ddf565b60176020526000908152604090205460ff1681565b34801561070457600080fd5b5060405160128152602001610435565b34801561072057600080fd5b5061045e61072f366004614f49565b6115d9565b34801561074057600080fd5b5061042961074f366004614e71565b61168c565b34801561076057600080fd5b5061045e61076f366004614ddf565b6116cf565b34801561078057600080fd5b5061045e61078f366004614f79565b6117b6565b3480156107a057600080fd5b5061045e6107af366004614fa7565b6118a4565b3480156107c057600080fd5b5061045e6107cf366004614e71565b611bb7565b3480156107e057600080fd5b5061045e6107ef366004614f30565b611c59565b34801561080057600080fd5b5061045e61080f366004614ddf565b611cfe565b34801561082057600080fd5b50600b546104299060ff1681565b34801561083a57600080fd5b50610429610849366004614ddf565b73ffffffffffffffffffffffffffffffffffffffff166000908152600f602052604090205460ff1690565b34801561088057600080fd5b5061045e61088f366004614f79565b611de5565b3480156108a057600080fd5b506104296108af366004614ddf565b600a6020526000908152604090205460ff1681565b3480156108d057600080fd5b506028546104299074010000000000000000000000000000000000000000900460ff1681565b34801561090257600080fd5b5061054f610911366004614ddf565b73ffffffffffffffffffffffffffffffffffffffff1660009081526006602052604090205490565b34801561094557600080fd5b5061045e610954366004614fd5565b611fad565b34801561096557600080fd5b506010546104299060ff1681565b34801561097f57600080fd5b5061045e61098e366004614e71565b612076565b34801561099f57600080fd5b5061045e6109ae366004614f30565b612123565b3480156109bf57600080fd5b5061045e6109ce366004614ddf565b6121c0565b3480156109df57600080fd5b5061054f6109ee366004614ddf565b612313565b3480156109ff57600080fd5b50610429610a0e366004614f49565b60009182526020828152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845291905290205460ff1690565b348015610a5057600080fd5b5061045e610a5f366004614ff2565b612351565b348015610a7057600080fd5b5061054f600081565b348015610a8557600080fd5b50610429610a94366004614e71565b612464565b348015610aa557600080fd5b5061045e610ab4366004614ddf565b6124c0565b348015610ac557600080fd5b50610429610ad4366004614e71565b612637565b348015610ae557600080fd5b5060285461048d9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610b1257600080fd5b5061045e610b21366004614ff2565b612821565b348015610b3257600080fd5b5061045e610b41366004614fa7565b612939565b348015610b5257600080fd5b50610b82610b61366004614ddf565b60126020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610435565b348015610ba957600080fd5b5061048d61dead81565b348015610bbf57600080fd5b5061045e610bce366004614f49565b612b75565b348015610bdf57600080fd5b5060275461048d9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610c0c57600080fd5b5060185461054f565b348015610c2157600080fd5b5061045e610c30366004614f49565b612c50565b348015610c4157600080fd5b5061054f7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b348015610c7557600080fd5b5061045e610c84366004614f49565b612ed3565b348015610c9557600080fd5b5061054f612ef8565b348015610caa57600080fd5b5061054f610cb9366004614fa7565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260076020908152604080832093909416825291909152205490565b348015610cfd57600080fd5b50601c5461054f9081565b348015610d1457600080fd5b5061045e610d23366004614ddf565b612f36565b348015610d3457600080fd5b50601b5461054f9081565b348015610d4b57600080fd5b50610429610d5a366004614ddf565b60086020526000908152604090205460ff1681565b348015610d7b57600080fd5b5061054f7fe6ad9a47fbda1dc18de1eb5eeb7d935e5e81b4748f3cfc61e233e64f8818206081565b348015610daf57600080fd5b5061045e610dbe366004614ddf565b61301a565b348015610dcf57600080fd5b5061045e610dde366004615014565b6130fe565b348015610def57600080fd5b5061054f60115481565b348015610e0557600080fd5b50610429610e14366004614ddf565b60096020526000908152604090205460ff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b000000000000000000000000000000000000000000000000000000001480610ebc57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16610f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f574544000000000000000000000000000060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff1661103a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4164647265737320686173206e6f74206265656e2064656e796c69737465642160448201527f20456e74657220616e20616464726573732074686174206973206f6e2074686560648201527f2064656e796c6973742e00000000000000000000000000000000000000000000608482015260a401610f56565b73ffffffffffffffffffffffffffffffffffffffff16600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6000611093338484613356565b50600192915050565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b601f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001695151595909517909455602092909255600060215560225560235543602455602555565b60003332148061119d5750336000908152600c602052604090205460ff165b611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f7765640000000000006044820152606401610f56565b600b5460ff16156112cd5773ffffffffffffffffffffffffffffffffffffffff84166000908152600a602052604090205460ff1680611267575073ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090205460ff165b6112cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5472616e73666572206e6f7420616c6c6f7765640000000000000000000000006044820152606401610f56565b333b1561137357336000908152600c602052604090205460ff16611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5468697320636f6e7472616374206973206e6f7420617070726f76656420746f60448201527f20696e746572616374207769746820544f5049410000000000000000000000006064820152608401610f56565b61137e848484613509565b6113dd84336113d88560405180606001604052806028815260200161542a6028913973ffffffffffffffffffffffffffffffffffffffff8a1660009081526007602090815260408083203384529091529020549190613851565b613356565b5060019392505050565b60066020527f54cdd369e4e8a8515e52ca72ec816c2101831ad1f18bf44102ed171459c9b4f85461dead60009081527f1aecba4ebe7a4e0673e4891b2b092b2228e4322380b579fb494fad3da8586e2254600d54919261145392909161144d9190613897565b90613897565b905090565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff166114f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b6027805473ffffffffffffffffffffffffffffffffffffffff9081166000908152600c60209081526040808320805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00918216811790925560268054871686528386208054831684179055875487168652600a855283862080548316841790558054871686528386208054831684179055965486168552600990935281842080548416821790559454909316825291902080549091169091179055565b6000828152602081905260409020600101546115ca816138aa565b6115d483836138b4565b505050565b73ffffffffffffffffffffffffffffffffffffffff8116331461167e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c6600000000000000000000000000000000006064820152608401610f56565b61168882826139a4565b5050565b33600081815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490916110939185906113d89086613a5b565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16611767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b73ffffffffffffffffffffffffffffffffffffffff16600090815260136020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff1661184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b73ffffffffffffffffffffffffffffffffffffffff91909116600090815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff1661193c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b6027805473ffffffffffffffffffffffffffffffffffffffff9081166000908152600f602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055602680548785167fffffffffffffffffffffffff00000000000000000000000000000000000000009182168117909255855494871694169390931790935580517fad5c46480000000000000000000000000000000000000000000000000000000081529051919263ad5c4648926004808401938290030181865afa158015611a1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a409190615056565b6028805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff0000000000000000000000000000000000000000918216178255602780548416600090815260176020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009081166001908117909255855489168552600f84528285208054821683179055855489168552600c8452828520805482168317905599881680855282852080548c1683179055855489168552600a845282852080548c168317905580855282852080548c16831790558554891685526009845282852080548c1683179055845290832080549099161790975590549080527f4f26c3876aa9f4b92579780beea1161a61f87ebf1ec6ee865b299e447ecba99c80548316918516919091179055905460159094527fa31547ce6245cdb9ecea19cf8c7eb9f5974025bb4075011409251ae855b30aed8054909116939091169290921790915550565b3360009081527f0781d7cac9c378efa22a7481e4d4d29704a680ddf504b3bc50b517700ee11e6c602052604090205460ff16611c4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b6116888282613a67565b3360009081527f6bc61e8d8a7feeba9a3dfbe950298fbca23cf0136992f9ef92f1b5529ac870ae602052604090205460ff16611cf1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b611cfb3382613b8e565b50565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16611d96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b73ffffffffffffffffffffffffffffffffffffffff166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16611e7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b813b611f57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152606c60248201527f546865206164647265737320796f7520656e746572656420697320726574757260448201527f6e696e67206120657874636f646573697a65206f662030202d20706c6561736560648201527f20656e737572652074686973206973206120636f6e747261637420616e64206e60848201527f6f7420612077616c6c657421000000000000000000000000000000000000000060a482015260c401610f56565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16612045576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b3360009081527f6bc61e8d8a7feeba9a3dfbe950298fbca23cf0136992f9ef92f1b5529ac870ae602052604090205460ff1661210e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b612119823383613d0c565b6116888282613b8e565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff166121bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b601155565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16612258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b6122827f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6826115af565b6122ac7f3c11d16cbaffd01df69ce1c404f6340ee057498f5f00246190ea54220576a848826115af565b73ffffffffffffffffffffffffffffffffffffffff166000908152600c60209081526040808320805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009182168117909255600a909352922080549091169091179055565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600f602052604081205460ff161561234957506000919050565b505060185490565b3360009081527f14764fde9c05acf7fd0fb570d7a8bd897798cb3f3d82998258b517116344ffbd602052604090205460ff166123e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b6109c46123f68383613a5b565b111561245e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4665657320657863656564206d6178206c696d697400000000000000000000006044820152606401610f56565b601c5550565b600061109333846113d8856040518060600160405280602581526020016154526025913933600090815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d1684529091529020549190613851565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16612558576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b73ffffffffffffffffffffffffffffffffffffffff811660009081526008602052604090205460ff16156125e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4164647265737320697320616c72656164792064656e796c69737465642100006044820152606401610f56565b73ffffffffffffffffffffffffffffffffffffffff16600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b6000333214806126565750336000908152600c602052604090205460ff165b6126bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f50726f787920636f6e7472616374206e6f7420616c6c6f7765640000000000006044820152606401610f56565b600b5460ff161561277057336000908152600a602052604090205460ff168061270a575073ffffffffffffffffffffffffffffffffffffffff83166000908152600a602052604090205460ff165b612770576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5472616e73666572206e6f7420616c6c6f7765640000000000000000000000006044820152606401610f56565b333b1561281657336000908152600c602052604090205460ff16612816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5468697320636f6e7472616374206973206e6f7420617070726f76656420746f60448201527f20696e746572616374207769746820544f5049410000000000000000000000006064820152608401610f56565b611093338484613509565b3360009081527f14764fde9c05acf7fd0fb570d7a8bd897798cb3f3d82998258b517116344ffbd602052604090205460ff166128b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b6109c46128c68383613a5b565b111561292e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4665657320657863656564206d6178206c696d697400000000000000000000006044820152606401610f56565b6018819055601b5550565b602654604080517fc45a0155000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163c45a01559160048083019260209291908290030181865afa1580156129a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cd9190615056565b90503373ffffffffffffffffffffffffffffffffffffffff82161480612a0a575060265473ffffffffffffffffffffffffffffffffffffffff1633145b80612a1457503330145b612a7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5059453a204e4f545f414c4c4f574544000000000000000000000000000000006044820152606401610f56565b612a8383613ddd565b6115d45773ffffffffffffffffffffffffffffffffffffffff8381166000818152600f60209081526040808320805460017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009182168117909255601784528285208054821683179055600c84528285208054821683179055600a84528285208054909116821790556016805485526014845282852080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690971790558054855260159093529083208054909416948716949094179092558154612b6b9084906150a2565b9091555050505050565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16612c0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b60405173ffffffffffffffffffffffffffffffffffffffff82169083156108fc029084906000818181858888f193505050501580156115d4573d6000803e3d6000fd5b6000805b601654811015612ca2576000818152601460205260409020543373ffffffffffffffffffffffffffffffffffffffff90911603612c9057600191505b80612c9a816150b5565b915050612c54565b5060265473ffffffffffffffffffffffffffffffffffffffff16331480612cc65750805b612d2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5059453a204e4f545f414c4c4f574544000000000000000000000000000000006044820152606401610f56565b82600003612d3f576115d4601954601855565b6000612d4a83613e38565b9050601654811015612ecd576040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015260009073ffffffffffffffffffffffffffffffffffffffff85169063dd62ed3e90604401602060405180830381865afa158015612dc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ded91906150ed565b9050848110612ecb576040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810186905273ffffffffffffffffffffffffffffffffffffffff8516906323b872dd906064016020604051808303816000875af1158015612e6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e939190615106565b5060285473ffffffffffffffffffffffffffffffffffffffff858116911614612ec057612ec08585613e9d565b612ecb601954601855565b505b50505050565b600082815260208190526040902060010154612eee816138aa565b6115d483836139a4565b600e5461dead600090815260066020527f1aecba4ebe7a4e0673e4891b2b092b2228e4322380b579fb494fad3da8586e225490916114539190613a5b565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16612fce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b73ffffffffffffffffffffffffffffffffffffffff16600090815260136020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff166130b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b73ffffffffffffffffffffffffffffffffffffffff166000908152600f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b3360009081527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5602052604090205460ff16613196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f544f5049413a204e4f545f414c4c4f57454400000000000000000000000000006044820152606401610f56565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152829073ffffffffffffffffffffffffffffffffffffffff8516906370a0823190602401602060405180830381865afa158015613202573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061322691906150ed565b10156132bd576040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015613296573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ba91906150ed565b91505b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526024820184905284169063a9059cbb906044016020604051808303816000875af1158015613332573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ecd9190615106565b73ffffffffffffffffffffffffffffffffffffffff83166133f8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f42455032303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610f56565b73ffffffffffffffffffffffffffffffffffffffff821661349b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f42455032303a20617070726f766520746f20746865207a65726f20616464726560448201527f73730000000000000000000000000000000000000000000000000000000000006064820152608401610f56565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83166135ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f42455032303a207472616e736665722066726f6d20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610f56565b73ffffffffffffffffffffffffffffffffffffffff821661364f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f42455032303a207472616e7366657220746f20746865207a65726f206164647260448201527f65737300000000000000000000000000000000000000000000000000000000006064820152608401610f56565b600081116136df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f5472616e7366657220616d6f756e74206d75737420626520677265617465722060448201527f7468616e207a65726f00000000000000000000000000000000000000000000006064820152608401610f56565b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205460ff161561371257600080fd5b61371b81614080565b156137285761372861419f565b73ffffffffffffffffffffffffffffffffffffffff821660009081526017602052604081205460ff168015613778575060265473ffffffffffffffffffffffffffffffffffffffff858116911614155b80156137aa575073ffffffffffffffffffffffffffffffffffffffff84166000908152600f602052604090205460ff16155b156137ca576137b984836141fa565b6137c257600080fd5b506001613845565b73ffffffffffffffffffffffffffffffffffffffff841660009081526013602052604090205460ff161561380057506002613845565b73ffffffffffffffffffffffffffffffffffffffff831660009081526013602052604090205460ff16156138455761383884836141fa565b61384157600080fd5b5060035b612ecd84848484614398565b6000818484111561388f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f569190614e20565b505050900390565b60006138a38284615123565b9392505050565b611cfb8133614724565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166116885760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff85168452909152902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556139463390565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff16156116885760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516808552925280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006138a382846150a2565b73ffffffffffffffffffffffffffffffffffffffff8216613ae4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f42455032303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610f56565b600d54613af19082613a5b565b600d5573ffffffffffffffffffffffffffffffffffffffff8216600090815260066020526040902054613b249082613a5b565b73ffffffffffffffffffffffffffffffffffffffff83166000818152600660205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90613b829085815260200190565b60405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff8216613c31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f42455032303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610f56565b613c7b816040518060600160405280602281526020016154776022913973ffffffffffffffffffffffffffffffffffffffff85166000908152600660205260409020549190613851565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260066020526040902055600d54613cae9082613897565b600d55600e54613cbe9082613a5b565b600e5560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001613b82565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600760209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612ecd5781811015613dd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610f56565b612ecd8484848403613356565b600080805b601654811015613e315760008181526014602052604090205473ffffffffffffffffffffffffffffffffffffffff808616911603613e1f57600191505b80613e29816150b5565b915050613de2565b5092915050565b6000806016546001613e4a91906150a2565b905060005b601654811015613e315760008181526015602052604090205473ffffffffffffffffffffffffffffffffffffffff808616911603613e8b578091505b80613e95816150b5565b915050613e4f565b6040805160028082526060820183526000926020830190803683370190505090508181600081518110613ed257613ed2615165565b73ffffffffffffffffffffffffffffffffffffffff9283166020918202929092010152602854825191169082906001908110613f1057613f10615165565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526026546040517f095ea7b30000000000000000000000000000000000000000000000000000000081529082166004820152602481018590529083169063095ea7b3906044016020604051808303816000875af1158015613f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fbb9190615106565b506026546040517f38ed173900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116906338ed17399061401b908690600090869030904290600401615194565b6000604051808303816000875af115801561403a573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052612ecd919081019061521f565b60275460009073ffffffffffffffffffffffffffffffffffffffff1633148015906140c757506028547501000000000000000000000000000000000000000000900460ff16155b80156140d55750601f5460ff165b80156140f0575060235460245443916140ed916150a2565b11155b801561418f57506022546028546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a0823190602401602060405180830381865afa158015614168573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061418c91906150ed565b10155b8015610ebc575050602554111590565b6022546141ae9061dead6147f4565b436024556022546021546141c191613a5b565b602181905560205410156141f857601f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b565b60105460009060ff161580614234575073ffffffffffffffffffffffffffffffffffffffff831660009081526009602052604090205460ff165b1561424157506001610ebc565b73ffffffffffffffffffffffffffffffffffffffff83166000908152601260205260409020600101544211801561427a57506011548211155b156142f15773ffffffffffffffffffffffffffffffffffffffff8316600090815260126020526040902042908190556142b690620151806150a2565b73ffffffffffffffffffffffffffffffffffffffff841660009081526012602052604090206001808201929092556002018390559050610ebc565b60115473ffffffffffffffffffffffffffffffffffffffff84166000908152601260205260409020600201546143279084613a5b565b116143905773ffffffffffffffffffffffffffffffffffffffff831660009081526012602052604090206002015461435f9083613a5b565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260126020526040902060020155506001610ebc565b506000610ebc565b60ff811615806143ab57508060ff166001145b156144ff576143c160188054601955601a549055565b604080518082018252601481527f496e73756666696369656e742042616c616e636500000000000000000000000060208083019190915273ffffffffffffffffffffffffffffffffffffffff8716600090815260069091529190912054614429918490613851565b73ffffffffffffffffffffffffffffffffffffffff80861660009081526006602052604080822093909355908516815220546144659083613a5b565b73ffffffffffffffffffffffffffffffffffffffff80851660008181526006602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906144c69086815260200190565b60405180910390a38060ff166000036144e9576144e4601954601855565b612ecd565b8060ff166001036144e4576144e4601c54601855565b8060ff166002036145205761451b60188054601955601d549055565b61453c565b8060ff1660030361453c5761453c60188054601955601e549055565b600061454783614a3c565b90506145d2836040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138519092919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff8087166000908152600660205260408082209390935583519187168152919091205461461291613a5b565b73ffffffffffffffffffffffffffffffffffffffff851660009081526006602052604090205561464181614a8f565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83600001516040516146a491815260200190565b60405180910390a361dead73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836020015160405161471191815260200190565b60405180910390a3612ecb601954601855565b60008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915290205460ff166116885761477a8173ffffffffffffffffffffffffffffffffffffffff166014614a9f565b614785836020614a9f565b6040516020016147969291906152fb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610f5691600401614e20565b602880547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790556040805160028082526060820183526000926020830190803683375050602854825192935073ffffffffffffffffffffffffffffffffffffffff169183915060009061488257614882615165565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505030816001815181106148d0576148d0615165565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526028546026546040517f095ea7b300000000000000000000000000000000000000000000000000000000815290831660048201526024810186905291169063095ea7b3906044016020604051808303816000875af1158015614959573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061497d9190615106565b506026546040517f5c11d79500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690635c11d795906149dd908690600090869088904290600401615194565b600060405180830381600087803b1580156149f757600080fd5b505af1158015614a0b573d6000803e3d6000fd5b5050602880547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1690555050505050565b604080518082019091526000808252602082015260006040518060400160405280848152602001614a7285601860000154614ce2565b90526020810151909150614a87908490613897565b815292915050565b611cfb816020015161dead614d0a565b60606000614aae83600261537c565b614ab99060026150a2565b67ffffffffffffffff811115614ad157614ad1615136565b6040519080825280601f01601f191660200182016040528015614afb576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110614b3257614b32615165565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110614b9557614b95615165565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000614bd184600261537c565b614bdc9060016150a2565b90505b6001811115614c79577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110614c1d57614c1d615165565b1a60f81b828281518110614c3357614c33615165565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060049490941c93614c72816153b9565b9050614bdf565b5083156138a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610f56565b600081600003614cf457506000610ebc565b6138a3612710614d048585614d63565b90614d6f565b73ffffffffffffffffffffffffffffffffffffffff8116614d29575050565b81600003614d35575050565b30600090815260066020526040902054614d4f9083613a5b565b306000908152600660205260409020555050565b60006138a3828461537c565b60006138a382846153ee565b600060208284031215614d8d57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146138a357600080fd5b73ffffffffffffffffffffffffffffffffffffffff81168114611cfb57600080fd5b600060208284031215614df157600080fd5b81356138a381614dbd565b60005b83811015614e17578181015183820152602001614dff565b50506000910152565b6020815260008251806020840152614e3f816040850160208701614dfc565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60008060408385031215614e8457600080fd5b8235614e8f81614dbd565b946020939093013593505050565b8015158114611cfb57600080fd5b600080600080600060a08688031215614ec357600080fd5b8535614ece81614e9d565b97602087013597506040870135966060810135965060800135945092505050565b600080600060608486031215614f0457600080fd5b8335614f0f81614dbd565b92506020840135614f1f81614dbd565b929592945050506040919091013590565b600060208284031215614f4257600080fd5b5035919050565b60008060408385031215614f5c57600080fd5b823591506020830135614f6e81614dbd565b809150509250929050565b60008060408385031215614f8c57600080fd5b8235614f9781614dbd565b91506020830135614f6e81614e9d565b60008060408385031215614fba57600080fd5b8235614fc581614dbd565b91506020830135614f6e81614dbd565b600060208284031215614fe757600080fd5b81356138a381614e9d565b6000806040838503121561500557600080fd5b50508035926020909101359150565b60008060006060848603121561502957600080fd5b833561503481614dbd565b925060208401359150604084013561504b81614dbd565b809150509250925092565b60006020828403121561506857600080fd5b81516138a381614dbd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610ebc57610ebc615073565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150e6576150e6615073565b5060010190565b6000602082840312156150ff57600080fd5b5051919050565b60006020828403121561511857600080fd5b81516138a381614e9d565b81810381811115610ebc57610ebc615073565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156151f157845173ffffffffffffffffffffffffffffffffffffffff16835293830193918301916001016151bf565b505073ffffffffffffffffffffffffffffffffffffffff969096166060850152505050608001529392505050565b6000602080838503121561523257600080fd5b825167ffffffffffffffff8082111561524a57600080fd5b818501915085601f83011261525e57600080fd5b81518181111561527057615270615136565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156152b3576152b3615136565b6040529182528482019250838101850191888311156152d157600080fd5b938501935b828510156152ef578451845293850193928501926152d6565b98975050505050505050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351615333816017850160208801614dfc565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351615370816028840160208801614dfc565b01602801949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156153b4576153b4615073565b500290565b6000816153c8576153c8615073565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b600082615424577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fe42455032303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636542455032303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726f42455032303a206275726e20616d6f756e7420657863656564732062616c616e6365a264697066735822122033e69f83cb8fd558240d572ff026044f4f41f985fe6f19d63b4775ebcc42eee764736f6c63430008100033

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

0000000000000000000000003b505af97031b75e2be39e7f8fa1fa634857f29d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c4

-----Decoded View---------------
Arg [0] : _router (address): 0x3b505Af97031B75e2be39e7F8FA1Fa634857f29D
Arg [1] : _buybackFeeBuy (uint256): 0
Arg [2] : _buybackFeeSell (uint256): 2500

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000003b505af97031b75e2be39e7f8fa1fa634857f29d
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 00000000000000000000000000000000000000000000000000000000000009c4


Deployed Bytecode Sourcemap

317:26338:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2606:202:0;;;;;;;;;;-1:-1:-1;2606:202:0;;;;;:::i;:::-;;:::i;:::-;;;516:14:14;;509:22;491:41;;479:2;464:18;2606:202:0;;;;;;;;25712:327:10;;;;;;;;;;-1:-1:-1;25712:327:10;;;;;:::i;:::-;;:::i;:::-;;3031:35;;;;;;;;;;-1:-1:-1;3031:35:10;;;;;;;;;;;1153:42:14;1141:55;;;1123:74;;1111:2;1096:18;3031:35:10;954:249:14;6004:90:10;;;;;;;;;;-1:-1:-1;6082:5:10;;;;;;;;;;;;;;;;6004:90;;;;6082:5;6004:90;:::i;7363:158::-;;;;;;;;;;-1:-1:-1;7363:158:10;;;;;:::i;:::-;;:::i;20126:564::-;;;;;;;;;;-1:-1:-1;20126:564:10;;;;;:::i;:::-;;:::i;6296:93::-;;;;;;;;;;-1:-1:-1;6375:7:10;;6296:93;;;3032:25:14;;;3020:2;3005:18;6296:93:10;2886:177:14;3950:122:10;;;;;;;;;;;;3992:80;3950:122;;7527:714;;;;;;;;;;-1:-1:-1;7527:714:10;;;;;:::i;:::-;;:::i;4391:129:0:-;;;;;;;;;;-1:-1:-1;4391:129:0;;;;;:::i;:::-;4465:7;4491:12;;;;;;;;;;:22;;;;4391:129;463:62:10;;;;;;;;;;;;501:24;463:62;;15510:149;;;;;;;;;;;;;:::i;10954:443::-;;;;;;;;;;;;;:::i;3000:24::-;;;;;;;;;;-1:-1:-1;3000:24:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4230:14:14;;4223:22;4205:41;;4277:2;4262:18;;4255:34;;;;4305:18;;;4298:34;;;;4363:2;4348:18;;4341:34;;;;4406:3;4391:19;;4384:35;4450:3;4435:19;;4428:35;4494:3;4479:19;;4472:35;4192:3;4177:19;3000:24:10;3896:617:14;4816:145:0;;;;;;;;;;-1:-1:-1;4816:145:0;;;;;:::i;:::-;;:::i;2571:47:10:-;;;;;;;;;;-1:-1:-1;2571:47:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;6200:90;;;;;;;;;;-1:-1:-1;6200:90:10;;2776:2;4980:36:14;;4968:2;4953:18;6200:90:10;4838:184:14;5925:214:0;;;;;;;;;;-1:-1:-1;5925:214:0;;;;;:::i;:::-;;:::i;8247:224:10:-;;;;;;;;;;-1:-1:-1;8247:224:10;;;;;:::i;:::-;;:::i;9127:180::-;;;;;;;;;;-1:-1:-1;9127:180:10;;;;;:::i;:::-;;:::i;26093:202::-;;;;;;;;;;-1:-1:-1;26093:202:10;;;;;:::i;:::-;;:::i;10201:747::-;;;;;;;;;;-1:-1:-1;10201:747:10;;;;;:::i;:::-;;:::i;24819:169::-;;;;;;;;;;-1:-1:-1;24819:169:10;;;;;:::i;:::-;;:::i;24994:155::-;;;;;;;;;;-1:-1:-1;24994:155:10;;;;;:::i;:::-;;:::i;8758:179::-;;;;;;;;;;-1:-1:-1;8758:179:10;;;;;:::i;:::-;;:::i;1247:30::-;;;;;;;;;;-1:-1:-1;1247:30:10;;;;;;;;13235:121;;;;;;;;;;-1:-1:-1;13235:121:10;;;;;:::i;:::-;13322:27;;13299:4;13322:27;;;:18;:27;;;;;;;;;13235:121;26301:351;;;;;;;;;;-1:-1:-1;26301:351:10;;;;;:::i;:::-;;:::i;1193:48::-;;;;;;;;;;-1:-1:-1;1193:48:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;3217:30;;;;;;;;;;-1:-1:-1;3217:30:10;;;;;;;;;;;6514:117;;;;;;;;;;-1:-1:-1;6514:117:10;;;;;:::i;:::-;6606:18;;6580:7;6606:18;;;:9;:18;;;;;;;6514:117;11581:187;;;;;;;;;;-1:-1:-1;11581:187:10;;;;;:::i;:::-;;:::i;2066:39::-;;;;;;;;;;-1:-1:-1;2066:39:10;;;;;;;;24481:233;;;;;;;;;;-1:-1:-1;24481:233:10;;;;;:::i;:::-;;:::i;11403:172::-;;;;;;;;;;-1:-1:-1;11403:172:10;;;;;:::i;:::-;;:::i;11774:328::-;;;;;;;;;;-1:-1:-1;11774:328:10;;;;;:::i;:::-;;:::i;15665:206::-;;;;;;;;;;-1:-1:-1;15665:206:10;;;;;:::i;:::-;;:::i;2895:145:0:-;;;;;;;;;;-1:-1:-1;2895:145:0;;;;;:::i;:::-;2981:4;3004:12;;;;;;;;;;;:29;;;;;;;;;;;;;;;;2895:145;9898:297:10;;;;;;;;;;-1:-1:-1;9898:297:10;;;;;:::i;:::-;;:::i;2027:49:0:-;;;;;;;;;;-1:-1:-1;2027:49:0;2072:4;2027:49;;8477:275:10;;;;;;;;;;-1:-1:-1;8477:275:10;;;;;:::i;:::-;;:::i;25353:289::-;;;;;;;;;;-1:-1:-1;25353:289:10;;;;;:::i;:::-;;:::i;6637:573::-;;;;;;;;;;-1:-1:-1;6637:573:10;;;;;:::i;:::-;;:::i;3104:19::-;;;;;;;;;;-1:-1:-1;3104:19:10;;;;;;;;9551:341;;;;;;;;;;-1:-1:-1;9551:341:10;;;;;:::i;:::-;;:::i;20953:642::-;;;;;;;;;;-1:-1:-1;20953:642:10;;;;;:::i;:::-;;:::i;2275:56::-;;;;;;;;;;-1:-1:-1;2275:56:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6924:25:14;;;6980:2;6965:18;;6958:34;;;;7008:18;;;7001:34;6912:2;6897:18;2275:56:10;6722:319:14;3129:81:10;;;;;;;;;;;;3168:42;3129:81;;21895:183;;;;;;;;;;-1:-1:-1;21895:183:10;;;;;:::i;:::-;;:::i;3072:26::-;;;;;;;;;;-1:-1:-1;3072:26:10;;;;;;;;15877:95;;;;;;;;;;-1:-1:-1;15942:12:10;:23;15877:95;;17611:656;;;;;;;;;;-1:-1:-1;17611:656:10;;;;;:::i;:::-;;:::i;395:62::-;;;;;;;;;;;;433:24;395:62;;5241:147:0;;;;;;;;;;-1:-1:-1;5241:147:0;;;;;:::i;:::-;;:::i;6395:113:10:-;;;;;;;;;;;;;:::i;7216:141::-;;;;;;;;;;-1:-1:-1;7216:141:10;;;;;:::i;:::-;7323:18;;;;7297:7;7323:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;7216:141;2903:21;;;;;;;;;;-1:-1:-1;2903:21:10;;;;;;9313:184;;;;;;;;;;-1:-1:-1;9313:184:10;;;;;:::i;:::-;;:::i;2877:20::-;;;;;;;;;;-1:-1:-1;2877:20:10;;;;;;1080:45;;;;;;;;;;-1:-1:-1;1080:45:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;531:70;;;;;;;;;;;;573:28;531:70;;8943:178;;;;;;;;;;-1:-1:-1;8943:178:10;;;;;:::i;:::-;;:::i;22135:314::-;;;;;;;;;;-1:-1:-1;22135:314:10;;;;;:::i;:::-;;:::i;2111:40::-;;;;;;;;;;;;;;;;1131:56;;;;;;;;;;-1:-1:-1;1131:56:10;;;;;:::i;:::-;;;;;;;;;;;;;;;;2606:202:0;2691:4;2714:47;;;2729:32;2714:47;;:87;;-1:-1:-1;952:25:7;937:40;;;;2765:36:0;2707:94;2606:202;-1:-1:-1;;2606:202:0:o;25712:327:10:-;25821:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;25785:70:10;;;;;;;8044:2:14;25785:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;25785:70:10;;;;;;;;;25874:29;;;;;;;:12;:29;;;;;;;;25866:117;;;;;;;8391:2:14;25866:117:10;;;8373:21:14;8430:2;8410:18;;;8403:30;8469:34;8449:18;;;8442:62;8540:34;8520:18;;;8513:62;8612:12;8591:19;;;8584:41;8642:19;;25866:117:10;8189:478:14;25866:117:10;25994:29;;26026:5;25994:29;;;:12;:29;;;;;:37;;;;;;25712:327::o;7363:158::-;7438:4;7454:39;719:10:5;7477:7:10;7486:6;7454:8;:39::i;:::-;-1:-1:-1;7510:4:10;7363:158;;;;:::o;20126:564::-;20303:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;20267:70:10;;;;;;;8044:2:14;20267:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;20267:70:10;7842:342:14;20267:70:10;20347:8;:38;;;;;;;;;;;;;;20395:23;:30;;;;-1:-1:-1;20435:31:10;:35;20480:26;:36;20526:31;:41;20609:12;20577:29;:44;20631:32;:52;20126:564::o;7527:714::-;7625:4;7649:10;7663:9;7649:23;;:55;;-1:-1:-1;7693:10:10;7676:28;;;;:16;:28;;;;;;;;7649:55;7641:94;;;;;;;8874:2:14;7641:94:10;;;8856:21:14;8913:2;8893:18;;;8886:30;8952:28;8932:18;;;8925:56;8998:18;;7641:94:10;8672:350:14;7641:94:10;7748:18;;;;7745:136;;;7791:23;;;;;;;:15;:23;;;;;;;;;:53;;-1:-1:-1;7818:26:10;;;;;;;:15;:26;;;;;;;;7791:53;7783:86;;;;;;;9229:2:14;7783:86:10;;;9211:21:14;9268:2;9248:18;;;9241:30;9307:22;9287:18;;;9280:50;9347:18;;7783:86:10;9027:344:14;7783:86:10;7906:10;5939:18;5983:8;7890:147;;7958:10;7941:28;;;;:16;:28;;;;;;;;7933:93;;;;;;;9578:2:14;7933:93:10;;;9560:21:14;9617:2;9597:18;;;9590:30;9656:34;9636:18;;;9629:62;9727:22;9707:18;;;9700:50;9767:19;;7933:93:10;9376:416:14;7933:93:10;8046:36;8056:6;8064:9;8075:6;8046:9;:36::i;:::-;8092:121;8101:6;719:10:5;8123:89:10;8161:6;8123:89;;;;;;;;;;;;;;;;;:19;;;;;;;:11;:19;;;;;;;;719:10:5;8123:33:10;;;;;;;;;;:37;:89::i;:::-;8092:8;:121::i;:::-;-1:-1:-1;8230:4:10;7527:714;;;;;:::o;15510:149::-;6606:9;:18;;;;3168:42;15563:7;6606:18;;;;;15589:7;;15563;;15589:63;;6606:18;;15589:36;;:7;:11;:36::i;:::-;:40;;:63::i;:::-;15582:70;;15510:149;:::o;10954:443::-;11034:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;10998:70:10;;;;;;;8044:2:14;10998:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;10998:70:10;7842:342:14;10998:70:10;11095:11;;;;;;;11078:29;;;;:16;:29;;;;;;;;:36;;11110:4;11078:36;;;;;;;;;11149:13;;;;;11124:40;;;;;:47;;;;;;;;11197:11;;;;11181:28;;:15;:28;;;;;:35;;;;;;;;11250:13;;;;11226:39;;;;;:46;;;;;;;;11306:11;;;;11282:36;;:23;:36;;;;;;:43;;;;;;;;11367:13;;;;;11335:47;;;;;:54;;;;;;;;;;10954:443::o;4816:145:0:-;4465:7;4491:12;;;;;;;;;;:22;;;2505:16;2516:4;2505:10;:16::i;:::-;4929:25:::1;4940:4;4946:7;4929:10;:25::i;:::-;4816:145:::0;;;:::o;5925:214::-;6020:23;;;719:10:5;6020:23:0;6012:83;;;;;;;9999:2:14;6012:83:0;;;9981:21:14;10038:2;10018:18;;;10011:30;10077:34;10057:18;;;10050:62;10148:17;10128:18;;;10121:45;10183:19;;6012:83:0;9797:411:14;6012:83:0;6106:26;6118:4;6124:7;6106:11;:26::i;:::-;5925:214;;:::o;8247:224:10:-;719:10:5;8344:4:10;8392:25;;;:11;:25;;;;;;;;;:34;;;;;;;;;;8344:4;;8360:83;;8383:7;;8392:50;;8431:10;8392:38;:50::i;9127:180::-;9225:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;9189:70:10;;;;;;;8044:2:14;9189:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;9189:70:10;7842:342:14;9189:70:10;9269:24;;;;;;:15;:24;;;;;:31;;;;9296:4;9269:31;;;9127:180::o;26093:202::-;26206:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;26170:70:10;;;;;;;8044:2:14;26170:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;26170:70:10;7842:342:14;26170:70:10;26250:31;;;;;;;;;:23;:31;;;;;:38;;;;;;;;;;;;;26093:202::o;10201:747::-;10315:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;10279:70:10;;;;;;;8044:2:14;10279:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;10279:70:10;7842:342:14;10279:70:10;10378:11;;;;;;;10393:5;10359:31;;;:18;:31;;;;;;;;;:39;;;;;;10408:13;:39;;;;;;;;;;;;;;10457:19;;;;;;;;;;;;;;10493:20;;;;;;;10408:39;;10493:18;;:20;;;;;;;;;;10408:39;10493:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10486:4;:27;;;;;;;;;;;;;10539:11;;;;;10486:4;10524:27;;;:14;:27;;;;;;;;:34;;;;;;10486:27;10524:34;;;;;;10587:11;;;;10568:31;;:18;:31;;;;;:38;;;;;;;;10633:11;;;;10616:29;;:16;:29;;;;;:36;;;;;;;;10662:25;;;;;;;;;:32;;;;;;;;10720:11;;;;10704:28;;:15;:28;;;;;:35;;;;;;;;10749:24;;;;;;:31;;;;;;;;10814:11;;;;10790:36;;:23;:36;;;;;:43;;;;;;;;10843:32;;;;;:39;;;;;;;;;10904:11;;10893:8;;;;:22;;;;10904:11;;;10893:22;;;;;;10937:4;;10925:6;:9;;;;:16;;;;;10937:4;;;;10925:16;;;;;;;-1:-1:-1;10201:747:10:o;24819:169::-;24909:10;2981:4:0;3004:29;;;:12;;:29;:12;:29;;;;;24880:63:10;;;;;;;8044:2:14;24880:63:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;24880:63:10;7842:342:14;24880:63:10;24953:19;24959:3;24964:7;24953:5;:19::i;24994:155::-;25071:10;2981:4:0;3004:29;;;:12;;:29;:12;:29;;;;;25042:63:10;;;;;;;8044:2:14;25042:63:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;25042:63:10;7842:342:14;25042:63:10;25115:26;25121:10;25133:7;25115:5;:26::i;:::-;24994:155;:::o;8758:179::-;8852:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;8816:70:10;;;;;;;8044:2:14;8816:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;8816:70:10;7842:342:14;8816:70:10;8896:27;;;;;;:18;:27;;;;;:34;;;;8926:4;8896:34;;;8758:179::o;26301:351::-;26414:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;26378:70:10;;;;;;;8044:2:14;26378:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;26378:70:10;7842:342:14;26378:70:10;5939:18;;26458:143;;;;;;;10671:2:14;26458:143:10;;;10653:21:14;10710:3;10690:18;;;10683:31;10750:34;10730:18;;;10723:62;10821:34;10801:18;;;10794:62;10893:34;10872:19;;;10865:63;10965:14;10944:19;;;10937:43;10997:19;;26458:143:10;10469:553:14;26458:143:10;26611:27;;;;;;;;;:16;:27;;;;;:34;;;;;;;;;;;;;26301:351::o;11581:187::-;11685:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;11649:70:10;;;;;;;8044:2:14;11649:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;11649:70:10;7842:342:14;11649:70:10;11729:18;:32;;;;;;;;;;;;;11581:187::o;24481:233::-;24578:10;2981:4:0;3004:29;;;:12;;:29;:12;:29;;;;;24549:63:10;;;;;;;8044:2:14;24549:63:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;24549:63:10;7842:342:14;24549:63:10;24623:43;24639:5;24646:10;24658:7;24623:15;:43::i;:::-;24676:21;24682:5;24689:7;24676:5;:21::i;11403:172::-;11501:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;11465:70:10;;;;;;;8044:2:14;11465:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;11465:70:10;7842:342:14;11465:70:10;11545:13;:23;11403:172::o;11774:328::-;11876:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;11840:70:10;;;;;;;8044:2:14;11840:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;11840:70:10;7842:342:14;11840:70:10;11920:36;433:24;11943:12;11920:9;:36::i;:::-;11966;501:24;11989:12;11966:9;:36::i;:::-;12012:30;;;;;;:16;:30;;;;;;;;:37;;12045:4;12012:37;;;;;;;;;12059:15;:29;;;;;:36;;;;;;;;;;11774:328::o;15665:206::-;15746:27;;;15724:7;15746:27;;;:18;:27;;;;;;;;15743:122;;;-1:-1:-1;15796:1:10;;15665:206;-1:-1:-1;15665:206:10:o;15743:122::-;-1:-1:-1;;15831:12:10;:23;;15665:206::o;9898:297::-;10017:10;2981:4:0;3004:29;;;:12;;:29;:12;:29;;;;;9984:67:10;;;;;;;8044:2:14;9984:67:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;9984:67:10;7842:342:14;9984:67:10;10105:4;10069:32;:15;10089:11;10069:19;:32::i;:::-;:40;;10061:74;;;;;;;11229:2:14;10061:74:10;;;11211:21:14;11268:2;11248:18;;;11241:30;11307:23;11287:18;;;11280:51;11348:18;;10061:74:10;11027:345:14;10061:74:10;10154:9;:34;-1:-1:-1;9898:297:10:o;8477:275::-;8579:4;8595:129;719:10:5;8618:7:10;8627:96;8666:15;8627:96;;;;;;;;;;;;;;;;;719:10:5;8627:25:10;;;;:11;:25;;;;;;;;;:34;;;;;;;;;;;;:38;:96::i;25353:289::-;25462:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;25426:70:10;;;;;;;8044:2:14;25426:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;25426:70:10;7842:342:14;25426:70:10;25516:32;;;;;;;:12;:32;;;;;;;;25515:33;25507:77;;;;;;;11579:2:14;25507:77:10;;;11561:21:14;11618:2;11598:18;;;11591:30;11657:32;11637:18;;;11630:60;11707:18;;25507:77:10;11377:354:14;25507:77:10;25595:32;;;;;;:12;:32;;;;;:39;;;;25630:4;25595:39;;;25353:289::o;6637:573::-;6715:4;6739:10;6753:9;6739:23;;:55;;-1:-1:-1;6783:10:10;6766:28;;;;:16;:28;;;;;;;;6739:55;6731:94;;;;;;;8874:2:14;6731:94:10;;;8856:21:14;8913:2;8893:18;;;8886:30;8952:28;8932:18;;;8925:56;8998:18;;6731:94:10;8672:350:14;6731:94:10;6838:18;;;;6835:140;;;6897:10;6881:27;;;;:15;:27;;;;;;;;;:57;;-1:-1:-1;6912:26:10;;;;;;;:15;:26;;;;;;;;6881:57;6873:90;;;;;;;9229:2:14;6873:90:10;;;9211:21:14;9268:2;9248:18;;;9241:30;9307:22;9287:18;;;9280:50;9347:18;;6873:90:10;9027:344:14;6873:90:10;7000:10;5939:18;5983:8;6984:147;;7052:10;7035:28;;;;:16;:28;;;;;;;;7027:93;;;;;;;9578:2:14;7027:93:10;;;9560:21:14;9617:2;9597:18;;;9590:30;9656:34;9636:18;;;9629:62;9727:22;9707:18;;;9700:50;9767:19;;7027:93:10;9376:416:14;7027:93:10;7140:42;719:10:5;7164:9:10;7175:6;7140:9;:42::i;9551:341::-;9669:10;2981:4:0;3004:29;;;:12;;:29;:12;:29;;;;;9636:67:10;;;;;;;8044:2:14;9636:67:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;9636:67:10;7842:342:14;9636:67:10;9757:4;9721:32;:15;9741:11;9721:19;:32::i;:::-;:40;;9713:74;;;;;;;11229:2:14;9713:74:10;;;11211:21:14;11268:2;11248:18;;;11241:30;11307:23;11287:18;;;11280:51;11348:18;;9713:74:10;11027:345:14;9713:74:10;9805:12;:37;;;9852:8;:33;-1:-1:-1;9551:341:10:o;20953:642::-;21036:13;;:23;;;;;;;;21018:15;;21036:13;;;:21;;:23;;;;;;;;;;;;;;:13;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21018:41;-1:-1:-1;21090:10:10;:21;;;;;:73;;-1:-1:-1;21149:13:10;;;;21127:10;:36;21090:73;:116;;;-1:-1:-1;21179:10:10;21201:4;21179:27;21090:116;21069:176;;;;;;;11938:2:14;21069:176:10;;;11920:21:14;11977:2;11957:18;;;11950:30;12016:18;11996;;;11989:46;12052:18;;21069:176:10;11736:340:14;21069:176:10;21260:27;21281:5;21260:20;:27::i;:::-;21256:333;;21303:25;;;;;;;;:18;:25;;;;;;;;:32;;21331:4;21303:32;;;;;;;;;21349:14;:21;;;;;:28;;;;;;;;21391:16;:23;;;;;:30;;;;;;;;21435:15;:22;;;;;:29;;;;;;;;;21485:11;;;21479:18;;:5;:18;;;;;:26;;;;;;;;;;;21526:11;;21519:19;;:6;:19;;;;;;:28;;;;;;;;;;;;;;;21562:16;;;;21331:4;;21562:16;:::i;:::-;;;;-1:-1:-1;;21008:587:10;20953:642;;:::o;21895:183::-;21997:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;21961:70:10;;;;;;;8044:2:14;21961:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;21961:70:10;7842:342:14;21961:70:10;22041:28;;:20;;;;:28;;;;;22062:6;;22041:28;;;;22062:6;22041:20;:28;;;;;;;;;;;;;;;;;;;17611:656;3367:11;3400:6;3396:103;3416:11;;3412:1;:15;3396:103;;;3451:8;;;;:5;:8;;;;;;3463:10;3451:22;:8;;;:22;3448:40;;3484:4;3475:13;;3448:40;3429:3;;;;:::i;:::-;;;;3396:103;;;-1:-1:-1;3551:13:10;;;;3529:10;:36;;:58;;;3581:6;3529:58;3508:122;;;;;;;11938:2:14;3508:122:10;;;11920:21:14;11977:2;11957:18;;;11950:30;12016:18;11996;;;11989:46;12052:18;;3508:122:10;11736:340:14;3508:122:10;17694:6:::1;17704:1;17694:11:::0;17691:570:::1;;17721:15;13209:13:::0;13194:28;:12;:28;13151:78;17691:570:::1;17768:18;17789:21;17804:5;17789:14;:21::i;:::-;17768:42;;17840:11;;17827:10;:24;17824:427;;;17892:50;::::0;;;;17916:10:::1;17892:50;::::0;::::1;12835:34:14::0;17936:4:10::1;12885:18:14::0;;;12878:43;17871:18:10::1;::::0;17892:23:::1;::::0;::::1;::::0;::::1;::::0;12747:18:14;;17892:50:10::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17871:71;;17977:6;17963:10;:20;17960:277;;18007:61;::::0;;;;18034:10:::1;18007:61;::::0;::::1;13384:34:14::0;18054:4:10::1;13434:18:14::0;;;13427:43;13486:18;;;13479:34;;;18007:26:10::1;::::0;::::1;::::0;::::1;::::0;13296:18:14;;18007:61:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;18102:4:10::1;::::0;::::1;18093:13:::0;;::::1;18102:4:::0;::::1;18093:13;18090:92;;18134:25;18145:6;18153:5;18134:10;:25::i;:::-;18203:15;13209:13:::0;13194:28;:12;:28;13151:78;18203:15:::1;17853:398;17824:427;17754:507;3357:291:::0;17611:656;;:::o;5241:147:0:-;4465:7;4491:12;;;;;;;;;;:22;;;2505:16;2516:4;2505:10;:16::i;:::-;5355:26:::1;5367:4;5373:7;5355:11;:26::i;6395:113:10:-:0;6493:7;;3168:42;6439:7;6465:23;;;:9;:23;;;;6439:7;;6465:36;;:23;:27;:36::i;9313:184::-;9414:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;9378:70:10;;;;;;;8044:2:14;9378:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;9378:70:10;7842:342:14;9378:70:10;9458:24;;9485:5;9458:24;;;:15;:24;;;;;:32;;;;;;9313:184::o;8943:178::-;9035:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;8999:70:10;;;;;;;8044:2:14;8999:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;8999:70:10;7842:342:14;8999:70:10;9079:27;;9109:5;9079:27;;;:18;:27;;;;;:35;;;;;;8943:178::o;22135:314::-;22253:10;2072:4:0;3004:29;;;:12;;:29;:12;:29;;;;;22217:70:10;;;;;;;8044:2:14;22217:70:10;;;8026:21:14;8083:2;8063:18;;;8056:30;8122:20;8102:18;;;8095:48;8160:18;;22217:70:10;7842:342:14;22217:70:10;22301:30;;;;;22325:4;22301:30;;;1123:74:14;22334:6:10;;22301:15;;;;;;1096:18:14;;22301:30:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;22297:110;;;22366:30;;;;;22390:4;22366:30;;;1123:74:14;22366:15:10;;;;;;1096:18:14;;22366:30:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22357:39;;22297:110;22416:26;;;;;:14;13966:55:14;;;22416:26:10;;;13948:74:14;14038:18;;;14031:34;;;22416:14:10;;;;;13921:18:14;;22416:26:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13362:371::-;13494:19;;;13486:68;;;;;;;14278:2:14;13486:68:10;;;14260:21:14;14317:2;14297:18;;;14290:30;14356:34;14336:18;;;14329:62;14427:6;14407:18;;;14400:34;14451:19;;13486:68:10;14076:400:14;13486:68:10;13572:21;;;13564:68;;;;;;;14683:2:14;13564:68:10;;;14665:21:14;14722:2;14702:18;;;14695:30;14761:34;14741:18;;;14734:62;14832:4;14812:18;;;14805:32;14854:19;;13564:68:10;14481:398:14;13564:68:10;13643:18;;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;13694:32;;3032:25:14;;;13694:32:10;;3005:18:14;13694:32:10;;;;;;;13362:371;;;:::o;13740:1005::-;13867:18;;;13859:68;;;;;;;15086:2:14;13859:68:10;;;15068:21:14;15125:2;15105:18;;;15098:30;15164:34;15144:18;;;15137:62;15235:7;15215:18;;;15208:35;15260:19;;13859:68:10;14884:401:14;13859:68:10;13945:16;;;13937:64;;;;;;;15492:2:14;13937:64:10;;;15474:21:14;15531:2;15511:18;;;15504:30;15570:34;15550:18;;;15543:62;15641:5;15621:18;;;15614:33;15664:19;;13937:64:10;15290:399:14;13937:64:10;14028:1;14019:6;:10;14011:64;;;;;;;15896:2:14;14011:64:10;;;15878:21:14;15935:2;15915:18;;;15908:30;15974:34;15954:18;;;15947:62;16045:11;16025:18;;;16018:39;16074:19;;14011:64:10;15694:405:14;14011:64:10;14094:16;;;;;;;:12;:16;;;;;;;;14093:17;14085:26;;;;;;14132:25;14150:6;14132:17;:25::i;:::-;14129:54;;;14160:20;:18;:20::i;:::-;14293:18;;;14263:13;14293:18;;;:14;:18;;;;;;;;:52;;;;-1:-1:-1;14331:13:10;;;14315:30;;;14331:13;;14315:30;;14293:52;:80;;;;-1:-1:-1;13322:27:10;;;13299:4;13322:27;;;:18;:27;;;;;;;;14349:24;14293:80;14290:353;;;14397:26;14410:4;14416:6;14397:12;:26::i;:::-;14389:35;;;;;;-1:-1:-1;14448:1:10;14290:353;;;14469:21;;;;;;;:15;:21;;;;;;;;14466:177;;;-1:-1:-1;14516:1:10;14466:177;;;14537:19;;;;;;;:15;:19;;;;;;;;14534:109;;;14580:26;14593:4;14599:6;14580:12;:26::i;:::-;14572:35;;;;;;-1:-1:-1;14631:1:10;14534:109;14697:41;14712:4;14718:2;14722:6;14730:7;14697:14;:41::i;4959:231:9:-;5075:7;5134:12;5126:6;;;;5118:29;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;5168:5:9;;;4959:231::o;3122:96::-;3180:7;3206:5;3210:1;3206;:5;:::i;:::-;3199:12;3122:96;-1:-1:-1;;;3122:96:9:o;3334:103:0:-;3400:30;3411:4;719:10:5;3400::0;:30::i;7474:233::-;2981:4;3004:12;;;;;;;;;;;:29;;;;;;;;;;;;;7552:149;;7595:6;:12;;;;;;;;;;;:29;;;;;;;;;;:36;;;;7627:4;7595:36;;;7677:12;719:10:5;;640:96;7677:12:0;7650:40;;7668:7;7650:40;;7662:4;7650:40;;;;;;;;;;7474:233;;:::o;7878:234::-;2981:4;3004:12;;;;;;;;;;;:29;;;;;;;;;;;;;7957:149;;;8031:5;7999:12;;;;;;;;;;;:29;;;;;;;;;;;:37;;;;;;8055:40;719:10:5;;7999:12:0;;8055:40;;8031:5;8055:40;7878:234;;:::o;2755:96:9:-;2813:7;2839:5;2843:1;2839;:5;:::i;23466:301:10:-;23550:21;;;23542:65;;;;;;;16439:2:14;23542:65:10;;;16421:21:14;16478:2;16458:18;;;16451:30;16517:33;16497:18;;;16490:61;16568:18;;23542:65:10;16237:355:14;23542:65:10;23628:7;;:19;;23640:6;23628:11;:19::i;:::-;23618:7;:29;23678:18;;;;;;;:9;:18;;;;;;:30;;23701:6;23678:22;:30::i;:::-;23657:18;;;;;;;:9;:18;;;;;;:51;;;;23723:37;;23657:18;;;23723:37;;;;23753:6;3032:25:14;;3020:2;3005:18;;2886:177;23723:37:10;;;;;;;;23466:301;;:::o;24086:384::-;24171:21;;;24163:67;;;;;;;16799:2:14;24163:67:10;;;16781:21:14;16838:2;16818:18;;;16811:30;16877:34;16857:18;;;16850:62;16948:3;16928:18;;;16921:31;16969:19;;24163:67:10;16597:397:14;24163:67:10;24262:68;24285:6;24262:68;;;;;;;;;;;;;;;;;:18;;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;24241:18;;;;;;;:9;:18;;;;;:89;24351:7;;:19;;24363:6;24351:11;:19::i;:::-;24341:7;:29;24390:7;;:19;;24402:6;24390:11;:19::i;:::-;24380:7;:29;24425:37;;3032:25:14;;;24451:1:10;;24425:37;;;;;;3020:2:14;3005:18;24425:37:10;2886:177:14;22734:462:10;7323:18;;;;22878:24;7323:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;22965:17;22945:37;;22941:248;;23027:6;23007:16;:26;;22999:68;;;;;;;17201:2:14;22999:68:10;;;17183:21:14;17240:2;17220:18;;;17213:30;17279:31;17259:18;;;17252:59;17328:18;;22999:68:10;16999:353:14;22999:68:10;23111:51;23120:5;23127:7;23155:6;23136:16;:25;23111:8;:51::i;21601:241::-;21669:4;;;21714:98;21734:11;;21730:1;:15;21714:98;;;21769:8;;;;:5;:8;;;;;;:17;;;;:8;;:17;21766:35;;21797:4;21788:13;;21766:35;21747:3;;;;:::i;:::-;;;;21714:98;;;-1:-1:-1;21829:6:10;21601:241;-1:-1:-1;;21601:241:10:o;20696:251::-;20759:7;20778:13;20794:11;;20808:1;20794:15;;;;:::i;:::-;20778:31;;20823:9;20819:99;20842:11;;20838:1;:15;20819:99;;;20877:9;;;;:6;:9;;;;;;:19;;;;:9;;:19;20874:33;;20906:1;20898:9;;20874:33;20855:3;;;;:::i;:::-;;;;20819:99;;18273:397;18367:16;;;18381:1;18367:16;;;;;;;;18343:21;;18367:16;;;;;;;;;;-1:-1:-1;18367:16:10;18343:40;;18403:5;18393:4;18398:1;18393:7;;;;;;;;:::i;:::-;:15;;;;:7;;;;;;;;;:15;18428:4;;18418:7;;18428:4;;;18418;;18428;;18418:7;;;;;;:::i;:::-;:14;;;;:7;;;;;;;;;:14;18473:13;;18443:53;;;;;18473:13;;;18443:53;;;13948:74:14;14038:18;;;14031:34;;;18443:21:10;;;;;;13921:18:14;;18443:53:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;18506:13:10;;:157;;;;;:13;;;;;:38;;:157;;18558:6;;18506:13;;18593:4;;18619;;18638:15;;18506:157;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;18731:448::-;18834:11;;18797:4;;18834:11;;18820:10;:25;;;;:44;;-1:-1:-1;18858:6:10;;;;;;;18857:7;18820:44;:83;;;;-1:-1:-1;18876:8:10;:27;;;18820:83;:174;;;;-1:-1:-1;18947:31:10;;18915:29;;18982:12;;18915:63;;;:::i;:::-;:79;;18820:174;:298;;;;-1:-1:-1;19092:26:10;;19057:4;;19042:46;;;;;19082:4;19042:46;;;1123:74:14;19057:4:10;;;;;19042:31;;1096:18:14;;19042:46:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:76;;18820:298;:352;;;;-1:-1:-1;;19140:32:10;;-1:-1:-1;19130:42:10;;18731:448::o;19214:378::-;19273:26;;19263:51;;3168:42;19263:9;:51::i;:::-;19356:12;19324:29;:44;19448:26;;19412:31;;:63;;:35;:63::i;:::-;19378:31;:97;;;19522:23;;-1:-1:-1;19485:101:10;;;19548:8;:35;;;;;;19485:101;19214:378::o;14751:753::-;14841:20;;14821:4;;14841:20;;14840:21;;:54;;-1:-1:-1;14865:29:10;;;;;;;:23;:29;;;;;;;;14840:54;14837:661;;;-1:-1:-1;14917:4:10;14910:11;;14837:661;14941:20;;;;;;;:14;:20;;;;;:28;;;14972:15;-1:-1:-1;14941:73:10;;;;;15001:13;;14991:6;:23;;14941:73;14938:560;;;15030:20;;;;;;;:14;:20;;;;;15063:15;15030:48;;;;15123:24;;15141:6;15123:24;:::i;:::-;15092:20;;;;;;;:14;:20;;;;;:28;;;;:55;;;;15161:36;;:45;;;15092:28;-1:-1:-1;15220:11:10;;14938:560;15303:13;;15251:20;;;;;;;:14;:20;;;;;:36;;;:48;;15292:6;15251:40;:48::i;:::-;:65;15248:250;;15371:20;;;;;;;:14;:20;;;;;:36;;;:48;;15412:6;15371:40;:48::i;:::-;15332:20;;;;;;;:14;:20;;;;;:36;;:87;-1:-1:-1;15440:4:10;15433:11;;15248:250;-1:-1:-1;15482:5:10;15475:12;;16050:1148;16161:12;;;;;:28;;;16177:7;:12;;16188:1;16177:12;16161:28;16158:1034;;;16205:14;12758:12;12742:28;;:13;:28;12795:10;12780:25;;;12700:112;16205:14;16253:53;;;;;;;;;;;;;;;;;;;;:17;;;-1:-1:-1;16253:17:10;;;:9;:17;;;;;;;;:53;;16275:6;;16253:21;:53::i;:::-;16233:17;;;;;;;;:9;:17;;;;;;:73;;;;16343:20;;;;;;;:32;;16368:6;16343:24;:32::i;:::-;16320:20;;;;;;;;:9;:20;;;;;;;:55;;;;16395:35;;;;;;;;;;16423:6;3032:25:14;;3020:2;3005:18;;2886:177;16395:35:10;;;;;;;;16448:7;:12;;16459:1;16448:12;16445:133;;16480:15;13209:13;13194:28;:12;:28;13151:78;16480:15;16158:1034;;16445:133;16519:7;:12;;16530:1;16519:12;16516:62;;16551:12;12873:9;12858:24;:12;:24;12818:71;16158:1034;16611:7;:12;;16622:1;16611:12;16608:143;;16643:18;12957:12;12941:28;;:13;:28;12994:15;12979:30;;;12895:121;16643:18;16608:143;;;16685:7;:12;;16696:1;16685:12;16682:69;;16717:19;13085:12;13069:28;;:13;:28;13122:16;13107:31;;;13022:123;16717:19;16765:24;16792:18;16803:6;16792:10;:18::i;:::-;16765:45;;16844:53;16866:6;16844:53;;;;;;;;;;;;;;;;;:9;:17;16854:6;16844:17;;;;;;;;;;;;;;;;:21;;:53;;;;;:::i;:::-;16824:17;;;;;;;;:9;:17;;;;;;:73;;;;16959:22;;16934:20;;;;;;;;;;:48;;:24;:48::i;:::-;16911:20;;;;;;;:9;:20;;;;;:71;16996:18;17006:7;16996:9;:18::i;:::-;17051:9;17034:51;;17043:6;17034:51;;;17062:7;:22;;;17034:51;;;;3032:25:14;;3020:2;3005:18;;2886:177;17034:51:10;;;;;;;;3168:42;17104:47;;17113:6;17104:47;;;17135:7;:15;;;17104:47;;;;3032:25:14;;3020:2;3005:18;;2886:177;17104:47:10;;;;;;;;17166:15;13209:13;13194:28;:12;:28;13151:78;3718:492:0;2981:4;3004:12;;;;;;;;;;;:29;;;;;;;;;;;;;3801:403;;3989:41;4017:7;3989:41;;4027:2;3989:19;:41::i;:::-;4101:38;4129:4;4136:2;4101:19;:38::i;:::-;3896:265;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;3844:349;;;;;;;;:::i;19630:427:10:-;3293:6;:13;;;;;;;;19729:16:::1;::::0;;19743:1:::1;19729:16:::0;;;;;::::1;::::0;;-1:-1:-1;;19729:16:10::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;19765:4:10::1;::::0;19755:7;;;;-1:-1:-1;19765:4:10::1;;::::0;19755:7;;-1:-1:-1;19765:4:10::1;::::0;19755:7:::1;;;;:::i;:::-;;;;;;:14;;;;;;;;;::::0;::::1;19797:4;19779;19784:1;19779:7;;;;;;;;:::i;:::-;:23;::::0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;19820:4:::1;::::0;19842:13:::1;::::0;19813:52:::1;::::0;;;;19842:13;;::::1;19813:52;::::0;::::1;13948:74:14::0;14038:18;;;14031:34;;;19820:4:10;::::1;::::0;19813:20:::1;::::0;13921:18:14;;19813:52:10::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;19875:13:10::1;::::0;:175:::1;::::0;;;;:13:::1;::::0;;::::1;::::0;:67:::1;::::0;:175:::1;::::0;19956:6;;19875:13:::1;::::0;19991:4;;20009:2;;20025:15:::1;::::0;19875:175:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;3311:6:10;:14;;;;;;-1:-1:-1;;;;;19630:427:10:o;12193:305::-;-1:-1:-1;;;;;;;;;;;;;;;;;12280:23:10;12306:100;;;;;;;;12329:7;12306:100;;;;12350:46;12363:7;12372:12;:23;;;12350:12;:46::i;:::-;12306:100;;12453:14;;;;12280:126;;-1:-1:-1;12441:27:10;;:7;;:11;:27::i;:::-;12417:51;;:6;12193:305;-1:-1:-1;;12193:305:10:o;17204:107::-;17266:38;17275:6;:14;;;3168:42;17266:8;:38::i;1652:441:6:-;1727:13;1752:19;1784:10;1788:6;1784:1;:10;:::i;:::-;:14;;1797:1;1784:14;:::i;:::-;1774:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1774:25:6;;1752:47;;1809:15;:6;1816:1;1809:9;;;;;;;;:::i;:::-;;;;:15;;;;;;;;;;;1834;:6;1841:1;1834:9;;;;;;;;:::i;:::-;;;;:15;;;;;;;;;;-1:-1:-1;1864:9:6;1876:10;1880:6;1876:1;:10;:::i;:::-;:14;;1889:1;1876:14;:::i;:::-;1864:26;;1859:132;1896:1;1892;:5;1859:132;;;1930:12;1943:5;1951:3;1943:11;1930:25;;;;;;;:::i;:::-;;;;1918:6;1925:1;1918:9;;;;;;;;:::i;:::-;;;;:37;;;;;;;;;;-1:-1:-1;1979:1:6;1969:11;;;;;1899:3;;;:::i;:::-;;;1859:132;;;-1:-1:-1;2008:10:6;;2000:55;;;;;;;21388:2:14;2000:55:6;;;21370:21:14;;;21407:18;;;21400:30;21466:34;21446:18;;;21439:62;21518:18;;2000:55:6;21186:356:14;12504:190:10;12579:7;12601:4;12609:1;12601:9;12598:22;;-1:-1:-1;12619:1:10;12612:8;;12598:22;12637:50;12672:5;12637:17;:7;12649:4;12637:11;:17::i;:::-;:21;;:50::i;17317:221::-;17392:23;;;17389:35;;17317:221;;:::o;17389:35::-;17436:7;17447:1;17436:12;17433:24;;17317:221;;:::o;17433:24::-;17512:4;17494:24;;;;:9;:24;;;;;;:37;;17523:7;17494:28;:37::i;:::-;17485:4;17467:24;;;;:9;:24;;;;;:64;-1:-1:-1;;17317:221:10:o;3465:96:9:-;3523:7;3549:5;3553:1;3549;:5;:::i;3850:96::-;3908:7;3934:5;3938:1;3934;:5;:::i;14:332:14:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;180:9;167:23;230:66;223:5;219:78;212:5;209:89;199:117;;312:1;309;302:12;543:154;629:42;622:5;618:54;611:5;608:65;598:93;;687:1;684;677:12;702:247;761:6;814:2;802:9;793:7;789:23;785:32;782:52;;;830:1;827;820:12;782:52;869:9;856:23;888:31;913:5;888:31;:::i;1208:250::-;1293:1;1303:113;1317:6;1314:1;1311:13;1303:113;;;1393:11;;;1387:18;1374:11;;;1367:39;1339:2;1332:10;1303:113;;;-1:-1:-1;;1450:1:14;1432:16;;1425:27;1208:250::o;1463:455::-;1612:2;1601:9;1594:21;1575:4;1644:6;1638:13;1687:6;1682:2;1671:9;1667:18;1660:34;1703:79;1775:6;1770:2;1759:9;1755:18;1750:2;1742:6;1738:15;1703:79;:::i;:::-;1834:2;1822:15;1839:66;1818:88;1803:104;;;;1909:2;1799:113;;1463:455;-1:-1:-1;;1463:455:14:o;1923:315::-;1991:6;1999;2052:2;2040:9;2031:7;2027:23;2023:32;2020:52;;;2068:1;2065;2058:12;2020:52;2107:9;2094:23;2126:31;2151:5;2126:31;:::i;:::-;2176:5;2228:2;2213:18;;;;2200:32;;-1:-1:-1;;;1923:315:14:o;2243:118::-;2329:5;2322:13;2315:21;2308:5;2305:32;2295:60;;2351:1;2348;2341:12;2366:515;2458:6;2466;2474;2482;2490;2543:3;2531:9;2522:7;2518:23;2514:33;2511:53;;;2560:1;2557;2550:12;2511:53;2599:9;2586:23;2618:28;2640:5;2618:28;:::i;:::-;2665:5;2717:2;2702:18;;2689:32;;-1:-1:-1;2768:2:14;2753:18;;2740:32;;2819:2;2804:18;;2791:32;;-1:-1:-1;2870:3:14;2855:19;2842:33;;-1:-1:-1;2366:515:14;-1:-1:-1;;;2366:515:14:o;3250:456::-;3327:6;3335;3343;3396:2;3384:9;3375:7;3371:23;3367:32;3364:52;;;3412:1;3409;3402:12;3364:52;3451:9;3438:23;3470:31;3495:5;3470:31;:::i;:::-;3520:5;-1:-1:-1;3577:2:14;3562:18;;3549:32;3590:33;3549:32;3590:33;:::i;:::-;3250:456;;3642:7;;-1:-1:-1;;;3696:2:14;3681:18;;;;3668:32;;3250:456::o;3711:180::-;3770:6;3823:2;3811:9;3802:7;3798:23;3794:32;3791:52;;;3839:1;3836;3829:12;3791:52;-1:-1:-1;3862:23:14;;3711:180;-1:-1:-1;3711:180:14:o;4518:315::-;4586:6;4594;4647:2;4635:9;4626:7;4622:23;4618:32;4615:52;;;4663:1;4660;4653:12;4615:52;4699:9;4686:23;4676:33;;4759:2;4748:9;4744:18;4731:32;4772:31;4797:5;4772:31;:::i;:::-;4822:5;4812:15;;;4518:315;;;;;:::o;5027:382::-;5092:6;5100;5153:2;5141:9;5132:7;5128:23;5124:32;5121:52;;;5169:1;5166;5159:12;5121:52;5208:9;5195:23;5227:31;5252:5;5227:31;:::i;:::-;5277:5;-1:-1:-1;5334:2:14;5319:18;;5306:32;5347:30;5306:32;5347:30;:::i;5414:388::-;5482:6;5490;5543:2;5531:9;5522:7;5518:23;5514:32;5511:52;;;5559:1;5556;5549:12;5511:52;5598:9;5585:23;5617:31;5642:5;5617:31;:::i;:::-;5667:5;-1:-1:-1;5724:2:14;5709:18;;5696:32;5737:33;5696:32;5737:33;:::i;5992:241::-;6048:6;6101:2;6089:9;6080:7;6076:23;6072:32;6069:52;;;6117:1;6114;6107:12;6069:52;6156:9;6143:23;6175:28;6197:5;6175:28;:::i;6238:248::-;6306:6;6314;6367:2;6355:9;6346:7;6342:23;6338:32;6335:52;;;6383:1;6380;6373:12;6335:52;-1:-1:-1;;6406:23:14;;;6476:2;6461:18;;;6448:32;;-1:-1:-1;6238:248:14:o;7366:471::-;7458:6;7466;7474;7527:2;7515:9;7506:7;7502:23;7498:32;7495:52;;;7543:1;7540;7533:12;7495:52;7582:9;7569:23;7601:31;7626:5;7601:31;:::i;:::-;7651:5;-1:-1:-1;7703:2:14;7688:18;;7675:32;;-1:-1:-1;7759:2:14;7744:18;;7731:32;7772:33;7731:32;7772:33;:::i;:::-;7824:7;7814:17;;;7366:471;;;;;:::o;10213:251::-;10283:6;10336:2;10324:9;10315:7;10311:23;10307:32;10304:52;;;10352:1;10349;10342:12;10304:52;10384:9;10378:16;10403:31;10428:5;10403:31;:::i;12081:184::-;12133:77;12130:1;12123:88;12230:4;12227:1;12220:15;12254:4;12251:1;12244:15;12270:125;12335:9;;;12356:10;;;12353:36;;;12369:18;;:::i;12400:195::-;12439:3;12470:66;12463:5;12460:77;12457:103;;12540:18;;:::i;:::-;-1:-1:-1;12587:1:14;12576:13;;12400:195::o;12932:184::-;13002:6;13055:2;13043:9;13034:7;13030:23;13026:32;13023:52;;;13071:1;13068;13061:12;13023:52;-1:-1:-1;13094:16:14;;12932:184;-1:-1:-1;12932:184:14:o;13524:245::-;13591:6;13644:2;13632:9;13623:7;13619:23;13615:32;13612:52;;;13660:1;13657;13650:12;13612:52;13692:9;13686:16;13711:28;13733:5;13711:28;:::i;16104:128::-;16171:9;;;16192:11;;;16189:37;;;16206:18;;:::i;17357:184::-;17409:77;17406:1;17399:88;17506:4;17503:1;17496:15;17530:4;17527:1;17520:15;17546:184;17598:77;17595:1;17588:88;17695:4;17692:1;17685:15;17719:4;17716:1;17709:15;17735:1026;17997:4;18045:3;18034:9;18030:19;18076:6;18065:9;18058:25;18102:2;18140:6;18135:2;18124:9;18120:18;18113:34;18183:3;18178:2;18167:9;18163:18;18156:31;18207:6;18242;18236:13;18273:6;18265;18258:22;18311:3;18300:9;18296:19;18289:26;;18350:2;18342:6;18338:15;18324:29;;18371:1;18381:218;18395:6;18392:1;18389:13;18381:218;;;18460:13;;18475:42;18456:62;18444:75;;18574:15;;;;18539:12;;;;18417:1;18410:9;18381:218;;;-1:-1:-1;;18667:42:14;18655:55;;;;18650:2;18635:18;;18628:83;-1:-1:-1;;;18742:3:14;18727:19;18720:35;18616:3;17735:1026;-1:-1:-1;;;17735:1026:14:o;18766:1164::-;18861:6;18892:2;18935;18923:9;18914:7;18910:23;18906:32;18903:52;;;18951:1;18948;18941:12;18903:52;18984:9;18978:16;19013:18;19054:2;19046:6;19043:14;19040:34;;;19070:1;19067;19060:12;19040:34;19108:6;19097:9;19093:22;19083:32;;19153:7;19146:4;19142:2;19138:13;19134:27;19124:55;;19175:1;19172;19165:12;19124:55;19204:2;19198:9;19226:2;19222;19219:10;19216:36;;;19232:18;;:::i;:::-;19278:2;19275:1;19271:10;19310:2;19304:9;19369:66;19364:2;19360;19356:11;19352:84;19344:6;19340:97;19487:6;19475:10;19472:22;19467:2;19455:10;19452:18;19449:46;19446:72;;;19498:18;;:::i;:::-;19534:2;19527:22;19584:18;;;19618:15;;;;-1:-1:-1;19660:11:14;;;19656:20;;;19688:19;;;19685:39;;;19720:1;19717;19710:12;19685:39;19744:11;;;;19764:135;19780:6;19775:3;19772:15;19764:135;;;19846:10;;19834:23;;19797:12;;;;19877;;;;19764:135;;;19918:6;18766:1164;-1:-1:-1;;;;;;;;18766:1164:14:o;19935:812::-;20346:25;20341:3;20334:38;20316:3;20401:6;20395:13;20417:75;20485:6;20480:2;20475:3;20471:12;20464:4;20456:6;20452:17;20417:75;:::i;:::-;20556:19;20551:2;20511:16;;;20543:11;;;20536:40;20601:13;;20623:76;20601:13;20685:2;20677:11;;20670:4;20658:17;;20623:76;:::i;:::-;20719:17;20738:2;20715:26;;19935:812;-1:-1:-1;;;;19935:812:14:o;20752:228::-;20792:7;20918:1;20850:66;20846:74;20843:1;20840:81;20835:1;20828:9;20821:17;20817:105;20814:131;;;20925:18;;:::i;:::-;-1:-1:-1;20965:9:14;;20752:228::o;20985:196::-;21024:3;21052:5;21042:39;;21061:18;;:::i;:::-;-1:-1:-1;21108:66:14;21097:78;;20985:196::o;21547:274::-;21587:1;21613;21603:189;;21648:77;21645:1;21638:88;21749:4;21746:1;21739:15;21777:4;21774:1;21767:15;21603:189;-1:-1:-1;21806:9:14;;21547:274::o

Swarm Source

ipfs://33e69f83cb8fd558240d572ff026044f4f41f985fe6f19d63b4775ebcc42eee7
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.