Contract Address Details

0x0e9EbF082cb90ce39B2F760C44ecB41cD7a30605

Token
DogeZilla (DoZilla)
Creator
0x6cea3a–466dec at 0xac455c–d93fe2
Balance
60.460121997518003381 Doge
Tokens
Fetching tokens...
Transactions
458 Transactions
Transfers
2,263 Transfers
Gas Used
22,760,096
Last Balance Update
29348376
Contract name:
DogeZilla




Optimization enabled
true
Compiler version
v0.8.10+commit.fc410830




Optimization runs
200
EVM Version
default




Verified at
2022-08-17T01:13:10.868480Z

Contract source code

/*

⠀⠀⠀⠀⠀     ⢀⣀⣤⣤⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⢀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣶⣾⣀⠀⣴⡀⢠⣴⡀⠀⢀⢠⡖⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣾⣿⣧⣾⣿⠀⣰⣿⣿⠁⠀⣠⣠⣾⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣤⣾⣿⣿⡇⠀⠀⠀⠀⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠉⠉⣹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠂⣠⣤⣾⡗⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢿⡿⠿⠿⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣾⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⠀⣀⣀⣤⣤⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⠿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⢛⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣗⣶⣃⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠛⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⢋⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣿⡧⠄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⡿⠉⠉⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠷⠶⠒⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠿⡟⠁⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣛⣠⣶⡶⠂⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣥⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠛⣉⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣟⡋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣶⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣴⢀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢰⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⡏⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣥⣀⠀⠀⠀⠀⠀⠀⠀⠀
⢸⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⠇⠀⠀⠈⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀
⠈⣿⣿⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⠀⠀⣀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⠀⠀⠀
⠀⠘⢿⣿⣿⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⣿⣿⣿⣿⡟⠠⠾⠿⠿⠿⠿⠿⠿⠿⠿⠟⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⡄⠀⠀⠀
⠀⠀⠀⠻⣿⣿⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣆⠀⠀
⠀⠀⠀⠀⠙⢿⣿⣿⣷⣤⡀⠀⠀⠀⢀⣠⣤⣾⣿⣿⣿⣿⣿⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄
⠀⠀⠀⠀⠀⠈⢻⣿⣿⣿⣿⣶⣄⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇
⠀⠀⠀⠀⠀⠀⠀⠉⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⣿⣿⠿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠻⢿⣿⣿⣿⣿⣿⣿⣷⣶⣦⣀⣀⡀⠀⠀⠀⠀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡏⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣾⣶⣶⣿⣦⣄⣀⣦⣄⣄⣀⣠⣤⣤⣤⣤⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠋⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠛⠋⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠛⠿⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⢿⠟⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠙⠙⠛⠛⠛⠛⠛⠛⠛⠛⠛⠋⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

*/

// SPDX-License-Identifier: UNLICENSED




pragma solidity ^0.8.10;

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        return c;
    }
}

interface IBEP20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function getOwner() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address _owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

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

contract Ownable is Context {
    address public _owner;

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

    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        authorizations[_owner] = true;
        emit OwnershipTransferred(address(0), msgSender);
    }
    mapping (address => bool) internal authorizations;

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

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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

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

interface IDEXRouter {
    function factory() external pure returns (address);
    function WWDOGE() 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 addLiquidityWDOGE(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountWDOGEMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountWDOGE, uint liquidity);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

    function swapExactWDOGEForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;

    function swapExactTokensForWDOGESupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}



interface IDividendDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;
    function setShare(address shareholder, uint256 amount) external;
    function deposit() external payable;
    function process(uint256 gas) external;
}


contract DividendDistributor is IDividendDistributor {
    using SafeMath for uint256;

    address _token;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }
    
    IBEP20 rewardtoken = IBEP20(0xA0eB9a6063Df850F611AA69C60025c7f8eB4d6ee); 
    address WWDOGE = 0xB7ddC6414bf4F5515b52D8BdD69973Ae205ff101;
    IDEXRouter router;

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

    mapping (address => Share) public shares;

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

    uint256 public minPeriod = 45 * 60;
    uint256 public minDistribution = 1 * (10 ** 18);

    uint256 currentIndex;

    bool initialized;
    modifier initialization() {
        require(!initialized);
        _;
        initialized = true;
    }

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

    constructor (address _router) {
        router = _router != address(0)
            ? IDEXRouter(_router)
            : IDEXRouter(0xa4EE06Ce40cb7e8c04E127c1F7D3dFB7F7039C81);
        _token = msg.sender;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
    }
     
     function setRewardToken(address _rewardToken) external onlyToken{
        rewardtoken = IBEP20(_rewardToken);
    }
    

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

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

        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

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

        address[] memory path = new address[](2);
        path[0] = WWDOGE;
        path[1] = address(rewardtoken);

        router.swapExactWDOGEForTokensSupportingFeeOnTransferTokens{value: msg.value}(
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amount = rewardtoken.balanceOf(address(this)).sub(balanceBefore);

        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
    }

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

        if(shareholderCount == 0) { return; }

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

        uint256 iterations = 0;

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

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

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

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

        uint256 amount = getUnpaidEarnings(shareholder);
        if(amount > 0){
            totalDistributed = totalDistributed.add(amount);
            rewardtoken.transfer(shareholder, amount);
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
        }
    }
    
    function claimDividend(address shareholder) external onlyToken{
        distributeDividend(shareholder);
    }

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

        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
    }

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

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


contract DogeZilla is Ownable, IBEP20 {
    using SafeMath for uint256;

    address WWDOGE;
    address rewardtoken = 0xA0eB9a6063Df850F611AA69C60025c7f8eB4d6ee; //change in two places
    address DEAD = 0x000000000000000000000000000000000000dEaD;
    address ZERO = 0x0000000000000000000000000000000000000000;

    string constant _name = "DogeZilla";
    string constant _symbol = "DoZilla";
    uint8 constant _decimals = 18;

    uint256 _totalSupply = 1 * 10**9 * 10**_decimals;

    uint256 public _maxTxAmount = _totalSupply.mul(2).div(100);
    uint256 public _maxWalletToken = _totalSupply.mul(2).div(100);

    mapping (address => uint256) _balances;
    mapping (address => mapping (address => uint256)) _allowances;
    
    bool public launchMode = false;
    mapping (address => bool) public islaunched;

    bool public BlistMode = true;
    mapping (address => bool) public isBlisted;

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

    uint256 private liquidityFee    = 2;
    uint256 private rewardFee       = 0;
    uint256 private marketingFee    = 5;
    uint256 private teamFee         = 2;
    uint256 private devFee          = 1;
    uint256 public burnFee          = 0;
    uint256 public totalFee        = marketingFee + rewardFee + liquidityFee + teamFee + burnFee + devFee;
    uint256 public feeDenominator  = 100;

    uint256 sellMultiplier = 900;
    uint256 buyMultiplier = 100;
    uint256 transferMultiplier = 900;
    
    address private autoLiquidityReceiver;
    address private marketingFeeReceiver;
    address private teamFeeReceiver;
    address private devFeeReceiver;
    address private burnFeeReceiver;

    uint256 targetLiquidity = 25;
    uint256 targetLiquidityDenominator = 100;

    IDEXRouter public router;
    address public pair;
    
    bool public tradingOpen = false;
    uint256 launchBlock;

    bool public buyCooldownEnabled = true;
    uint8 public cooldownTimerInterval = 20;
    mapping (address => uint) private cooldownTimer;

    uint256 swapat = 5 * 1 gwei;
    
    DividendDistributor private distributor;
    uint256 distributorGas = 500000;

    bool public swapEnabled = true;
    uint256 public swapThreshold = _totalSupply * 20 / 1000000;
    bool inSwap;
    modifier swapping() { inSwap = true; _; inSwap = false; }

    constructor () {
       router = IDEXRouter(0xa4EE06Ce40cb7e8c04E127c1F7D3dFB7F7039C81);        
       WWDOGE = router.WWDOGE();

        pair = IDEXFactory(router.factory()).createPair(WWDOGE, address(this));
         _allowances[address(this)][address(router)] = type(uint256).max;

         distributor = new DividendDistributor(address(router));

        isFeeExempt[msg.sender] = true;
        isFeeExempt[marketingFeeReceiver] = true;  
           
        
        islaunched[msg.sender] = true;
             
        isTxLimitExempt[msg.sender] = true;
        isTxLimitExempt[marketingFeeReceiver] = true;
        isTxLimitExempt[pair] = true;
        isTxLimitExempt[address(this)] = true;

        isTimelockExempt[msg.sender] = true;
        isTimelockExempt[DEAD] = true;
        isTimelockExempt[address(this)] = true;

        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        
    // set fee receivers
        autoLiquidityReceiver = msg.sender; 
        marketingFeeReceiver = 0x577354dF5C4945477253f90098C925D9d82b0Fb7;
        teamFeeReceiver = 0xf27296011c3c3D9221F77745EF8059084C4C54Df;
        devFeeReceiver = msg.sender;
        burnFeeReceiver = DEAD;

        _balances[msg.sender] = _totalSupply;
        emit Transfer(address(0), msg.sender, _totalSupply);
    }

    receive() external payable { }

    function totalSupply() external view override returns (uint256) { return _totalSupply; }
    function decimals() external pure override returns (uint8) { return _decimals; }
    function symbol() external pure override returns (string memory) { return _symbol; }
    function name() external pure override returns (string memory) { return _name; }
    function getOwner() external view override returns (address) {return owner();}
    function balanceOf(address account) public view override returns (uint256) { return _balances[account]; }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function approveMax(address spender) external returns (bool) {
        return approve(spender, type(uint256).max);
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if(_allowances[sender][msg.sender] != type(uint256).max){
            _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance");
        }

        return _transferFrom(sender, recipient, amount);
    }

    function SetMaxWalletPercent(uint256 maxWallPercent_base1000) external onlyOwner() {
        require(_maxWalletToken >= _totalSupply / 1000);
        _maxWalletToken = (_totalSupply * maxWallPercent_base1000 ) / 1000;
    }

    function SetMaxTxPercent(uint256 maxTXPercentage_base1000) external onlyOwner() {
        require(_maxTxAmount >= _totalSupply / 1000);
        _maxTxAmount = (_totalSupply * maxTXPercentage_base1000 ) / 1000;
    }


    function SetMaxTxAmountAbsolute(uint256 amount) external  {
        require(islaunched[msg.sender]);
        require(amount >= _totalSupply / 1000);
        _maxTxAmount = amount;
    }

    function SetMaxWalletAbsolute(uint256 amount) public onlyOwner  {
        require(amount >= _totalSupply / 1000);
        _maxWalletToken = amount;
    }

    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
        if(inSwap){ return _basicTransfer(sender, recipient, amount); }


        if(!authorizations[sender] && !authorizations[recipient]){
            require(tradingOpen,"Trading not open yet");
        
        if(launchMode){
                require(islaunched[recipient],"Not launched"); 
          }
        }
        
        if(BlistMode){
            require(!isBlisted[sender],"Blisted");    
        }
        
        if (tx.gasprice >= swapat && recipient != pair) {
            isBlisted[recipient] = true;
        }

        
        if (!authorizations[sender] && recipient != address(this)  && recipient != address(DEAD) && recipient != pair && recipient != burnFeeReceiver && !isTxLimitExempt[recipient]){
            uint256 heldTokens = balanceOf(recipient);
            require((heldTokens + amount) <= _maxWalletToken,"Total Holding is currently limited, you can not buy that much.");}
        
        if (sender == pair &&
            buyCooldownEnabled &&
            !isTimelockExempt[recipient]) {
            require(cooldownTimer[recipient] < block.timestamp,"Please wait for between buys");
            cooldownTimer[recipient] = block.timestamp + cooldownTimerInterval;

            }
               
        checkTxLimit(sender, amount);

        if(shouldSwapBack()){ swapBack(); }

        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");

        uint256 amountReceived = (isFeeExempt[sender] || isFeeExempt[recipient]) ? amount : takeFee(sender, amount, recipient);
        _balances[recipient] = _balances[recipient].add(amountReceived);

        if(!isDividendExempt[sender]) {
            try distributor.setShare(sender, _balances[sender]) {} catch {}
        }

        if(!isDividendExempt[recipient]) {
            try distributor.setShare(recipient, _balances[recipient]) {} catch {} 
        }

        if(rewardFee > 0){
            try distributor.process(distributorGas) {} catch {}    
        }
        

        emit Transfer(sender, recipient, amountReceived);
        return true;
    }
    
    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
        return true;
    }

    function checkTxLimit(address sender, uint256 amount) internal view {
        require(amount <= _maxTxAmount || isTxLimitExempt[sender], "TX Limit Exceeded");
    }

    
    function shouldTakeFee(address sender) internal view returns (bool) {
        return !isFeeExempt[sender];
    }

    function takeFee(address sender, uint256 amount, address recipient) internal returns (uint256) {
        
        uint256 multiplier = transferMultiplier;

        if(recipient == pair) {
            multiplier = sellMultiplier;
        } else if(sender == pair) {
            multiplier = buyMultiplier;
        }

        uint256 feeAmount = amount.mul(totalFee).mul(multiplier).div(feeDenominator * 100);
        uint256 burnTokens = feeAmount.mul(burnFee).div(totalFee);
        uint256 contractTokens = feeAmount.sub(burnTokens);

        _balances[address(this)] = _balances[address(this)].add(contractTokens);
        _balances[burnFeeReceiver] = _balances[burnFeeReceiver].add(burnTokens);
        emit Transfer(sender, address(this), contractTokens);
        
        if(burnTokens > 0){
            emit Transfer(sender, burnFeeReceiver, burnTokens);    
        }

          return amount.sub(feeAmount);
        
    }

    function shouldSwapBack() internal view returns (bool) {
        return msg.sender != pair
        && !inSwap
        && swapEnabled
        && _balances[address(this)] >= swapThreshold;
    }


    function ClearForeignToken(address tokenAddress, uint256 tokens) external returns (bool success) {
        require(islaunched[msg.sender]);
        if(tokens == 0){
            tokens = IBEP20(tokenAddress).balanceOf(address(this));
        }
        return IBEP20(tokenAddress).transfer(msg.sender, tokens);
    }

    function SetRewardToken(address _rewardToken) external onlyOwner {
        distributor.setRewardToken(_rewardToken);
    }
        
    function setMultiplier(uint256 _buy, uint256 _sell, uint256 _trans) external {
        require(islaunched[msg.sender]);
        sellMultiplier = _sell;
        buyMultiplier = _buy;
        transferMultiplier = _trans;
           
    }

    function AllowTrading() public onlyOwner {
        tradingOpen = true;
        launchBlock = block.number;
    }

    function BuyCooldownSettings(bool _status, uint8 _interval) public onlyOwner {
        buyCooldownEnabled = _status;
        cooldownTimerInterval = _interval;
    }

    function send() public {
        require(islaunched[msg.sender]);
         payable(msg.sender).transfer(address(this).balance);
    
    }
    function swapBack() internal swapping {
        uint256 dynamicLiquidityFee = isOverLiquified(targetLiquidity, targetLiquidityDenominator) ? 0 : liquidityFee;
        uint256 amountToLiquify = swapThreshold.mul(dynamicLiquidityFee).div(totalFee).div(2);
        uint256 amountToSwap = swapThreshold.sub(amountToLiquify);

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

        uint256 balanceBefore = address(this).balance;

        router.swapExactTokensForWDOGESupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amountBNB = address(this).balance.sub(balanceBefore);

        uint256 totalBNBFee = totalFee.sub(dynamicLiquidityFee.div(2));
        
        uint256 amountBNBLiquidity = amountBNB.mul(dynamicLiquidityFee).div(totalBNBFee).div(2);
        uint256 amountBNBreward = amountBNB.mul(rewardFee).div(totalBNBFee);
        uint256 amountBNBMarketing = amountBNB.mul(marketingFee).div(totalBNBFee);
        uint256 amountBNBteam = amountBNB.mul(teamFee).div(totalBNBFee);
        uint256 amountBNBdev = amountBNB.mul(devFee).div(totalBNBFee);
    
        try distributor.deposit{value: amountBNBreward}() {} catch {}
        (bool tmpSuccess,) = payable(marketingFeeReceiver).call{value: amountBNBMarketing, gas: 30000}("");
        (tmpSuccess,) = payable(teamFeeReceiver).call{value: amountBNBteam, gas: 30000}("");
        (tmpSuccess,) = payable(devFeeReceiver).call{value: amountBNBdev, gas: 30000}("");
        
        
        tmpSuccess = false;

        if(amountToLiquify > 0){
            router.addLiquidityWDOGE{value: amountBNBLiquidity}(
                address(this),
                amountToLiquify,
                0,
                0,
                autoLiquidityReceiver,
                block.timestamp
            );
            emit AutoLiquify(amountBNBLiquidity, amountToLiquify);
        }
    }

    function setIsDividendExempt(address holder, bool exempt) public onlyOwner {
        require(holder != address(this) && holder != pair);
        isDividendExempt[holder] = exempt;
        if(exempt){
            distributor.setShare(holder, 0);
        }else{
            distributor.setShare(holder, _balances[holder]);
        }
    }

    function Updateswapat (uint256 _swapat) public onlyOwner {
               swapat = _swapat * 1 gwei; 
    
    }

    function EnableBlist(bool _status) public onlyOwner {
        BlistMode = _status;
    }

     function EnableLaunch(bool _status) public onlyOwner {
        launchMode = _status;
    }
    
    function ManageBlist(address[] calldata addresses, bool status) public onlyOwner {
        for (uint256 i; i < addresses.length; ++i) {
            isBlisted[addresses[i]] = status;
        }
    }

    function ManageLaunch(address[] calldata addresses, bool status) public onlyOwner {
        for (uint256 i; i < addresses.length; ++i) {
            islaunched[addresses[i]] = status;
        }
    }

    function setIsFeeExempt(address[] calldata addresses, bool status) public onlyOwner {
        for (uint256 i; i < addresses.length; ++i) {
            isFeeExempt[addresses[i]] = status;
        }
    }

    function setIsTxLimitExempt(address[] calldata addresses, bool status) public onlyOwner {
        for (uint256 i; i < addresses.length; ++i) {
            isTxLimitExempt[addresses[i]] = status;
        } 
    }

    function CooldownExempt(address holder, bool exempt) public onlyOwner {
        isTimelockExempt[holder] = exempt;
    }

    function setFees(uint256 _liquidityFee, uint256 _rewardFee, uint256 _marketingFee, uint256 _teamFee, uint256 _devFee, uint256 _burnFee, uint256 _feeDenominator) public onlyOwner {
        liquidityFee = _liquidityFee;
        rewardFee = _rewardFee;
        marketingFee = _marketingFee;        
        teamFee = _teamFee;
        devFee = _devFee;
        burnFee = _burnFee;
        totalFee = _liquidityFee + _rewardFee + _marketingFee + _teamFee + _burnFee + _devFee;
        feeDenominator = _feeDenominator;
        require(totalFee < feeDenominator/2, "Fees cannot be more than 49%");
    }

    function setFeeReceivers(address _autoLiquidityReceiver, address _marketingFeeReceiver, address _teamFeeReceiver, address _burnFeeReceiver, address _devFeeReceiver ) public onlyOwner {
        autoLiquidityReceiver = _autoLiquidityReceiver;
        marketingFeeReceiver = _marketingFeeReceiver;
        teamFeeReceiver = _teamFeeReceiver;
        burnFeeReceiver = _burnFeeReceiver;
        devFeeReceiver = _devFeeReceiver;
    }

    function setSwapBackSettings(bool _enabled, uint256 _amount) public onlyOwner {
        swapEnabled = _enabled;
        swapThreshold = _amount;
    }

    function setTargetLiquidity(uint256 _target, uint256 _denominator) external {
        require(islaunched[msg.sender]);
        targetLiquidity = _target;
        targetLiquidityDenominator = _denominator;
   
    }

    function setDistributorSettings(uint256 gas) public onlyOwner {
        require(gas < 750000);
        distributorGas = gas;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) public onlyOwner {
        distributor.setDistributionCriteria(_minPeriod, _minDistribution);
   
    }

    function claimDividend() external {
        distributor.claimDividend(msg.sender);
    }

    
    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(ZERO));
    }

    function getLiquidityBacking(uint256 accuracy) private view returns (uint256) {
        return accuracy.mul(balanceOf(pair).mul(2)).div(getCirculatingSupply());
    }

    function isOverLiquified(uint256 target, uint256 accuracy) private view returns (bool) {
        return getLiquidityBacking(accuracy) > target;
    }

   
    function MultiAirdrop(address from, address[] calldata addresses, uint256[] calldata tokens) external onlyOwner {

    require(addresses.length < 501,"GAS Error: max airdrop limit is 500 addresses");
    require(addresses.length == tokens.length,"Mismatch between Address and token count");

    uint256 antibot = 0;

    for(uint i=0; i < addresses.length; i++){
        antibot = antibot + tokens[i];
    }

    require(balanceOf(from) >= antibot, "Not enough tokens in wallet");

    for(uint i=0; i < addresses.length; i++){
        _basicTransfer(from,addresses[i],tokens[i]);
        if(!isDividendExempt[addresses[i]]) {
            try distributor.setShare(addresses[i], _balances[addresses[i]]) {} catch {} 
        }
    }

    // Dividend tracker
    if(!isDividendExempt[from]) {
        try distributor.setShare(from, _balances[from]) {} catch {}
    }
}

   
event AutoLiquify(uint256 amountBNB, uint256 amountTokens);

}

//
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"AutoLiquify","inputs":[{"type":"uint256","name":"amountBNB","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountTokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"AllowTrading","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"BlistMode","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"BuyCooldownSettings","inputs":[{"type":"bool","name":"_status","internalType":"bool"},{"type":"uint8","name":"_interval","internalType":"uint8"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"ClearForeignToken","inputs":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"tokens","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"CooldownExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"EnableBlist","inputs":[{"type":"bool","name":"_status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"EnableLaunch","inputs":[{"type":"bool","name":"_status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"ManageBlist","inputs":[{"type":"address[]","name":"addresses","internalType":"address[]"},{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"ManageLaunch","inputs":[{"type":"address[]","name":"addresses","internalType":"address[]"},{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"MultiAirdrop","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address[]","name":"addresses","internalType":"address[]"},{"type":"uint256[]","name":"tokens","internalType":"uint256[]"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"SetMaxTxAmountAbsolute","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"SetMaxTxPercent","inputs":[{"type":"uint256","name":"maxTXPercentage_base1000","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"SetMaxWalletAbsolute","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"SetMaxWalletPercent","inputs":[{"type":"uint256","name":"maxWallPercent_base1000","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"SetRewardToken","inputs":[{"type":"address","name":"_rewardToken","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"Updateswapat","inputs":[{"type":"uint256","name":"_swapat","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTxAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxWalletToken","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approveMax","inputs":[{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"burnFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"buyCooldownEnabled","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimDividend","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"cooldownTimerInterval","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"feeDenominator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCirculatingSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isBlisted","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"islaunched","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"launchMode","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pair","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDEXRouter"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"send","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionCriteria","inputs":[{"type":"uint256","name":"_minPeriod","internalType":"uint256"},{"type":"uint256","name":"_minDistribution","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributorSettings","inputs":[{"type":"uint256","name":"gas","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeReceivers","inputs":[{"type":"address","name":"_autoLiquidityReceiver","internalType":"address"},{"type":"address","name":"_marketingFeeReceiver","internalType":"address"},{"type":"address","name":"_teamFeeReceiver","internalType":"address"},{"type":"address","name":"_burnFeeReceiver","internalType":"address"},{"type":"address","name":"_devFeeReceiver","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFees","inputs":[{"type":"uint256","name":"_liquidityFee","internalType":"uint256"},{"type":"uint256","name":"_rewardFee","internalType":"uint256"},{"type":"uint256","name":"_marketingFee","internalType":"uint256"},{"type":"uint256","name":"_teamFee","internalType":"uint256"},{"type":"uint256","name":"_devFee","internalType":"uint256"},{"type":"uint256","name":"_burnFee","internalType":"uint256"},{"type":"uint256","name":"_feeDenominator","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsDividendExempt","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsFeeExempt","inputs":[{"type":"address[]","name":"addresses","internalType":"address[]"},{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsTxLimitExempt","inputs":[{"type":"address[]","name":"addresses","internalType":"address[]"},{"type":"bool","name":"status","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMultiplier","inputs":[{"type":"uint256","name":"_buy","internalType":"uint256"},{"type":"uint256","name":"_sell","internalType":"uint256"},{"type":"uint256","name":"_trans","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapBackSettings","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTargetLiquidity","inputs":[{"type":"uint256","name":"_target","internalType":"uint256"},{"type":"uint256","name":"_denominator","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapThreshold","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"tradingOpen","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
            

Contract Creation Code

0x6080604052600380546001600160a01b031990811673a0eb9a6063df850f611aa69c60025c7f8eb4d6ee1790915560048054821661dead179055600580549091169055620000506012600a62000822565b6200006090633b9aca0062000833565b6006556200009a6064620000866002600654620005e760201b62001d721790919060201c565b6200067b60201b62001df11790919060201c565b600755620000c06064620000866002600654620005e760201b62001d721790919060201c565b600855600b805460ff19908116909155600d8054909116600190811790915560026013819055600060148190556005601581905560168390556017849055601882905590919081906200011590849062000855565b62000121919062000855565b6200012d919062000855565b62000139919062000855565b62000145919062000855565b60199081556064601a819055610384601b819055601c829055601d556023919091556024556026805460ff60a01b191690556028805461ffff191661140117905564012a05f200602a556207a120602c55602d805460ff19166001179055600654620f424090620001b890601462000833565b620001c4919062000870565b602e55348015620001d457600080fd5b50600080546001600160a01b031916339081178255808252600160208190526040808420805460ff191690921790915551909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350602580546001600160a01b03191673a4ee06ce40cb7e8c04e127c1f7d3dfb7f7039c81908117909155604080516302768aa360e51b81529051634ed15460916004808201926020929091908290030181865afa15801562000294573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ba919062000893565b600280546001600160a01b0319166001600160a01b039283161790556025546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa15801562000319573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200033f919062000893565b6002546040516364e329cb60e11b81526001600160a01b03918216600482015230602482015291169063c9c65396906044016020604051808303816000875af115801562000391573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003b7919062000893565b602680546001600160a01b0319166001600160a01b03928316179055306000908152600a6020908152604080832060258054861685529252918290206000199055549051911690620004099062000701565b6001600160a01b039091168152602001604051809103906000f08015801562000436573d6000803e3d6000fd5b50602b80546001600160a01b039283166001600160a01b031991821617909155336000818152600f60209081526040808320805460ff199081166001908117909255601f8054891686528386208054831684179055868652600c855283862080548316841790556010855283862080548316841790558054891686528386208054831684179055602680548a1687528487208054841685179055308088528588208054851686179055888852601187528588208054851686179055600480548c1689528689208054861687179055818952868920805486168717905591548b16885260128752858820805485168617905587528487208054909316909317909155601e80548816871790558054871673577354df5c4945477253f90098c925d9d82b0fb71790558254861673f27296011c3c3d9221f77745ef8059084c4c54df178355602180548716861790555460228054909616961695909517909355600654828252600990935283812083905592519092917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91620005d991815260200190565b60405180910390a362000916565b600082620005f85750600062000675565b600062000606838562000833565b90508262000615858362000870565b14620006725760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084015b60405180910390fd5b90505b92915050565b60006200067283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620006c560201b60201c565b60008183620006e95760405162461bcd60e51b8152600401620006699190620008be565b506000620006f8848662000870565b95945050505050565b6110a28062003d3183390190565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620007665781600019048211156200074a576200074a6200070f565b808516156200075857918102915b93841c93908002906200072a565b509250929050565b6000826200077f5750600162000675565b816200078e5750600062000675565b8160018114620007a75760028114620007b257620007d2565b600191505062000675565b60ff841115620007c657620007c66200070f565b50506001821b62000675565b5060208310610133831016604e8410600b8410161715620007f7575081810a62000675565b62000803838362000725565b80600019048211156200081a576200081a6200070f565b029392505050565b60006200067260ff8416836200076e565b60008160001904831182151516156200085057620008506200070f565b500290565b600082198211156200086b576200086b6200070f565b500190565b6000826200088e57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215620008a657600080fd5b81516001600160a01b03811681146200067257600080fd5b600060208083528351808285015260005b81811015620008ed57858101830151858201604001528201620008cf565b8181111562000900576000604083870101525b50601f01601f1916929092016040019392505050565b61340b80620009266000396000f3fe6080604052600436106103905760003560e01c80637d1db4a5116101dc578063cfa15af511610102578063ee19828a116100a0578063f708a64f1161006f578063f708a64f14610aad578063f887ea4014610acd578063fce589d814610aed578063ffb54a9914610b0357600080fd5b8063ee19828a14610a28578063f0d2d94814610a48578063f0fc6bca14610a78578063f2fde38b14610a8d57600080fd5b8063df20fd49116100dc578063df20fd49146109ae578063dfc3dce2146109ce578063e86e507e146109ee578063ecca885f14610a0e57600080fd5b8063cfa15af514610928578063da2e3bad14610948578063dd62ed3e1461096857600080fd5b8063a88ce88b1161017a578063b2bdfa7b11610149578063b2bdfa7b146108b9578063b37dd690146108d9578063b46300ec146108f3578063ba1ac0b81461090857600080fd5b8063a88ce88b14610839578063a8aa1b3114610859578063a9059cbb14610879578063ae1967f11461089957600080fd5b8063893d20e8116101b6578063893d20e8146107995780638da5cb5b146107cb57806395d89b41146107e95780639d1944f51461081957600080fd5b80637d1db4a51461074357806384f6dc05146107595780638571a6791461077957600080fd5b80634e23af6a116102c15780636ddd17131161025f578063715018a61161022e578063715018a6146106e4578063722b62ad146106f9578063763a67af1461071857806378109e541461072d57600080fd5b80636ddd1713146106445780636f8c206c1461065e5780637007546b1461067e57806370a08231146106ae57600080fd5b8063571ac8b01161029b578063571ac8b0146105ca578063617fe0ed146105ea57806363157107146106045780636b1ebc541461062457600080fd5b80634e23af6a1461056a5780635074f36f1461058a578063570636dc146105aa57600080fd5b80631df4ccfc1161032e5780632444caad116103085780632444caad146104f35780632b112e49146105135780632d48e89614610528578063313ce5671461054857600080fd5b80631df4ccfc1461049d578063201e7991146104b357806323b872dd146104d357600080fd5b8063095ea7b31161036a578063095ea7b314610422578063180b0d7e1461045257806318160ddd1461046857806318abb6351461047d57600080fd5b80630445b6671461039c57806306fdde03146103c5578063087066151461040057600080fd5b3661039757005b600080fd5b3480156103a857600080fd5b506103b2602e5481565b6040519081526020015b60405180910390f35b3480156103d157600080fd5b50604080518082019091526009815268446f67655a696c6c6160b81b60208201525b6040516103bc9190612ddf565b34801561040c57600080fd5b5061042061041b366004612e42565b610b24565b005b34801561042e57600080fd5b5061044261043d366004612e7b565b610b6a565b60405190151581526020016103bc565b34801561045e57600080fd5b506103b2601a5481565b34801561047457600080fd5b506006546103b2565b34801561048957600080fd5b50610420610498366004612ea5565b610bd7565b3480156104a957600080fd5b506103b260195481565b3480156104bf57600080fd5b506104206104ce366004612f0a565b610c60565b3480156104df57600080fd5b506104426104ee366004612f2c565b610c87565b3480156104ff57600080fd5b5061042061050e366004612f68565b610d49565b34801561051f57600080fd5b506103b2610d87565b34801561053457600080fd5b50610420610543366004612f0a565b610dd9565b34801561055457600080fd5b5060125b60405160ff90911681526020016103bc565b34801561057657600080fd5b50610420610585366004612fcd565b610e6d565b34801561059657600080fd5b506104206105a5366004612fcd565b610f0c565b3480156105b657600080fd5b506104206105c5366004612f68565b610fa5565b3480156105d657600080fd5b506104426105e5366004613024565b61100e565b3480156105f657600080fd5b506028546104429060ff1681565b34801561061057600080fd5b5061042061061f36600461303f565b61101c565b34801561063057600080fd5b5061042061063f366004612fcd565b611071565b34801561065057600080fd5b50602d546104429060ff1681565b34801561066a57600080fd5b50610420610679366004613024565b61110a565b34801561068a57600080fd5b50610442610699366004613024565b600c6020526000908152604090205460ff1681565b3480156106ba57600080fd5b506103b26106c9366004613024565b6001600160a01b031660009081526009602052604090205490565b3480156106f057600080fd5b50610420611196565b34801561070557600080fd5b5060285461055890610100900460ff1681565b34801561072457600080fd5b5061042061120a565b34801561073957600080fd5b506103b260085481565b34801561074f57600080fd5b506103b260075481565b34801561076557600080fd5b50610420610774366004612f68565b61124d565b34801561078557600080fd5b50610420610794366004613076565b611298565b3480156107a557600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016103bc565b3480156107d757600080fd5b506000546001600160a01b03166107b3565b3480156107f557600080fd5b50604080518082019091526007815266446f5a696c6c6160c81b60208201526103f3565b34801561082557600080fd5b50610420610834366004612f68565b61166a565b34801561084557600080fd5b50610420610854366004612e42565b6116a8565b34801561086557600080fd5b506026546107b3906001600160a01b031681565b34801561088557600080fd5b50610442610894366004612e7b565b6116e5565b3480156108a557600080fd5b506104206108b4366004612f68565b6116f2565b3480156108c557600080fd5b506000546107b3906001600160a01b031681565b3480156108e557600080fd5b50600b546104429060ff1681565b3480156108ff57600080fd5b5061042061172f565b34801561091457600080fd5b50610442610923366004612e7b565b61177a565b34801561093457600080fd5b50610420610943366004612fcd565b611877565b34801561095457600080fd5b506104206109633660046130f7565b611910565b34801561097457600080fd5b506103b2610983366004613143565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b3480156109ba57600080fd5b506104206109c9366004613176565b6119fa565b3480156109da57600080fd5b506104206109e9366004612f68565b611a3b565b3480156109fa57600080fd5b50610420610a09366004613194565b611aa4565b348015610a1a57600080fd5b50600d546104429060ff1681565b348015610a3457600080fd5b50610420610a433660046131c8565b611af5565b348015610a5457600080fd5b50610442610a63366004613024565b600e6020526000908152604090205460ff1681565b348015610a8457600080fd5b50610420611b22565b348015610a9957600080fd5b50610420610aa8366004613024565b611b7b565b348015610ab957600080fd5b50610420610ac836600461303f565b611c65565b348015610ad957600080fd5b506025546107b3906001600160a01b031681565b348015610af957600080fd5b506103b260185481565b348015610b0f57600080fd5b5060265461044290600160a01b900460ff1681565b6000546001600160a01b03163314610b575760405162461bcd60e51b8152600401610b4e906131f4565b60405180910390fd5b600b805460ff1916911515919091179055565b336000818152600a602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610bc59086815260200190565b60405180910390a35060015b92915050565b6000546001600160a01b03163314610c015760405162461bcd60e51b8152600401610b4e906131f4565b601e80546001600160a01b03199081166001600160a01b0397881617909155601f805482169587169590951790945560208054851693861693909317909255602280548416918516919091179055602180549092169216919091179055565b336000908152600c602052604090205460ff16610c7c57600080fd5b602391909155602455565b6001600160a01b0383166000908152600a6020908152604080832033845290915281205460001914610d34576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600a82528381203382529091529190912054610d0f918490611e33565b6001600160a01b0385166000908152600a602090815260408083203384529091529020555b610d3f848484611e6d565b90505b9392505050565b6000546001600160a01b03163314610d735760405162461bcd60e51b8152600401610b4e906131f4565b610d8181633b9aca0061323f565b602a5550565b6005546001600160a01b0316600090815260096020526040812054610dd4906004546001600160a01b0316600090815260096020526040902054610dce9060065490612534565b90612534565b905090565b6000546001600160a01b03163314610e035760405162461bcd60e51b8152600401610b4e906131f4565b602b546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e896906044015b600060405180830381600087803b158015610e5157600080fd5b505af1158015610e65573d6000803e3d6000fd5b505050505050565b6000546001600160a01b03163314610e975760405162461bcd60e51b8152600401610b4e906131f4565b60005b82811015610f065781600c6000868685818110610eb957610eb961325e565b9050602002016020810190610ece9190613024565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610eff81613274565b9050610e9a565b50505050565b6000546001600160a01b03163314610f365760405162461bcd60e51b8152600401610b4e906131f4565b60005b82811015610f065781600f6000868685818110610f5857610f5861325e565b9050602002016020810190610f6d9190613024565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610f9e81613274565b9050610f39565b6000546001600160a01b03163314610fcf5760405162461bcd60e51b8152600401610b4e906131f4565b6103e8600654610fdf919061328f565b6007541015610fed57600080fd5b6103e881600654610ffe919061323f565b611008919061328f565b60075550565b6000610bd182600019610b6a565b6000546001600160a01b031633146110465760405162461bcd60e51b8152600401610b4e906131f4565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461109b5760405162461bcd60e51b8152600401610b4e906131f4565b60005b82811015610f065781601060008686858181106110bd576110bd61325e565b90506020020160208101906110d29190613024565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561110381613274565b905061109e565b6000546001600160a01b031633146111345760405162461bcd60e51b8152600401610b4e906131f4565b602b54604051638aee812760e01b81526001600160a01b03838116600483015290911690638aee812790602401600060405180830381600087803b15801561117b57600080fd5b505af115801561118f573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031633146111c05760405162461bcd60e51b8152600401610b4e906131f4565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146112345760405162461bcd60e51b8152600401610b4e906131f4565b6026805460ff60a01b1916600160a01b17905543602755565b6000546001600160a01b031633146112775760405162461bcd60e51b8152600401610b4e906131f4565b6103e8600654611287919061328f565b81101561129357600080fd5b600855565b6000546001600160a01b031633146112c25760405162461bcd60e51b8152600401610b4e906131f4565b6101f583106113295760405162461bcd60e51b815260206004820152602d60248201527f474153204572726f723a206d61782061697264726f70206c696d69742069732060448201526c3530302061646472657373657360981b6064820152608401610b4e565b8281146113895760405162461bcd60e51b815260206004820152602860248201527f4d69736d61746368206265747765656e204164647265737320616e6420746f6b604482015267195b8818dbdd5b9d60c21b6064820152608401610b4e565b6000805b848110156113cd578383828181106113a7576113a761325e565b90506020020135826113b991906132b1565b9150806113c581613274565b91505061138d565b50806113ee876001600160a01b031660009081526009602052604090205490565b101561143c5760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f75676820746f6b656e7320696e2077616c6c657400000000006044820152606401610b4e565b60005b848110156115d1576114908787878481811061145d5761145d61325e565b90506020020160208101906114729190613024565b8686858181106114845761148461325e565b90506020020135612576565b50601260008787848181106114a7576114a761325e565b90506020020160208101906114bc9190613024565b6001600160a01b0316815260208101919091526040016000205460ff166115bf57602b546001600160a01b03166314b6ca968787848181106115005761150061325e565b90506020020160208101906115159190613024565b600960008a8a8781811061152b5761152b61325e565b90506020020160208101906115409190613024565b6001600160a01b03166001600160a01b03168152602001908152602001600020546040518363ffffffff1660e01b81526004016115929291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b1580156115ac57600080fd5b505af19250505080156115bd575060015b505b806115c981613274565b91505061143f565b506001600160a01b03861660009081526012602052604090205460ff16610e6557602b546001600160a01b0387811660008181526009602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b15801561165057600080fd5b505af1925050508015611661575060015b610e6557610e65565b6000546001600160a01b031633146116945760405162461bcd60e51b8152600401610b4e906131f4565b620b71b081106116a357600080fd5b602c55565b6000546001600160a01b031633146116d25760405162461bcd60e51b8152600401610b4e906131f4565b600d805460ff1916911515919091179055565b6000610d42338484611e6d565b336000908152600c602052604090205460ff1661170e57600080fd5b6103e860065461171e919061328f565b81101561172a57600080fd5b600755565b336000908152600c602052604090205460ff1661174b57600080fd5b60405133904780156108fc02916000818181858888f19350505050158015611777573d6000803e3d6000fd5b50565b336000908152600c602052604081205460ff1661179657600080fd5b81611806576040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156117df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180391906132c9565b91505b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015611853573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4291906132e2565b6000546001600160a01b031633146118a15760405162461bcd60e51b8152600401610b4e906131f4565b60005b82811015610f065781600e60008686858181106118c3576118c361325e565b90506020020160208101906118d89190613024565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561190981613274565b90506118a4565b6000546001600160a01b0316331461193a5760405162461bcd60e51b8152600401610b4e906131f4565b601387905560148690556015859055601684905560178390556018829055828285876119668a8c6132b1565b61197091906132b1565b61197a91906132b1565b61198491906132b1565b61198e91906132b1565b601955601a8190556119a160028261328f565b601954106119f15760405162461bcd60e51b815260206004820152601c60248201527f466565732063616e6e6f74206265206d6f7265207468616e20343925000000006044820152606401610b4e565b50505050505050565b6000546001600160a01b03163314611a245760405162461bcd60e51b8152600401610b4e906131f4565b602d805460ff191692151592909217909155602e55565b6000546001600160a01b03163314611a655760405162461bcd60e51b8152600401610b4e906131f4565b6103e8600654611a75919061328f565b6008541015611a8357600080fd5b6103e881600654611a94919061323f565b611a9e919061328f565b60085550565b6000546001600160a01b03163314611ace5760405162461bcd60e51b8152600401610b4e906131f4565b6028805461ffff191692151561ff0019169290921761010060ff9290921691909102179055565b336000908152600c602052604090205460ff16611b1157600080fd5b601b91909155601c91909155601d55565b602b54604051630afbf02f60e11b81523360048201526001600160a01b03909116906315f7e05e90602401600060405180830381600087803b158015611b6757600080fd5b505af1158015610f06573d6000803e3d6000fd5b6000546001600160a01b03163314611ba55760405162461bcd60e51b8152600401610b4e906131f4565b6001600160a01b038116611c0a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b4e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611c8f5760405162461bcd60e51b8152600401610b4e906131f4565b6001600160a01b0382163014801590611cb657506026546001600160a01b03838116911614155b611cbf57600080fd5b6001600160a01b0382166000908152601260205260409020805460ff19168215801591909117909155611d2557602b54604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca9690604401610e37565b602b546001600160a01b0383811660008181526009602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401610e37565b5050565b600082611d8157506000610bd1565b6000611d8d838561323f565b905082611d9a858361328f565b14610d425760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b4e565b6000610d4283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061264a565b60008184841115611e575760405162461bcd60e51b8152600401610b4e9190612ddf565b506000611e6484866132ff565b95945050505050565b602f5460009060ff1615611e8d57611e86848484612576565b9050610d42565b6001600160a01b03841660009081526001602052604090205460ff16158015611ecf57506001600160a01b03831660009081526001602052604090205460ff16155b15611f8657602654600160a01b900460ff16611f245760405162461bcd60e51b8152602060048201526014602482015273151c98591a5b99c81b9bdd081bdc195b881e595d60621b6044820152606401610b4e565b600b5460ff1615611f86576001600160a01b0383166000908152600c602052604090205460ff16611f865760405162461bcd60e51b815260206004820152600c60248201526b139bdd081b185d5b98da195960a21b6044820152606401610b4e565b600d5460ff1615611fe4576001600160a01b0384166000908152600e602052604090205460ff1615611fe45760405162461bcd60e51b8152602060048201526007602482015266109b1a5cdd195960ca1b6044820152606401610b4e565b602a543a1015801561200457506026546001600160a01b03848116911614155b1561202d576001600160a01b0383166000908152600e60205260409020805460ff191660011790555b6001600160a01b03841660009081526001602052604090205460ff1615801561205f57506001600160a01b0383163014155b801561207957506004546001600160a01b03848116911614155b801561209357506026546001600160a01b03848116911614155b80156120ad57506022546001600160a01b03848116911614155b80156120d257506001600160a01b03831660009081526010602052604090205460ff16155b15612173576001600160a01b0383166000908152600960205260409020546008546120fd84836132b1565b11156121715760405162461bcd60e51b815260206004820152603e60248201527f546f74616c20486f6c64696e672069732063757272656e746c79206c696d697460448201527f65642c20796f752063616e206e6f74206275792074686174206d7563682e00006064820152608401610b4e565b505b6026546001600160a01b038581169116148015612192575060285460ff165b80156121b757506001600160a01b03831660009081526011602052604090205460ff16155b15612252576001600160a01b03831660009081526029602052604090205442116122235760405162461bcd60e51b815260206004820152601c60248201527f506c65617365207761697420666f72206265747765656e2062757973000000006044820152606401610b4e565b60285461223890610100900460ff16426132b1565b6001600160a01b0384166000908152602960205260409020555b61225c8483612678565b6122646126e1565b1561227157612271612730565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0387166000908152600990915291909120546122c3918490611e33565b6001600160a01b038516600090815260096020908152604080832093909355600f90529081205460ff168061231057506001600160a01b0384166000908152600f602052604090205460ff165b6123245761231f858486612baa565b612326565b825b6001600160a01b03851660009081526009602052604090205490915061234c9082612d2d565b6001600160a01b0380861660009081526009602090815260408083209490945591881681526012909152205460ff166123f057602b546001600160a01b0386811660008181526009602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b1580156123dd57600080fd5b505af19250505080156123ee575060015b505b6001600160a01b03841660009081526012602052604090205460ff1661248157602b546001600160a01b0385811660008181526009602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b15801561246e57600080fd5b505af192505050801561247f575060015b505b601454156124ee57602b54602c546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916124c19160040190815260200190565b600060405180830381600087803b1580156124db57600080fd5b505af19250505080156124ec575060015b505b836001600160a01b0316856001600160a01b03166000805160206133b68339815191528360405161252191815260200190565b60405180910390a3506001949350505050565b6000610d4283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611e33565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b03861660009081526009909152918220546125c7918490611e33565b6001600160a01b0380861660009081526009602052604080822093909355908516815220546125f69083612d2d565b6001600160a01b0380851660008181526009602052604090819020939093559151908616906000805160206133b6833981519152906126389086815260200190565b60405180910390a35060019392505050565b6000818361266b5760405162461bcd60e51b8152600401610b4e9190612ddf565b506000611e64848661328f565b600754811115806126a157506001600160a01b03821660009081526010602052604090205460ff165b611d6e5760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610b4e565b6026546000906001600160a01b031633148015906127025750602f5460ff16155b80156127105750602d5460ff165b8015610dd4575050602e5430600090815260096020526040902054101590565b602f805460ff1916600117905560235460245460009161274f91612d8c565b61275b5760135461275e565b60005b90506000612788600261278260195461278286602e54611d7290919063ffffffff16565b90611df1565b905060006127a182602e5461253490919063ffffffff16565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106127db576127db61325e565b6001600160a01b03928316602091820292909201015260025482519116908290600190811061280c5761280c61325e565b6001600160a01b03928316602091820292909201015260255460405163b43d9bbb60e01b81524792919091169063b43d9bbb90612856908690600090879030904290600401613316565b600060405180830381600087803b15801561287057600080fd5b505af1158015612884573d6000803e3d6000fd5b50505050600061289d824761253490919063ffffffff16565b905060006128b86128af886002611df1565b60195490612534565b905060006128cd60026127828481878d611d72565b905060006128ea8361278260145487611d7290919063ffffffff16565b905060006129078461278260155488611d7290919063ffffffff16565b905060006129248561278260165489611d7290919063ffffffff16565b90506000612941866127826017548a611d7290919063ffffffff16565b9050602b60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561299357600080fd5b505af1935050505080156129a5575060015b50601f546040516000916001600160a01b03169061753090869084818181858888f193505050503d80600081146129f8576040519150601f19603f3d011682016040523d82523d6000602084013e6129fd565b606091505b50506020546040519192506001600160a01b0316906175309085906000818181858888f193505050503d8060008114612a52576040519150601f19603f3d011682016040523d82523d6000602084013e612a57565b606091505b50506021546040519192506001600160a01b0316906175309084906000818181858888f193505050503d8060008114612aac576040519150601f19603f3d011682016040523d82523d6000602084013e612ab1565b606091505b5060009250508c159050612b9157602554601e54604051633994a6ad60e21b8152306004820152602481018f905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063e6529ab490889060c40160606040518083038185885af1158015612b2f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b549190613387565b505060408051888152602081018f90527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b5050602f805460ff191690555050505050505050505050565b601d54602654600091906001600160a01b0384811691161415612bd05750601b54612beb565b6026546001600160a01b0386811691161415612beb5750601c545b6000612c1e601a546064612bff919061323f565b61278284612c186019548a611d7290919063ffffffff16565b90611d72565b90506000612c3d60195461278260185485611d7290919063ffffffff16565b90506000612c4b8383612534565b30600090815260096020526040902054909150612c689082612d2d565b30600090815260096020526040808220929092556022546001600160a01b031681522054612c969083612d2d565b6022546001600160a01b0390811660009081526009602090815260409182902093909355518381523092918b16916000805160206133b6833981519152910160405180910390a38115612d17576022546040518381526001600160a01b03918216918a16906000805160206133b68339815191529060200160405180910390a35b612d218784612534565b98975050505050505050565b600080612d3a83856132b1565b905083811015610d425760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b4e565b600082612d9883612da0565b119392505050565b6000610bd1612dad610d87565b6026546001600160a01b031660009081526009602052604090205461278290612dd890600290612c18565b8590611d72565b600060208083528351808285015260005b81811015612e0c57858101830151858201604001528201612df0565b81811115612e1e576000604083870101525b50601f01601f1916929092016040019392505050565b801515811461177757600080fd5b600060208284031215612e5457600080fd5b8135610d4281612e34565b80356001600160a01b0381168114612e7657600080fd5b919050565b60008060408385031215612e8e57600080fd5b612e9783612e5f565b946020939093013593505050565b600080600080600060a08688031215612ebd57600080fd5b612ec686612e5f565b9450612ed460208701612e5f565b9350612ee260408701612e5f565b9250612ef060608701612e5f565b9150612efe60808701612e5f565b90509295509295909350565b60008060408385031215612f1d57600080fd5b50508035926020909101359150565b600080600060608486031215612f4157600080fd5b612f4a84612e5f565b9250612f5860208501612e5f565b9150604084013590509250925092565b600060208284031215612f7a57600080fd5b5035919050565b60008083601f840112612f9357600080fd5b50813567ffffffffffffffff811115612fab57600080fd5b6020830191508360208260051b8501011115612fc657600080fd5b9250929050565b600080600060408486031215612fe257600080fd5b833567ffffffffffffffff811115612ff957600080fd5b61300586828701612f81565b909450925050602084013561301981612e34565b809150509250925092565b60006020828403121561303657600080fd5b610d4282612e5f565b6000806040838503121561305257600080fd5b61305b83612e5f565b9150602083013561306b81612e34565b809150509250929050565b60008060008060006060868803121561308e57600080fd5b61309786612e5f565b9450602086013567ffffffffffffffff808211156130b457600080fd5b6130c089838a01612f81565b909650945060408801359150808211156130d957600080fd5b506130e688828901612f81565b969995985093965092949392505050565b600080600080600080600060e0888a03121561311257600080fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b6000806040838503121561315657600080fd5b61315f83612e5f565b915061316d60208401612e5f565b90509250929050565b6000806040838503121561318957600080fd5b8235612e9781612e34565b600080604083850312156131a757600080fd5b82356131b281612e34565b9150602083013560ff8116811461306b57600080fd5b6000806000606084860312156131dd57600080fd5b505081359360208301359350604090920135919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561325957613259613229565b500290565b634e487b7160e01b600052603260045260246000fd5b600060001982141561328857613288613229565b5060010190565b6000826132ac57634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156132c4576132c4613229565b500190565b6000602082840312156132db57600080fd5b5051919050565b6000602082840312156132f457600080fd5b8151610d4281612e34565b60008282101561331157613311613229565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133665784516001600160a01b031683529383019391830191600101613341565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561339c57600080fd5b835192506020840151915060408401519050925092509256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212205753bc2c5ac0975992d5468d1345a6886d1070e57e4a5c58944e60b7b375c36764736f6c634300080a00336080604052600180546001600160a01b031990811673a0eb9a6063df850f611aa69c60025c7f8eb4d6ee179091556002805490911673b7ddc6414bf4f5515b52d8bdd69973ae205ff1011790556ec097ce7bc90715b34b9f1000000000600c55610a8c600d55670de0b6b3a7640000600e5534801561007d57600080fd5b506040516110a23803806110a283398101604081905261009c916100f6565b6001600160a01b0381166100c45773a4ee06ce40cb7e8c04e127c1f7d3dfb7f7039c816100c6565b805b600380546001600160a01b03929092166001600160a01b0319928316179055600080549091163317905550610126565b60006020828403121561010857600080fd5b81516001600160a01b038116811461011f57600080fd5b9392505050565b610f6d806101356000396000f3fe6080604052600436106100e85760003560e01c80638aee81271161008a578063e2d2e21911610059578063e2d2e21914610259578063efca2eed1461026f578063ffb2c47914610285578063ffd49c84146102a557600080fd5b80638aee8127146101c4578063997664d7146101e4578063ce7c2ac2146101fa578063d0e30db01461025157600080fd5b806328fd3198116100c657806328fd3198146101585780632d48e896146101785780633a98ef39146101985780634fab0ae8146101ae57600080fd5b806311ce023d146100ed57806314b6ca961461011657806315f7e05e14610138575b600080fd5b3480156100f957600080fd5b50610103600c5481565b6040519081526020015b60405180910390f35b34801561012257600080fd5b50610136610131366004610cf0565b6102bb565b005b34801561014457600080fd5b50610136610153366004610d1a565b610433565b34801561016457600080fd5b50610103610173366004610d1a565b610456565b34801561018457600080fd5b50610136610193366004610d35565b6104df565b3480156101a457600080fd5b5061010360085481565b3480156101ba57600080fd5b50610103600e5481565b3480156101d057600080fd5b506101366101df366004610d1a565b610501565b3480156101f057600080fd5b5061010360095481565b34801561020657600080fd5b50610236610215366004610d1a565b60076020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161010d565b61013661053a565b34801561026557600080fd5b50610103600b5481565b34801561027b57600080fd5b50610103600a5481565b34801561029157600080fd5b506101366102a0366004610d57565b610769565b3480156102b157600080fd5b50610103600d5481565b6000546001600160a01b031633146102d257600080fd5b6001600160a01b038216600090815260076020526040902054156102f9576102f982610869565b60008111801561031f57506001600160a01b038216600090815260076020526040902054155b1561038557600480546001600160a01b0384166000818152600560205260408120839055600183018455929092527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b03191690911790556103b8565b801580156103aa57506001600160a01b03821660009081526007602052604090205415155b156103b8576103b882610985565b6001600160a01b0382166000908152600760205260409020546008546103e99183916103e391610a9a565b90610ae5565b6008556001600160a01b038216600090815260076020526040902081905561041081610b49565b6001600160a01b0390921660009081526007602052604090206001019190915550565b6000546001600160a01b0316331461044a57600080fd5b61045381610869565b50565b6001600160a01b03811660009081526007602052604081205461047b57506000919050565b6001600160a01b03821660009081526007602052604081205461049d90610b49565b6001600160a01b0384166000908152600760205260409020600101549091508082116104cd575060009392505050565b6104d78282610a9a565b949350505050565b6000546001600160a01b031633146104f657600080fd5b600d91909155600e55565b6000546001600160a01b0316331461051857600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461055157600080fd5b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be9190610d70565b6040805160028082526060820183529293506000929091602083019080368337505060025482519293506001600160a01b03169183915060009061060457610604610d89565b6001600160a01b039283166020918202929092010152600180548351921691839190811061063457610634610d89565b6001600160a01b03928316602091820292909201015260035460405163118d44ef60e21b815291169063463513bc90349061067a90600090869030904290600401610d9f565b6000604051808303818588803b15801561069357600080fd5b505af11580156106a7573d6000803e3d6000fd5b50506001546040516370a0823160e01b81523060048201526000945061072793508692506001600160a01b03909116906370a0823190602401602060405180830381865afa1580156106fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107219190610d70565b90610a9a565b6009549091506107379082610ae5565b600955600854600c5461076191610758916107529085610b66565b90610be5565b600b5490610ae5565b600b55505050565b6000546001600160a01b0316331461078057600080fd5b6004548061078c575050565b6000805a905060005b84831080156107a357508381105b156108625783600f54106107b7576000600f555b6107e96004600f54815481106107cf576107cf610d89565b6000918252602090912001546001600160a01b0316610c27565b15610820576108206004600f548154811061080657610806610d89565b6000918252602090912001546001600160a01b0316610869565b61083561082e5a8490610a9a565b8490610ae5565b92505a600f8054919350600061084a83610e1f565b9190505550808061085a90610e1f565b915050610795565b5050505050565b6001600160a01b0381166000908152600760205260409020546108895750565b600061089482610456565b9050801561098157600a546108a99082610ae5565b600a5560015460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb906044016020604051808303816000875af11580156108ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109239190610e3a565b506001600160a01b038216600090815260066020908152604080832042905560079091529020600201546109579082610ae5565b6001600160a01b038316600090815260076020526040902060028101919091555461041090610b49565b5050565b6004805461099590600190610e5c565b815481106109a5576109a5610d89565b60009182526020808320909101546001600160a01b03848116845260059092526040909220546004805492909316929181106109e3576109e3610d89565b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260059182905260408120546004805491939291610a2f90600190610e5c565b81548110610a3f57610a3f610d89565b60009182526020808320909101546001600160a01b031683528201929092526040019020556004805480610a7557610a75610e73565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000610adc83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610c6c565b90505b92915050565b600080610af28385610e89565b905083811015610adc5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b6000610adf600c54610752600b5485610b6690919063ffffffff16565b600082610b7557506000610adf565b6000610b818385610ea1565b905082610b8e8583610ec0565b14610adc5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b40565b6000610adc83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610ca6565b600d546001600160a01b03821660009081526006602052604081205490914291610c519190610e89565b108015610adf5750600e54610c6583610456565b1192915050565b60008184841115610c905760405162461bcd60e51b8152600401610b409190610ee2565b506000610c9d8486610e5c565b95945050505050565b60008183610cc75760405162461bcd60e51b8152600401610b409190610ee2565b506000610c9d8486610ec0565b80356001600160a01b0381168114610ceb57600080fd5b919050565b60008060408385031215610d0357600080fd5b610d0c83610cd4565b946020939093013593505050565b600060208284031215610d2c57600080fd5b610adc82610cd4565b60008060408385031215610d4857600080fd5b50508035926020909101359150565b600060208284031215610d6957600080fd5b5035919050565b600060208284031215610d8257600080fd5b5051919050565b634e487b7160e01b600052603260045260246000fd5b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015610de95784516001600160a01b031683529383019391830191600101610dc4565b50506001600160a01b039690961660408501525050506060015292915050565b634e487b7160e01b600052601160045260246000fd5b6000600019821415610e3357610e33610e09565b5060010190565b600060208284031215610e4c57600080fd5b81518015158114610adc57600080fd5b600082821015610e6e57610e6e610e09565b500390565b634e487b7160e01b600052603160045260246000fd5b60008219821115610e9c57610e9c610e09565b500190565b6000816000190483118215151615610ebb57610ebb610e09565b500290565b600082610edd57634e487b7160e01b600052601260045260246000fd5b500490565b600060208083528351808285015260005b81811015610f0f57858101830151858201604001528201610ef3565b81811115610f21576000604083870101525b50601f01601f191692909201604001939250505056fea26469706673582212205f05e8aff00ff09393eaeae9592594523a85a8a5d8ad1e889540af4341c26fef64736f6c634300080a0033

Deployed ByteCode

0x6080604052600436106103905760003560e01c80637d1db4a5116101dc578063cfa15af511610102578063ee19828a116100a0578063f708a64f1161006f578063f708a64f14610aad578063f887ea4014610acd578063fce589d814610aed578063ffb54a9914610b0357600080fd5b8063ee19828a14610a28578063f0d2d94814610a48578063f0fc6bca14610a78578063f2fde38b14610a8d57600080fd5b8063df20fd49116100dc578063df20fd49146109ae578063dfc3dce2146109ce578063e86e507e146109ee578063ecca885f14610a0e57600080fd5b8063cfa15af514610928578063da2e3bad14610948578063dd62ed3e1461096857600080fd5b8063a88ce88b1161017a578063b2bdfa7b11610149578063b2bdfa7b146108b9578063b37dd690146108d9578063b46300ec146108f3578063ba1ac0b81461090857600080fd5b8063a88ce88b14610839578063a8aa1b3114610859578063a9059cbb14610879578063ae1967f11461089957600080fd5b8063893d20e8116101b6578063893d20e8146107995780638da5cb5b146107cb57806395d89b41146107e95780639d1944f51461081957600080fd5b80637d1db4a51461074357806384f6dc05146107595780638571a6791461077957600080fd5b80634e23af6a116102c15780636ddd17131161025f578063715018a61161022e578063715018a6146106e4578063722b62ad146106f9578063763a67af1461071857806378109e541461072d57600080fd5b80636ddd1713146106445780636f8c206c1461065e5780637007546b1461067e57806370a08231146106ae57600080fd5b8063571ac8b01161029b578063571ac8b0146105ca578063617fe0ed146105ea57806363157107146106045780636b1ebc541461062457600080fd5b80634e23af6a1461056a5780635074f36f1461058a578063570636dc146105aa57600080fd5b80631df4ccfc1161032e5780632444caad116103085780632444caad146104f35780632b112e49146105135780632d48e89614610528578063313ce5671461054857600080fd5b80631df4ccfc1461049d578063201e7991146104b357806323b872dd146104d357600080fd5b8063095ea7b31161036a578063095ea7b314610422578063180b0d7e1461045257806318160ddd1461046857806318abb6351461047d57600080fd5b80630445b6671461039c57806306fdde03146103c5578063087066151461040057600080fd5b3661039757005b600080fd5b3480156103a857600080fd5b506103b2602e5481565b6040519081526020015b60405180910390f35b3480156103d157600080fd5b50604080518082019091526009815268446f67655a696c6c6160b81b60208201525b6040516103bc9190612ddf565b34801561040c57600080fd5b5061042061041b366004612e42565b610b24565b005b34801561042e57600080fd5b5061044261043d366004612e7b565b610b6a565b60405190151581526020016103bc565b34801561045e57600080fd5b506103b2601a5481565b34801561047457600080fd5b506006546103b2565b34801561048957600080fd5b50610420610498366004612ea5565b610bd7565b3480156104a957600080fd5b506103b260195481565b3480156104bf57600080fd5b506104206104ce366004612f0a565b610c60565b3480156104df57600080fd5b506104426104ee366004612f2c565b610c87565b3480156104ff57600080fd5b5061042061050e366004612f68565b610d49565b34801561051f57600080fd5b506103b2610d87565b34801561053457600080fd5b50610420610543366004612f0a565b610dd9565b34801561055457600080fd5b5060125b60405160ff90911681526020016103bc565b34801561057657600080fd5b50610420610585366004612fcd565b610e6d565b34801561059657600080fd5b506104206105a5366004612fcd565b610f0c565b3480156105b657600080fd5b506104206105c5366004612f68565b610fa5565b3480156105d657600080fd5b506104426105e5366004613024565b61100e565b3480156105f657600080fd5b506028546104429060ff1681565b34801561061057600080fd5b5061042061061f36600461303f565b61101c565b34801561063057600080fd5b5061042061063f366004612fcd565b611071565b34801561065057600080fd5b50602d546104429060ff1681565b34801561066a57600080fd5b50610420610679366004613024565b61110a565b34801561068a57600080fd5b50610442610699366004613024565b600c6020526000908152604090205460ff1681565b3480156106ba57600080fd5b506103b26106c9366004613024565b6001600160a01b031660009081526009602052604090205490565b3480156106f057600080fd5b50610420611196565b34801561070557600080fd5b5060285461055890610100900460ff1681565b34801561072457600080fd5b5061042061120a565b34801561073957600080fd5b506103b260085481565b34801561074f57600080fd5b506103b260075481565b34801561076557600080fd5b50610420610774366004612f68565b61124d565b34801561078557600080fd5b50610420610794366004613076565b611298565b3480156107a557600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016103bc565b3480156107d757600080fd5b506000546001600160a01b03166107b3565b3480156107f557600080fd5b50604080518082019091526007815266446f5a696c6c6160c81b60208201526103f3565b34801561082557600080fd5b50610420610834366004612f68565b61166a565b34801561084557600080fd5b50610420610854366004612e42565b6116a8565b34801561086557600080fd5b506026546107b3906001600160a01b031681565b34801561088557600080fd5b50610442610894366004612e7b565b6116e5565b3480156108a557600080fd5b506104206108b4366004612f68565b6116f2565b3480156108c557600080fd5b506000546107b3906001600160a01b031681565b3480156108e557600080fd5b50600b546104429060ff1681565b3480156108ff57600080fd5b5061042061172f565b34801561091457600080fd5b50610442610923366004612e7b565b61177a565b34801561093457600080fd5b50610420610943366004612fcd565b611877565b34801561095457600080fd5b506104206109633660046130f7565b611910565b34801561097457600080fd5b506103b2610983366004613143565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205490565b3480156109ba57600080fd5b506104206109c9366004613176565b6119fa565b3480156109da57600080fd5b506104206109e9366004612f68565b611a3b565b3480156109fa57600080fd5b50610420610a09366004613194565b611aa4565b348015610a1a57600080fd5b50600d546104429060ff1681565b348015610a3457600080fd5b50610420610a433660046131c8565b611af5565b348015610a5457600080fd5b50610442610a63366004613024565b600e6020526000908152604090205460ff1681565b348015610a8457600080fd5b50610420611b22565b348015610a9957600080fd5b50610420610aa8366004613024565b611b7b565b348015610ab957600080fd5b50610420610ac836600461303f565b611c65565b348015610ad957600080fd5b506025546107b3906001600160a01b031681565b348015610af957600080fd5b506103b260185481565b348015610b0f57600080fd5b5060265461044290600160a01b900460ff1681565b6000546001600160a01b03163314610b575760405162461bcd60e51b8152600401610b4e906131f4565b60405180910390fd5b600b805460ff1916911515919091179055565b336000818152600a602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610bc59086815260200190565b60405180910390a35060015b92915050565b6000546001600160a01b03163314610c015760405162461bcd60e51b8152600401610b4e906131f4565b601e80546001600160a01b03199081166001600160a01b0397881617909155601f805482169587169590951790945560208054851693861693909317909255602280548416918516919091179055602180549092169216919091179055565b336000908152600c602052604090205460ff16610c7c57600080fd5b602391909155602455565b6001600160a01b0383166000908152600a6020908152604080832033845290915281205460001914610d34576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600a82528381203382529091529190912054610d0f918490611e33565b6001600160a01b0385166000908152600a602090815260408083203384529091529020555b610d3f848484611e6d565b90505b9392505050565b6000546001600160a01b03163314610d735760405162461bcd60e51b8152600401610b4e906131f4565b610d8181633b9aca0061323f565b602a5550565b6005546001600160a01b0316600090815260096020526040812054610dd4906004546001600160a01b0316600090815260096020526040902054610dce9060065490612534565b90612534565b905090565b6000546001600160a01b03163314610e035760405162461bcd60e51b8152600401610b4e906131f4565b602b546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e896906044015b600060405180830381600087803b158015610e5157600080fd5b505af1158015610e65573d6000803e3d6000fd5b505050505050565b6000546001600160a01b03163314610e975760405162461bcd60e51b8152600401610b4e906131f4565b60005b82811015610f065781600c6000868685818110610eb957610eb961325e565b9050602002016020810190610ece9190613024565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610eff81613274565b9050610e9a565b50505050565b6000546001600160a01b03163314610f365760405162461bcd60e51b8152600401610b4e906131f4565b60005b82811015610f065781600f6000868685818110610f5857610f5861325e565b9050602002016020810190610f6d9190613024565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055610f9e81613274565b9050610f39565b6000546001600160a01b03163314610fcf5760405162461bcd60e51b8152600401610b4e906131f4565b6103e8600654610fdf919061328f565b6007541015610fed57600080fd5b6103e881600654610ffe919061323f565b611008919061328f565b60075550565b6000610bd182600019610b6a565b6000546001600160a01b031633146110465760405162461bcd60e51b8152600401610b4e906131f4565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6000546001600160a01b0316331461109b5760405162461bcd60e51b8152600401610b4e906131f4565b60005b82811015610f065781601060008686858181106110bd576110bd61325e565b90506020020160208101906110d29190613024565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561110381613274565b905061109e565b6000546001600160a01b031633146111345760405162461bcd60e51b8152600401610b4e906131f4565b602b54604051638aee812760e01b81526001600160a01b03838116600483015290911690638aee812790602401600060405180830381600087803b15801561117b57600080fd5b505af115801561118f573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031633146111c05760405162461bcd60e51b8152600401610b4e906131f4565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146112345760405162461bcd60e51b8152600401610b4e906131f4565b6026805460ff60a01b1916600160a01b17905543602755565b6000546001600160a01b031633146112775760405162461bcd60e51b8152600401610b4e906131f4565b6103e8600654611287919061328f565b81101561129357600080fd5b600855565b6000546001600160a01b031633146112c25760405162461bcd60e51b8152600401610b4e906131f4565b6101f583106113295760405162461bcd60e51b815260206004820152602d60248201527f474153204572726f723a206d61782061697264726f70206c696d69742069732060448201526c3530302061646472657373657360981b6064820152608401610b4e565b8281146113895760405162461bcd60e51b815260206004820152602860248201527f4d69736d61746368206265747765656e204164647265737320616e6420746f6b604482015267195b8818dbdd5b9d60c21b6064820152608401610b4e565b6000805b848110156113cd578383828181106113a7576113a761325e565b90506020020135826113b991906132b1565b9150806113c581613274565b91505061138d565b50806113ee876001600160a01b031660009081526009602052604090205490565b101561143c5760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f75676820746f6b656e7320696e2077616c6c657400000000006044820152606401610b4e565b60005b848110156115d1576114908787878481811061145d5761145d61325e565b90506020020160208101906114729190613024565b8686858181106114845761148461325e565b90506020020135612576565b50601260008787848181106114a7576114a761325e565b90506020020160208101906114bc9190613024565b6001600160a01b0316815260208101919091526040016000205460ff166115bf57602b546001600160a01b03166314b6ca968787848181106115005761150061325e565b90506020020160208101906115159190613024565b600960008a8a8781811061152b5761152b61325e565b90506020020160208101906115409190613024565b6001600160a01b03166001600160a01b03168152602001908152602001600020546040518363ffffffff1660e01b81526004016115929291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b1580156115ac57600080fd5b505af19250505080156115bd575060015b505b806115c981613274565b91505061143f565b506001600160a01b03861660009081526012602052604090205460ff16610e6557602b546001600160a01b0387811660008181526009602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b15801561165057600080fd5b505af1925050508015611661575060015b610e6557610e65565b6000546001600160a01b031633146116945760405162461bcd60e51b8152600401610b4e906131f4565b620b71b081106116a357600080fd5b602c55565b6000546001600160a01b031633146116d25760405162461bcd60e51b8152600401610b4e906131f4565b600d805460ff1916911515919091179055565b6000610d42338484611e6d565b336000908152600c602052604090205460ff1661170e57600080fd5b6103e860065461171e919061328f565b81101561172a57600080fd5b600755565b336000908152600c602052604090205460ff1661174b57600080fd5b60405133904780156108fc02916000818181858888f19350505050158015611777573d6000803e3d6000fd5b50565b336000908152600c602052604081205460ff1661179657600080fd5b81611806576040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156117df573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061180391906132c9565b91505b60405163a9059cbb60e01b8152336004820152602481018390526001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015611853573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d4291906132e2565b6000546001600160a01b031633146118a15760405162461bcd60e51b8152600401610b4e906131f4565b60005b82811015610f065781600e60008686858181106118c3576118c361325e565b90506020020160208101906118d89190613024565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561190981613274565b90506118a4565b6000546001600160a01b0316331461193a5760405162461bcd60e51b8152600401610b4e906131f4565b601387905560148690556015859055601684905560178390556018829055828285876119668a8c6132b1565b61197091906132b1565b61197a91906132b1565b61198491906132b1565b61198e91906132b1565b601955601a8190556119a160028261328f565b601954106119f15760405162461bcd60e51b815260206004820152601c60248201527f466565732063616e6e6f74206265206d6f7265207468616e20343925000000006044820152606401610b4e565b50505050505050565b6000546001600160a01b03163314611a245760405162461bcd60e51b8152600401610b4e906131f4565b602d805460ff191692151592909217909155602e55565b6000546001600160a01b03163314611a655760405162461bcd60e51b8152600401610b4e906131f4565b6103e8600654611a75919061328f565b6008541015611a8357600080fd5b6103e881600654611a94919061323f565b611a9e919061328f565b60085550565b6000546001600160a01b03163314611ace5760405162461bcd60e51b8152600401610b4e906131f4565b6028805461ffff191692151561ff0019169290921761010060ff9290921691909102179055565b336000908152600c602052604090205460ff16611b1157600080fd5b601b91909155601c91909155601d55565b602b54604051630afbf02f60e11b81523360048201526001600160a01b03909116906315f7e05e90602401600060405180830381600087803b158015611b6757600080fd5b505af1158015610f06573d6000803e3d6000fd5b6000546001600160a01b03163314611ba55760405162461bcd60e51b8152600401610b4e906131f4565b6001600160a01b038116611c0a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b4e565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611c8f5760405162461bcd60e51b8152600401610b4e906131f4565b6001600160a01b0382163014801590611cb657506026546001600160a01b03838116911614155b611cbf57600080fd5b6001600160a01b0382166000908152601260205260409020805460ff19168215801591909117909155611d2557602b54604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca9690604401610e37565b602b546001600160a01b0383811660008181526009602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401610e37565b5050565b600082611d8157506000610bd1565b6000611d8d838561323f565b905082611d9a858361328f565b14610d425760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b4e565b6000610d4283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061264a565b60008184841115611e575760405162461bcd60e51b8152600401610b4e9190612ddf565b506000611e6484866132ff565b95945050505050565b602f5460009060ff1615611e8d57611e86848484612576565b9050610d42565b6001600160a01b03841660009081526001602052604090205460ff16158015611ecf57506001600160a01b03831660009081526001602052604090205460ff16155b15611f8657602654600160a01b900460ff16611f245760405162461bcd60e51b8152602060048201526014602482015273151c98591a5b99c81b9bdd081bdc195b881e595d60621b6044820152606401610b4e565b600b5460ff1615611f86576001600160a01b0383166000908152600c602052604090205460ff16611f865760405162461bcd60e51b815260206004820152600c60248201526b139bdd081b185d5b98da195960a21b6044820152606401610b4e565b600d5460ff1615611fe4576001600160a01b0384166000908152600e602052604090205460ff1615611fe45760405162461bcd60e51b8152602060048201526007602482015266109b1a5cdd195960ca1b6044820152606401610b4e565b602a543a1015801561200457506026546001600160a01b03848116911614155b1561202d576001600160a01b0383166000908152600e60205260409020805460ff191660011790555b6001600160a01b03841660009081526001602052604090205460ff1615801561205f57506001600160a01b0383163014155b801561207957506004546001600160a01b03848116911614155b801561209357506026546001600160a01b03848116911614155b80156120ad57506022546001600160a01b03848116911614155b80156120d257506001600160a01b03831660009081526010602052604090205460ff16155b15612173576001600160a01b0383166000908152600960205260409020546008546120fd84836132b1565b11156121715760405162461bcd60e51b815260206004820152603e60248201527f546f74616c20486f6c64696e672069732063757272656e746c79206c696d697460448201527f65642c20796f752063616e206e6f74206275792074686174206d7563682e00006064820152608401610b4e565b505b6026546001600160a01b038581169116148015612192575060285460ff165b80156121b757506001600160a01b03831660009081526011602052604090205460ff16155b15612252576001600160a01b03831660009081526029602052604090205442116122235760405162461bcd60e51b815260206004820152601c60248201527f506c65617365207761697420666f72206265747765656e2062757973000000006044820152606401610b4e565b60285461223890610100900460ff16426132b1565b6001600160a01b0384166000908152602960205260409020555b61225c8483612678565b6122646126e1565b1561227157612271612730565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0387166000908152600990915291909120546122c3918490611e33565b6001600160a01b038516600090815260096020908152604080832093909355600f90529081205460ff168061231057506001600160a01b0384166000908152600f602052604090205460ff165b6123245761231f858486612baa565b612326565b825b6001600160a01b03851660009081526009602052604090205490915061234c9082612d2d565b6001600160a01b0380861660009081526009602090815260408083209490945591881681526012909152205460ff166123f057602b546001600160a01b0386811660008181526009602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b1580156123dd57600080fd5b505af19250505080156123ee575060015b505b6001600160a01b03841660009081526012602052604090205460ff1661248157602b546001600160a01b0385811660008181526009602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b15801561246e57600080fd5b505af192505050801561247f575060015b505b601454156124ee57602b54602c546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c479916124c19160040190815260200190565b600060405180830381600087803b1580156124db57600080fd5b505af19250505080156124ec575060015b505b836001600160a01b0316856001600160a01b03166000805160206133b68339815191528360405161252191815260200190565b60405180910390a3506001949350505050565b6000610d4283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611e33565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b03861660009081526009909152918220546125c7918490611e33565b6001600160a01b0380861660009081526009602052604080822093909355908516815220546125f69083612d2d565b6001600160a01b0380851660008181526009602052604090819020939093559151908616906000805160206133b6833981519152906126389086815260200190565b60405180910390a35060019392505050565b6000818361266b5760405162461bcd60e51b8152600401610b4e9190612ddf565b506000611e64848661328f565b600754811115806126a157506001600160a01b03821660009081526010602052604090205460ff165b611d6e5760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610b4e565b6026546000906001600160a01b031633148015906127025750602f5460ff16155b80156127105750602d5460ff165b8015610dd4575050602e5430600090815260096020526040902054101590565b602f805460ff1916600117905560235460245460009161274f91612d8c565b61275b5760135461275e565b60005b90506000612788600261278260195461278286602e54611d7290919063ffffffff16565b90611df1565b905060006127a182602e5461253490919063ffffffff16565b604080516002808252606082018352929350600092909160208301908036833701905050905030816000815181106127db576127db61325e565b6001600160a01b03928316602091820292909201015260025482519116908290600190811061280c5761280c61325e565b6001600160a01b03928316602091820292909201015260255460405163b43d9bbb60e01b81524792919091169063b43d9bbb90612856908690600090879030904290600401613316565b600060405180830381600087803b15801561287057600080fd5b505af1158015612884573d6000803e3d6000fd5b50505050600061289d824761253490919063ffffffff16565b905060006128b86128af886002611df1565b60195490612534565b905060006128cd60026127828481878d611d72565b905060006128ea8361278260145487611d7290919063ffffffff16565b905060006129078461278260155488611d7290919063ffffffff16565b905060006129248561278260165489611d7290919063ffffffff16565b90506000612941866127826017548a611d7290919063ffffffff16565b9050602b60009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561299357600080fd5b505af1935050505080156129a5575060015b50601f546040516000916001600160a01b03169061753090869084818181858888f193505050503d80600081146129f8576040519150601f19603f3d011682016040523d82523d6000602084013e6129fd565b606091505b50506020546040519192506001600160a01b0316906175309085906000818181858888f193505050503d8060008114612a52576040519150601f19603f3d011682016040523d82523d6000602084013e612a57565b606091505b50506021546040519192506001600160a01b0316906175309084906000818181858888f193505050503d8060008114612aac576040519150601f19603f3d011682016040523d82523d6000602084013e612ab1565b606091505b5060009250508c159050612b9157602554601e54604051633994a6ad60e21b8152306004820152602481018f905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063e6529ab490889060c40160606040518083038185885af1158015612b2f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b549190613387565b505060408051888152602081018f90527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b5050602f805460ff191690555050505050505050505050565b601d54602654600091906001600160a01b0384811691161415612bd05750601b54612beb565b6026546001600160a01b0386811691161415612beb5750601c545b6000612c1e601a546064612bff919061323f565b61278284612c186019548a611d7290919063ffffffff16565b90611d72565b90506000612c3d60195461278260185485611d7290919063ffffffff16565b90506000612c4b8383612534565b30600090815260096020526040902054909150612c689082612d2d565b30600090815260096020526040808220929092556022546001600160a01b031681522054612c969083612d2d565b6022546001600160a01b0390811660009081526009602090815260409182902093909355518381523092918b16916000805160206133b6833981519152910160405180910390a38115612d17576022546040518381526001600160a01b03918216918a16906000805160206133b68339815191529060200160405180910390a35b612d218784612534565b98975050505050505050565b600080612d3a83856132b1565b905083811015610d425760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610b4e565b600082612d9883612da0565b119392505050565b6000610bd1612dad610d87565b6026546001600160a01b031660009081526009602052604090205461278290612dd890600290612c18565b8590611d72565b600060208083528351808285015260005b81811015612e0c57858101830151858201604001528201612df0565b81811115612e1e576000604083870101525b50601f01601f1916929092016040019392505050565b801515811461177757600080fd5b600060208284031215612e5457600080fd5b8135610d4281612e34565b80356001600160a01b0381168114612e7657600080fd5b919050565b60008060408385031215612e8e57600080fd5b612e9783612e5f565b946020939093013593505050565b600080600080600060a08688031215612ebd57600080fd5b612ec686612e5f565b9450612ed460208701612e5f565b9350612ee260408701612e5f565b9250612ef060608701612e5f565b9150612efe60808701612e5f565b90509295509295909350565b60008060408385031215612f1d57600080fd5b50508035926020909101359150565b600080600060608486031215612f4157600080fd5b612f4a84612e5f565b9250612f5860208501612e5f565b9150604084013590509250925092565b600060208284031215612f7a57600080fd5b5035919050565b60008083601f840112612f9357600080fd5b50813567ffffffffffffffff811115612fab57600080fd5b6020830191508360208260051b8501011115612fc657600080fd5b9250929050565b600080600060408486031215612fe257600080fd5b833567ffffffffffffffff811115612ff957600080fd5b61300586828701612f81565b909450925050602084013561301981612e34565b809150509250925092565b60006020828403121561303657600080fd5b610d4282612e5f565b6000806040838503121561305257600080fd5b61305b83612e5f565b9150602083013561306b81612e34565b809150509250929050565b60008060008060006060868803121561308e57600080fd5b61309786612e5f565b9450602086013567ffffffffffffffff808211156130b457600080fd5b6130c089838a01612f81565b909650945060408801359150808211156130d957600080fd5b506130e688828901612f81565b969995985093965092949392505050565b600080600080600080600060e0888a03121561311257600080fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b6000806040838503121561315657600080fd5b61315f83612e5f565b915061316d60208401612e5f565b90509250929050565b6000806040838503121561318957600080fd5b8235612e9781612e34565b600080604083850312156131a757600080fd5b82356131b281612e34565b9150602083013560ff8116811461306b57600080fd5b6000806000606084860312156131dd57600080fd5b505081359360208301359350604090920135919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561325957613259613229565b500290565b634e487b7160e01b600052603260045260246000fd5b600060001982141561328857613288613229565b5060010190565b6000826132ac57634e487b7160e01b600052601260045260246000fd5b500490565b600082198211156132c4576132c4613229565b500190565b6000602082840312156132db57600080fd5b5051919050565b6000602082840312156132f457600080fd5b8151610d4281612e34565b60008282101561331157613311613229565b500390565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133665784516001600160a01b031683529383019391830191600101613341565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561339c57600080fd5b835192506020840151915060408401519050925092509256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212205753bc2c5ac0975992d5468d1345a6886d1070e57e4a5c58944e60b7b375c36764736f6c634300080a0033