ETH Price: $3,352.21 (-0.82%)

Token

Black Eyed Dragon (BleYd)
 

Overview

Max Total Supply

100,000,000,000 BleYd

Holders

321

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
209,728,114.837578513 BleYd

Value
$0.00
0xbb790b1a6b982a873b7ad28e362cbaa6aa093fe3
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BleYd

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-25
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.17;

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

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

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

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;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }
    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

library IterableMapping {
    struct Map {
        address[] keys;
        mapping(address => uint) values;
        mapping(address => uint) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key) public view returns (int) {
        if(!map.inserted[key]) {
            return -1;
        }
        return int(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint index) public view returns (address) {
        return map.keys[index];
    }

    function size(Map storage map) public view returns (uint) {
        return map.keys.length;
    }

    function set(Map storage map, address key, uint val) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint index = map.indexOf[key];
        uint lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

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

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);
    function createPair(address tokenA, address tokenB) external returns (address pair);
    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

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

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

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

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

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

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);

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

}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

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

    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

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

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

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        _beforeTokenTransfer(sender, recipient, amount);
        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address(0), account, amount);
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
        _beforeTokenTransfer(account, address(0), amount);
        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

interface DividendPayingTokenInterface {
    function dividendOf(address _owner) external view returns(uint256);
    function withdrawDividend() external;
  
    event DividendsDistributed(
        address indexed from,
        uint256 weiAmount
    );
    event DividendWithdrawn(
        address indexed to,
        uint256 weiAmount
    );
}

interface DividendPayingTokenOptionalInterface {
    function withdrawableDividendOf(address _owner) external view returns(uint256);
    function withdrawnDividendOf(address _owner) external view returns(uint256);
    function accumulativeDividendOf(address _owner) external view returns(uint256);
}

contract DividendPayingToken is ERC20, Ownable, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface {
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    uint256 constant internal magnitude = 2**128;
    uint256 internal magnifiedDividendPerShare;
    uint256 public totalDividendsDistributed;
    
    address public immutable rewardToken;
    
    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    constructor(string memory _name, string memory _symbol, address _rewardToken) ERC20(_name, _symbol) { 
        rewardToken = _rewardToken;
    }

    function distributeDividends(uint256 amount) public onlyOwner{
        require(totalSupply() > 0);

        if (amount > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (amount).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, amount);

            totalDividendsDistributed = totalDividendsDistributed.add(amount);
        }
    }

    function withdrawDividend() public virtual override {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
            emit DividendWithdrawn(user, _withdrawableDividend);
            bool success = IERC20(rewardToken).transfer(user, _withdrawableDividend);

            if(!success) {
                withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
                return 0;
            }

            return _withdrawableDividend;
        }
        return 0;
    }

    function dividendOf(address _owner) public view override returns(uint256) {
        return withdrawableDividendOf(_owner);
    }

    function withdrawableDividendOf(address _owner) public view override returns(uint256) {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    function withdrawnDividendOf(address _owner) public view override returns(uint256) {
        return withdrawnDividends[_owner];
    }

    function accumulativeDividendOf(address _owner) public view override returns(uint256) {
        return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
        .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
    }

    function _transfer(address from, address to, uint256 value) internal virtual override {
        require(false);

        int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
    }

    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);

        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
        .add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);

        if(newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if(newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }
}

contract DividendTracker is Ownable, DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping (address => bool) public excludedFromDividends;
    mapping (address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);

    event Claim(address indexed account, uint256 amount, bool indexed automatic);

    constructor(uint256 minBalance, address _rewardToken) DividendPayingToken("Reward Tracker", "DividendTracker", _rewardToken) {
        claimWait = 3600;
        minimumTokenBalanceForDividends = minBalance * 10 ** 9;
    }

    function _transfer(address, address, uint256) internal pure override {
        require(false, "No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(false, "withdrawDividend disabled. Use the 'claim' function on the main contract.");
    }

    function updateMinimumTokenBalanceForDividends(uint256 _newMinimumBalance) external onlyOwner {
        require(_newMinimumBalance != minimumTokenBalanceForDividends, "New mimimum balance for dividend cannot be same as current minimum balance");
        minimumTokenBalanceForDividends = _newMinimumBalance;
    }

    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;

        _setBalance(account, 0);
        tokenHoldersMap.remove(account);

        emit ExcludeFromDividends(account);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 3_600 && newClaimWait <= 86_400, "claimWait must be updated to between 1 and 24 hours");
        require(newClaimWait != claimWait, "Cannot update claimWait to same value");
        emit ClaimWaitUpdated(newClaimWait, claimWait);
        claimWait = newClaimWait;
    }

    function setLastProcessedIndex(uint256 index) external onlyOwner {
        lastProcessedIndex = index;
    }

    function getLastProcessedIndex() external view returns(uint256) {
        return lastProcessedIndex;
    }

    function getNumberOfTokenHolders() external view returns(uint256) {
        return tokenHoldersMap.keys.length;
    }

    function getAccount(address _account)
        public view returns (
            address account,
            int256 index,
            int256 iterationsUntilProcessed,
            uint256 withdrawableDividends,
            uint256 totalDividends,
            uint256 lastClaimTime,
            uint256 nextClaimTime,
            uint256 secondsUntilAutoClaimAvailable) {
        account = _account;

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

        if(index >= 0) {
            if(uint256(index) > lastProcessedIndex) {
                iterationsUntilProcessed = index.sub(int256(lastProcessedIndex));
            }
            else {
                uint256 processesUntilEndOfArray = tokenHoldersMap.keys.length > lastProcessedIndex ?
                                                        tokenHoldersMap.keys.length.sub(lastProcessedIndex) :
                                                        0;


                iterationsUntilProcessed = index.add(int256(processesUntilEndOfArray));
            }
        }


        withdrawableDividends = withdrawableDividendOf(account);
        totalDividends = accumulativeDividendOf(account);

        lastClaimTime = lastClaimTimes[account];

        nextClaimTime = lastClaimTime > 0 ?
                                    lastClaimTime.add(claimWait) :
                                    0;

        secondsUntilAutoClaimAvailable = nextClaimTime > block.timestamp ?
                                                    nextClaimTime.sub(block.timestamp) :
                                                    0;
    }

    function getAccountAtIndex(uint256 index)
        public view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        if(index >= tokenHoldersMap.size()) {
            return (0x0000000000000000000000000000000000000000, -1, -1, 0, 0, 0, 0, 0);
        }

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

    function canAutoClaim(uint256 lastClaimTime) private view returns (bool) {
        if(lastClaimTime > block.timestamp)  {
            return false;
        }

        return block.timestamp.sub(lastClaimTime) >= claimWait;
    }

    function setBalance(address payable account, uint256 newBalance) external onlyOwner {
        if(excludedFromDividends[account]) {
            return;
        }

        if(newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
            tokenHoldersMap.set(account, newBalance);
        }
        else {
            _setBalance(account, 0);
            tokenHoldersMap.remove(account);
        }

        processAccount(account, true);
    }

    function process(uint256 gas) public returns (uint256, uint256, uint256) {
        uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;

        if(numberOfTokenHolders == 0) {
            return (0, 0, lastProcessedIndex);
        }

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

        while(gasUsed < gas && iterations < numberOfTokenHolders) {
            _lastProcessedIndex++;

            if(_lastProcessedIndex >= tokenHoldersMap.keys.length) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if(canAutoClaim(lastClaimTimes[account])) {
                if(processAccount(payable(account), true)) {
                    claims++;
                }
            }

            iterations++;

            uint256 newGasLeft = gasleft();

            if(gasLeft > newGasLeft) {
                gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            }

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

    function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
        uint256 amount = _withdrawDividendOfUser(account);

        if(amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }

        return false;
    }
}

contract BleYd is ERC20, Ownable {
    uint256 public liquidityFeeOnBuy;
    uint256 public treasuryFeeOnBuy;
    uint256 public rewardsFeeOnBuy;

    uint256 private totalBuyFee;

    uint256 public liquidityFeeOnSell;
    uint256 public treasuryFeeOnSell;
    uint256 public rewardsFeeOnSell;

    uint256 private totalSellFee;

    address public treasuryWallet;

    IUniswapV2Router02 public uniswapV2Router;
    address public  uniswapV2Pair;
    
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;

    bool    private swapping;
    uint256 public swapTokensAtAmount;

    bool    public swapEnabled;
    bool    public tradingEnabled;

    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) public automatedMarketMakerPairs;

    DividendTracker public dividendTracker;
    address public immutable rewardToken;
    uint256 public gasForProcessing = 300_000;

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event TreasuryWalletChanged(address treasuryWallet);
    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event SellFeesUpdated(uint256 totalSellFee);
    event BuyFeesUpdated(uint256 totalBuyFee);
    event TransferFeesUpdated(uint256 fee1, uint256 fee2);

    event SwapAndLiquify(uint256 tokensSwapped, uint256 bnbReceived, uint256 tokensIntoLiqudity);
    event SendMarketing(uint256 bnbSend);
    event UpdateUniswapV2Router(address indexed newAddress, address indexed oldAddress);
    event UpdateDividendTracker(address indexed newAddress, address indexed oldAddress);
    event GasForProcessingUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event SendDividends(uint256 amount);
    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    constructor() payable ERC20("Black Eyed Dragon", "BleYd") {

        rewardToken = 0xdAC17F958D2ee523a2206206994597C13D831ec7; // USDT

        liquidityFeeOnBuy   = 1;
        treasuryFeeOnBuy    = 4;
        rewardsFeeOnBuy     = 0;

        totalBuyFee         = liquidityFeeOnBuy + treasuryFeeOnBuy + rewardsFeeOnBuy;

        liquidityFeeOnSell  = 1;
        treasuryFeeOnSell   = 4;
        rewardsFeeOnSell    = 0;

        totalSellFee        = liquidityFeeOnSell + treasuryFeeOnSell + rewardsFeeOnSell;

        treasuryWallet = 0x0F10A3c90e73FEaAdD6D0D4bDa302891160D0F24;

        dividendTracker = new DividendTracker(1_000_000, rewardToken);

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // PCS Mainnet
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair   = _uniswapV2Pair;

        _approve(address(this), address(uniswapV2Router), type(uint256).max);

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        maxTransactionLimitEnabled = true;

        _isExcludedFromMaxTxLimit[owner()] = true;
        _isExcludedFromMaxTxLimit[address(this)] = true;
        _isExcludedFromMaxTxLimit[address(0xdead)] = true;
        _isExcludedFromMaxTxLimit[treasuryWallet] = true;
        _isExcludedFromMaxTxLimit[address(dividendTracker)] = true;

        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(DEAD);
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));

        _isExcludedFromFees[owner()] = true;
        _isExcludedFromFees[DEAD] = true;
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[treasuryWallet] = true;
    
        _mint(owner(), 100_000_000_000 * (10 ** 9));
        swapTokensAtAmount = totalSupply() / 5000;
        maxTransactionAmountBuy  = totalSupply() * 5 / 1000;
        maxTransactionAmountSell = totalSupply();
    }

    receive() external payable {

    }

    function claimStuckTokens(address token) external onlyOwner {
        require(token != address(this), "Owner cannot claim native tokens");
        if (token == address(0x0)) {
            payable(msg.sender).transfer(address(this).balance);
            return;
        }
        IERC20 ERC20token = IERC20(token);
        uint256 balance = ERC20token.balanceOf(address(this));
        ERC20token.transfer(msg.sender, balance);
    }

    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

    function sendBNB(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(automatedMarketMakerPairs[pair] != value, "Automated market maker pair is already set to that value");
        automatedMarketMakerPairs[pair] = value;

        if(value) {
            dividendTracker.excludeFromDividends(pair);
        }

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function excludeFromFees(address account, bool excluded) external onlyOwner {
        require(_isExcludedFromFees[account] != excluded, "Account is already set to that state");
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }

    function updateBuyFees(uint256 _liquidityFeeOnBuy, uint256 _treasuryFeeOnBuy, uint256 _rewardsFeeOnBuy) external onlyOwner {
        liquidityFeeOnBuy   = _liquidityFeeOnBuy;
        treasuryFeeOnBuy    = _treasuryFeeOnBuy;
        rewardsFeeOnBuy     = _rewardsFeeOnBuy;

        totalBuyFee = _liquidityFeeOnBuy + _treasuryFeeOnBuy + _rewardsFeeOnBuy;

        require(totalBuyFee <= 10, "Buy fee cannot be more than 10%");

        emit BuyFeesUpdated(totalBuyFee);
    }

    function updateSellFees(uint256 _liquidityFeeOnSell, uint256 _treasuryFeeOnSell, uint256 _rewardsFeeOnSell) external onlyOwner {
        liquidityFeeOnSell   = _liquidityFeeOnSell;
        treasuryFeeOnSell    = _treasuryFeeOnSell;
        rewardsFeeOnSell     = _rewardsFeeOnSell;

        totalSellFee = _liquidityFeeOnSell + _treasuryFeeOnSell + _rewardsFeeOnSell;

        require(totalSellFee <= 10, "Sell fee cannot be more than 10%");

        emit SellFeesUpdated(totalSellFee);
    }

    function changeTreasuryWallet(address _treasuryWallet) external onlyOwner {
        require(_treasuryWallet != treasuryWallet, "Marketing wallet is already that address");
        require(!isContract(_treasuryWallet), "Marketing wallet cannot be a contract");
        require(_treasuryWallet != DEAD, "Marketing wallet cannot be the zero address");
        treasuryWallet = _treasuryWallet;
        emit TreasuryWalletChanged(treasuryWallet);
    }

    function enableTrading() external onlyOwner{
        require(!tradingEnabled, "Trading already enabled.");
        tradingEnabled = true;
        swapEnabled = true;
    }

    function setSwapEnabled(bool _enabled) external onlyOwner{
        require(swapEnabled != _enabled, "swapEnabled already at this state.");
        swapEnabled = _enabled;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(tradingEnabled || _isExcludedFromFees[from] || _isExcludedFromFees[to], "Trading not yet enabled!");

        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (maxTransactionLimitEnabled) 
        {
            if ((from == uniswapV2Pair || to == uniswapV2Pair) &&
                _isExcludedFromMaxTxLimit[from] == false && 
                _isExcludedFromMaxTxLimit[to]   == false
            ) {
                if (from == uniswapV2Pair) {
                    require(
                        amount <= maxTransactionAmountBuy,  
                        "AntiWhale: Transfer amount exceeds the maxTransactionAmount"
                    );
                } else {
                    require(
                        amount <= maxTransactionAmountSell, 
                        "AntiWhale: Transfer amount exceeds the maxTransactionAmount"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( canSwap &&
            !swapping &&
            automatedMarketMakerPairs[to] &&
            totalBuyFee + totalSellFee > 0 &&
            swapEnabled
        ) {
            swapping = true;
            
            uint256 liquidityTokens;

            if(liquidityFeeOnBuy + liquidityFeeOnSell > 0) {
                liquidityTokens = contractTokenBalance * (liquidityFeeOnBuy + liquidityFeeOnSell) / 100;
                swapAndLiquify(liquidityTokens);
            }

            contractTokenBalance -= liquidityTokens;

            uint256 bnbShare = (treasuryFeeOnBuy + treasuryFeeOnSell) + (rewardsFeeOnBuy + rewardsFeeOnSell);
            
            if(contractTokenBalance > 0 && bnbShare > 0) {
                uint256 initialBalance = address(this).balance;

                address[] memory path = new address[](2);
                path[0] = address(this);
                path[1] = uniswapV2Router.WETH();

                uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
                    contractTokenBalance,
                    0,
                    path,
                    address(this),
                    block.timestamp);
                
                uint256 newBalance = address(this).balance - initialBalance;

                if((treasuryFeeOnBuy + treasuryFeeOnSell) > 0) {
                    uint256 treasuryBNB = newBalance * (treasuryFeeOnBuy + treasuryFeeOnSell) / bnbShare;
                    sendBNB(payable(treasuryWallet), treasuryBNB);
                    emit SendMarketing(treasuryBNB);
                }

                if((rewardsFeeOnBuy + rewardsFeeOnSell) > 0) {
                    uint256 rewardBNB = newBalance * (rewardsFeeOnBuy + rewardsFeeOnSell) / bnbShare;
                    swapAndSendDividends(rewardBNB);
                }
            }

            swapping = false;
        }

        bool takeFee = !swapping;

        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        // w2w & not excluded from fees
        if(from != uniswapV2Pair && to != uniswapV2Pair && takeFee) {
            takeFee = false;
        }

        if(takeFee) {
            uint256 _totalFees;
            if(from == uniswapV2Pair) {
                _totalFees = totalBuyFee;
            } else {
                _totalFees = totalSellFee;
            }
            uint256 fees = amount * _totalFees / 100;
            
            amount = amount - fees;

            super._transfer(from, address(this), fees);
        }

        super._transfer(from, to, amount);

        try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}

        if(!swapping) {
            uint256 gas = gasForProcessing;

            try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
            }
            catch {

            }
        }
    }

    /////////////////////////////////////// MAX-TRANSACTION SYSTEM

    mapping(address => bool) private _isExcludedFromMaxTxLimit;
    bool    public  maxTransactionLimitEnabled;
    uint256 public  maxTransactionAmountBuy;
    uint256 public  maxTransactionAmountSell;

    event ExcludedFromMaxTransactionLimit(address indexed account, bool isExcluded);
    event MaxTransactionLimitStateChanged(bool maxTransactionLimit);
    event MaxTransactionLimitAmountChanged(uint256 maxTransactionAmountBuy, uint256 maxTransactionAmountSell);

    function setEnableMaxTransactionLimit(bool enable) external onlyOwner {
        require(enable != maxTransactionLimitEnabled, "Max transaction limit is already set to that state");
        maxTransactionLimitEnabled = enable;

        emit MaxTransactionLimitStateChanged(maxTransactionLimitEnabled);
    }

    function setMaxTransactionAmounts(uint256 _maxTransactionAmountBuy, uint256 _maxTransactionAmountSell) external onlyOwner {
        require(
            _maxTransactionAmountBuy  >= (totalSupply() / (10 ** decimals())) / 1_000 && 
            _maxTransactionAmountSell >= (totalSupply() / (10 ** decimals())) / 1_000, 
            "Max Transaction limis cannot be lower than 0.1% of total supply"
        ); 
        maxTransactionAmountBuy  = _maxTransactionAmountBuy  * (10 ** decimals());
        maxTransactionAmountSell = _maxTransactionAmountSell * (10 ** decimals());

        emit MaxTransactionLimitAmountChanged(maxTransactionAmountBuy, maxTransactionAmountSell);
    }

    function excludeFromMaxTransactionLimit(address account, bool exclude) external onlyOwner {
        require( _isExcludedFromMaxTxLimit[account] != exclude, "Account is already set to that state");
        _isExcludedFromMaxTxLimit[account] = exclude;

        emit ExcludedFromMaxTransactionLimit(account, exclude);
    }

    function isExcludedFromMaxTransaction(address account) public view returns(bool) {
        return _isExcludedFromMaxTxLimit[account];
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens / 2;
        uint256 otherHalf = tokens - half;

        uint256 initialBalance = address(this).balance;

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            half,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp);
        
        uint256 newBalance = address(this).balance - initialBalance;

        uniswapV2Router.addLiquidityETH{value: newBalance}(
            address(this),
            otherHalf,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            DEAD,
            block.timestamp
        );

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapAndSendDividends(uint256 amount) private{
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = rewardToken;

        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0,
            path,
            address(this),
            block.timestamp
        );
        
        uint256 balanceRewardToken = IERC20(rewardToken).balanceOf(address(this));
        bool success = IERC20(rewardToken).transfer(address(dividendTracker), balanceRewardToken);

        if (success) {
            dividendTracker.distributeDividends(balanceRewardToken);
            emit SendDividends(balanceRewardToken);
        }
    }

    function setSwapTokensAtAmount(uint256 newAmount) external onlyOwner{
        require(newAmount > totalSupply() / 100_000, "SwapTokensAtAmount must be greater than 0.001% of total supply");
        swapTokensAtAmount = newAmount;
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue >= 200_000 && newValue <= 500_000, "gasForProcessing must be between 200,000 and 500,000");
        require(newValue != gasForProcessing, "Cannot update gasForProcessing to same value");
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function updateMinimumBalanceForDividends(uint256 newMinimumBalance) external onlyOwner {
        dividendTracker.updateMinimumTokenBalanceForDividends(newMinimumBalance);
    }

    function updateClaimWait(uint256 newClaimWait) external onlyOwner {
        require(newClaimWait >= 3_600 && newClaimWait <= 86_400, "claimWait must be updated to between 1 and 24 hours");
        dividendTracker.updateClaimWait(newClaimWait);
    }

    function getClaimWait() external view returns(uint256) {
        return dividendTracker.claimWait();
    }

    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function withdrawableDividendOf(address account) public view returns(uint256) {
        return dividendTracker.withdrawableDividendOf(account);
    }

    function dividendTokenBalanceOf(address account) public view returns (uint256) {
        return dividendTracker.balanceOf(account);
    }

    function totalRewardsEarned(address account) public view returns (uint256) {
        return dividendTracker.accumulativeDividendOf(account);
    }

    function excludeFromDividends(address account) external onlyOwner{
        dividendTracker.excludeFromDividends(account);
    }

    function getAccountDividendsInfo(address account)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return dividendTracker.getAccount(account);
    }

    function getAccountDividendsInfoAtIndex(uint256 index)
        external view returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256) {
        return dividendTracker.getAccountAtIndex(index);
    }

    function processDividendTracker(uint256 gas) external {
        (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) = dividendTracker.process(gas);
        emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, false, gas, tx.origin);
    }

    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    function claimAddress(address claimee) external onlyOwner {
        dividendTracker.processAccount(payable(claimee), false);
    }

    function getLastProcessedIndex() external view returns(uint256) {
        return dividendTracker.getLastProcessedIndex();
    }

    function setLastProcessedIndex(uint256 index) external onlyOwner {
        dividendTracker.setLastProcessedIndex(index);
    }

    function getNumberOfDividendTokenHolders() external view returns(uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalBuyFee","type":"uint256"}],"name":"BuyFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromMaxTransactionLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTransactionAmountBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxTransactionAmountSell","type":"uint256"}],"name":"MaxTransactionLimitAmountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"maxTransactionLimit","type":"bool"}],"name":"MaxTransactionLimitStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalSellFee","type":"uint256"}],"name":"SellFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bnbSend","type":"uint256"}],"name":"SendMarketing","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bnbReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee2","type":"uint256"}],"name":"TransferFeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasuryWallet","type":"address"}],"name":"TreasuryWalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryWallet","type":"address"}],"name":"changeTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"claimee","type":"address"}],"name":"claimAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"claimStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract DividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeFromMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromMaxTransaction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmountBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmountSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionLimitEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setEnableMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"setLastProcessedIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTransactionAmountBuy","type":"uint256"},{"internalType":"uint256","name":"_maxTransactionAmountSell","type":"uint256"}],"name":"setMaxTransactionAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"totalRewardsEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryFeeOnBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryFeeOnSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFeeOnBuy","type":"uint256"},{"internalType":"uint256","name":"_treasuryFeeOnBuy","type":"uint256"},{"internalType":"uint256","name":"_rewardsFeeOnBuy","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newClaimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMinimumBalance","type":"uint256"}],"name":"updateMinimumBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"_treasuryFeeOnSell","type":"uint256"},{"internalType":"uint256","name":"_rewardsFeeOnSell","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

620493e0601655601160a090815270213630b1b59022bcb2b210223930b3b7b760791b60c052610120604052600560e090815264109b19565960da1b6101005260036200004d838262000b94565b5060046200005c828262000b94565b50505062000079620000736200068060201b60201c565b62000684565b73dac17f958d2ee523a2206206994597c13d831ec760805260016006819055600460078190556000600881905591620000b3919062000c76565b620000bf919062000c76565b6009556001600a8190556004600b8190556000600c81905591620000e4919062000c76565b620000f0919062000c76565b600d55600e80546001600160a01b031916730f10a3c90e73feaadd6d0d4bda302891160d0f24179055608051604051620f42409190620001309062000ae2565b9182526001600160a01b03166020820152604001604051809103906000f08015801562000161573d6000803e3d6000fd5b50601560006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000737a250d5630b4cf539739df2c5dacb4c659f2488d90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000208919062000c8c565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000256573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027c919062000c8c565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620002ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002f0919062000c8c565b600f80546001600160a01b038086166001600160a01b03199283168117909355601080549185169190921617905590915062000331903090600019620006d6565b6200033e81600162000802565b6018805460ff1916600190811790915560176000620003656005546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260179093528183208054851660019081179091557f43fedf50e12e5c047fbe3576d03ab50250348e9a6030f531ab6d4ce10f5b03038054861682179055600e548216845282842080548616821790556015805483168552938390208054909516179093559054905163031e79db60e41b8152911660048201819052906331e79db090602401600060405180830381600087803b1580156200043657600080fd5b505af11580156200044b573d6000803e3d6000fd5b505060155460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200049557600080fd5b505af1158015620004aa573d6000803e3d6000fd5b505060155460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620004f657600080fd5b505af11580156200050b573d6000803e3d6000fd5b505060155460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200055757600080fd5b505af11580156200056c573d6000803e3d6000fd5b50505050600160136000620005866200096660201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905560139093527f2264e2d7bacabe6058f5009f42467b9be28015e7760f87409562384c94ac271c8054851660019081179091553084528284208054861682179055600e549091168352912080549092161790556200062d6200061d6005546001600160a01b031690565b68056bc75e2d6310000062000975565b6113886200063a60025490565b62000646919062000cb7565b6011556103e86200065660025490565b6200066390600562000cda565b6200066f919062000cb7565b6019555050600254601a5562000cf4565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166200073e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620007a15760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000735565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03821660009081526014602052604090205481151560ff9091161515036200089a5760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c75650000000000000000606482015260840162000735565b6001600160a01b0382166000908152601460205260409020805460ff191682158015919091179091556200092a5760155460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200091057600080fd5b505af115801562000925573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6005546001600160a01b031690565b6001600160a01b038216620009cd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000735565b620009e98160025462000a7660201b620021ab1790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a1c918390620021ab62000a76821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b60008062000a85838562000c76565b90508381101562000ad95760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640162000735565b90505b92915050565b6122cd806200481583390190565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000b1b57607f821691505b60208210810362000b3c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a7157600081815260208120601f850160051c8101602086101562000b6b5750805b601f850160051c820191505b8181101562000b8c5782815560010162000b77565b505050505050565b81516001600160401b0381111562000bb05762000bb062000af0565b62000bc88162000bc1845462000b06565b8462000b42565b602080601f83116001811462000c00576000841562000be75750858301515b600019600386901b1c1916600185901b17855562000b8c565b600085815260208120601f198616915b8281101562000c315788860151825594840194600190910190840162000c10565b508582101562000c505787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000adc5762000adc62000c60565b60006020828403121562000c9f57600080fd5b81516001600160a01b038116811462000ad957600080fd5b60008262000cd557634e487b7160e01b600052601260045260246000fd5b500490565b808202811582820484141762000adc5762000adc62000c60565b608051613af062000d2560003960008181610ba201528181613133015281816131f301526132970152613af06000f3fe6080604052600436106103bc5760003560e01c80637b3c83b1116101f2578063b6f7f6811161010d578063e4893fdc116100a0578063f27fd2541161006f578063f27fd25414610b50578063f2fde38b14610b70578063f7c618c114610b90578063f9d0831a14610bc457600080fd5b8063e4893fdc14610ae5578063e4f24cb014610afb578063e7841ec014610b1b578063e98030c714610b3057600080fd5b8063cdd4bd79116100dc578063cdd4bd7914610a53578063dd62ed3e14610a69578063e01af92c14610aaf578063e2f4560514610acf57600080fd5b8063b6f7f681146109dd578063b94315ff146109fd578063c024666814610a13578063c17b5b8c14610a3357600080fd5b80639c1b8af511610185578063a9059cbb11610154578063a9059cbb14610908578063ad56c13c14610928578063afa4f3b21461098d578063b62496f5146109ad57600080fd5b80639c1b8af51461089d578063a26579ad146108b3578063a457c2d7146108c8578063a8b9d240146108e857600080fd5b8063880bcbc1116101c1578063880bcbc1146108355780638a8c523c146108555780638da5cb5b1461086a57806395d89b411461088857600080fd5b80637b3c83b1146107c95780638095d564146107df578063824e4605146107ff578063871c128d1461081557600080fd5b80633b364da8116102e257806356a6cabf116102755780636ddd1713116102445780636ddd171314610744578063700bb1911461075e57806370a082311461077e578063715018a6146107b457600080fd5b806356a6cabf146106d957806359136fa5146106f957806364b0f6531461070f5780636843cd841461072457600080fd5b80634ada218b116102b15780634ada218b1461064c5780634e71d92d1461066b5780634fbee19314610680578063537c1ac7146106b957600080fd5b80633b364da8146105cc5780633f249df0146105ec5780634626402b1461060c57806349bd5a5e1461062c57600080fd5b8063286b3aa01161035a57806330bb4cff1161032957806330bb4cff1461055b578063313ce5671461057057806331e79db01461058c57806339509351146105ac57600080fd5b8063286b3aa0146104e95780632ba86bf21461050b5780632c1f5216146105255780632ce86fbf1461054557600080fd5b80631694505e116103965780631694505e1461044357806318160ddd1461047b57806318d9ceae1461049057806323b872dd146104c957600080fd5b80630105d0fd146103c857806306fdde03146103f1578063095ea7b31461041357600080fd5b366103c357005b600080fd5b3480156103d457600080fd5b506103de60195481565b6040519081526020015b60405180910390f35b3480156103fd57600080fd5b50610406610be4565b6040516103e891906133ab565b34801561041f57600080fd5b5061043361042e36600461340e565b610c76565b60405190151581526020016103e8565b34801561044f57600080fd5b50600f54610463906001600160a01b031681565b6040516001600160a01b0390911681526020016103e8565b34801561048757600080fd5b506002546103de565b34801561049c57600080fd5b506104336104ab36600461343a565b6001600160a01b031660009081526017602052604090205460ff1690565b3480156104d557600080fd5b506104336104e4366004613457565b610c8d565b3480156104f557600080fd5b50610509610504366004613498565b610cf6565b005b34801561051757600080fd5b506018546104339060ff1681565b34801561053157600080fd5b50601554610463906001600160a01b031681565b34801561055157600080fd5b506103de600a5481565b34801561056757600080fd5b506103de610d8b565b34801561057c57600080fd5b50604051600981526020016103e8565b34801561059857600080fd5b506105096105a736600461343a565b610dfe565b3480156105b857600080fd5b506104336105c736600461340e565b610e5a565b3480156105d857600080fd5b506105096105e7366004613498565b610e90565b3480156105f857600080fd5b5061050961060736600461343a565b610eeb565b34801561061857600080fd5b50600e54610463906001600160a01b031681565b34801561063857600080fd5b50601054610463906001600160a01b031681565b34801561065857600080fd5b5060125461043390610100900460ff1681565b34801561067757600080fd5b50610509610f90565b34801561068c57600080fd5b5061043361069b36600461343a565b6001600160a01b031660009081526013602052604090205460ff1690565b3480156106c557600080fd5b506105096106d436600461343a565b611008565b3480156106e557600080fd5b506105096106f43660046134bf565b6111cb565b34801561070557600080fd5b506103de601a5481565b34801561071b57600080fd5b506103de6112af565b34801561073057600080fd5b506103de61073f36600461343a565b6112f9565b34801561075057600080fd5b506012546104339060ff1681565b34801561076a57600080fd5b50610509610779366004613498565b611369565b34801561078a57600080fd5b506103de61079936600461343a565b6001600160a01b031660009081526020819052604090205490565b3480156107c057600080fd5b5061050961143b565b3480156107d557600080fd5b506103de60065481565b3480156107eb57600080fd5b506105096107fa3660046134dc565b611471565b34801561080b57600080fd5b506103de60075481565b34801561082157600080fd5b50610509610830366004613498565b611554565b34801561084157600080fd5b50610509610850366004613508565b611696565b34801561086157600080fd5b50610509611760565b34801561087657600080fd5b506005546001600160a01b0316610463565b34801561089457600080fd5b506104066117f3565b3480156108a957600080fd5b506103de60165481565b3480156108bf57600080fd5b506103de611802565b3480156108d457600080fd5b506104336108e336600461340e565b61184c565b3480156108f457600080fd5b506103de61090336600461343a565b61189b565b34801561091457600080fd5b5061043361092336600461340e565b6118ce565b34801561093457600080fd5b5061094861094336600461343a565b6118db565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016103e8565b34801561099957600080fd5b506105096109a8366004613498565b611976565b3480156109b957600080fd5b506104336109c836600461343a565b60146020526000908152604090205460ff1681565b3480156109e957600080fd5b506105096109f8366004613541565b611a30565b348015610a0957600080fd5b506103de600c5481565b348015610a1f57600080fd5b50610509610a2e366004613508565b611b9f565b348015610a3f57600080fd5b50610509610a4e3660046134dc565b611c61565b348015610a5f57600080fd5b506103de600b5481565b348015610a7557600080fd5b506103de610a84366004613563565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610abb57600080fd5b50610509610aca3660046134bf565b611d37565b348015610adb57600080fd5b506103de60115481565b348015610af157600080fd5b506103de60085481565b348015610b0757600080fd5b506103de610b1636600461343a565b611dd9565b348015610b2757600080fd5b506103de611e0c565b348015610b3c57600080fd5b50610509610b4b366004613498565b611e56565b348015610b5c57600080fd5b50610948610b6b366004613498565b611f2e565b348015610b7c57600080fd5b50610509610b8b36600461343a565b611f70565b348015610b9c57600080fd5b506104637f000000000000000000000000000000000000000000000000000000000000000081565b348015610bd057600080fd5b50610509610bdf36600461343a565b612008565b606060038054610bf390613591565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1f90613591565b8015610c6c5780601f10610c4157610100808354040283529160200191610c6c565b820191906000526020600020905b815481529060010190602001808311610c4f57829003601f168201915b5050505050905090565b6000610c83338484612211565b5060015b92915050565b6000610c9a848484612336565b610cec8433610ce785604051806060016040528060288152602001613a6e602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612b77565b612211565b5060019392505050565b6005546001600160a01b03163314610d295760405162461bcd60e51b8152600401610d20906135cb565b60405180910390fd5b60155460405163014359d560e51b8152600481018390526001600160a01b039091169063286b3aa0906024015b600060405180830381600087803b158015610d7057600080fd5b505af1158015610d84573d6000803e3d6000fd5b5050505050565b601554604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df99190613600565b905090565b6005546001600160a01b03163314610e285760405162461bcd60e51b8152600401610d20906135cb565b60155460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401610d56565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c83918590610ce790866121ab565b6005546001600160a01b03163314610eba5760405162461bcd60e51b8152600401610d20906135cb565b601554604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e8990602401610d56565b6005546001600160a01b03163314610f155760405162461bcd60e51b8152600401610d20906135cb565b60155460405163bc4c4b3760e01b81526001600160a01b038381166004830152600060248301529091169063bc4c4b37906044016020604051808303816000875af1158015610f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8c9190613619565b5050565b60155460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610fe1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110059190613619565b50565b6005546001600160a01b031633146110325760405162461bcd60e51b8152600401610d20906135cb565b600e546001600160a01b03908116908216036110a15760405162461bcd60e51b815260206004820152602860248201527f4d61726b6574696e672077616c6c657420697320616c72656164792074686174604482015267206164647265737360c01b6064820152608401610d20565b6001600160a01b0381163b156111075760405162461bcd60e51b815260206004820152602560248201527f4d61726b6574696e672077616c6c65742063616e6e6f74206265206120636f6e6044820152641d1c9858dd60da1b6064820152608401610d20565b61deac196001600160a01b038216016111765760405162461bcd60e51b815260206004820152602b60248201527f4d61726b6574696e672077616c6c65742063616e6e6f7420626520746865207a60448201526a65726f206164647265737360a81b6064820152608401610d20565b600e80546001600160a01b0319166001600160a01b0383169081179091556040519081527f2551960305e8f85b09658bb3075878e3e3cef37a5f7b5d43261f5e6f36b3d6a4906020015b60405180910390a150565b6005546001600160a01b031633146111f55760405162461bcd60e51b8152600401610d20906135cb565b60185460ff161515811515036112685760405162461bcd60e51b815260206004820152603260248201527f4d6178207472616e73616374696f6e206c696d697420697320616c72656164796044820152712073657420746f207468617420737461746560701b6064820152608401610d20565b6018805460ff191682151590811790915560405160ff909116151581527fe81be35e61864c26afd7a4655e99f321378d0aaae1e5af8ee67b658a7460f3cf906020016111c0565b601554604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610dd5573d6000803e3d6000fd5b6015546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611345573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c879190613600565b6015546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af11580156113bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e09190613636565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146114655760405162461bcd60e51b8152600401610d20906135cb565b61146f6000612bb1565b565b6005546001600160a01b0316331461149b5760405162461bcd60e51b8152600401610d20906135cb565b600683905560078290556008819055806114b5838561367a565b6114bf919061367a565b6009819055600a10156115145760405162461bcd60e51b815260206004820152601f60248201527f427579206665652063616e6e6f74206265206d6f7265207468616e20313025006044820152606401610d20565b7f491005465ab6f82fd10f4b13a1b1e5ca452bc4856b019f63775e33a6b1ad2feb60095460405161154791815260200190565b60405180910390a1505050565b6005546001600160a01b0316331461157e5760405162461bcd60e51b8152600401610d20906135cb565b62030d40811015801561159457506207a1208111155b6115fd5760405162461bcd60e51b815260206004820152603460248201527f676173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b6064820152608401610d20565b60165481036116635760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610d20565b60165460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601655565b6005546001600160a01b031633146116c05760405162461bcd60e51b8152600401610d20906135cb565b6001600160a01b03821660009081526017602052604090205481151560ff9091161515036117005760405162461bcd60e51b8152600401610d209061368d565b6001600160a01b038216600081815260176020908152604091829020805460ff191685151590811790915591519182527f8727c4afe988887760e8db0bbad9f9fcceee6428545956832f67c8fdbd589c1091015b60405180910390a25050565b6005546001600160a01b0316331461178a5760405162461bcd60e51b8152600401610d20906135cb565b601254610100900460ff16156117e25760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e00000000000000006044820152606401610d20565b6012805461ffff1916610101179055565b606060048054610bf390613591565b60155460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015610dd5573d6000803e3d6000fd5b6000610c833384610ce785604051806060016040528060258152602001613a96602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612b77565b6015546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611328565b6000610c83338484612336565b60155460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa158015611937573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195b91906136d1565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146119a05760405162461bcd60e51b8152600401610d20906135cb565b620186a06119ad60025490565b6119b7919061373b565b8111611a2b5760405162461bcd60e51b815260206004820152603e60248201527f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460448201527f6572207468616e20302e30303125206f6620746f74616c20737570706c7900006064820152608401610d20565b601155565b6005546001600160a01b03163314611a5a5760405162461bcd60e51b8152600401610d20906135cb565b6103e8611a696009600a613841565b600254611a76919061373b565b611a80919061373b565b8210158015611ab457506103e8611a996009600a613841565b600254611aa6919061373b565b611ab0919061373b565b8110155b611b265760405162461bcd60e51b815260206004820152603f60248201527f4d6178205472616e73616374696f6e206c696d69732063616e6e6f742062652060448201527f6c6f776572207468616e20302e3125206f6620746f74616c20737570706c79006064820152608401610d20565b611b326009600a613841565b611b3c9083613850565b601955611b4b6009600a613841565b611b559082613850565b601a8190556019546040517f8c8cbc911b80df94332ececb8eb0945274d76fa965600a0f01f42af3f8afb13192611b93928252602082015260400190565b60405180910390a15050565b6005546001600160a01b03163314611bc95760405162461bcd60e51b8152600401610d20906135cb565b6001600160a01b03821660009081526013602052604090205481151560ff909116151503611c095760405162461bcd60e51b8152600401610d209061368d565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611754565b6005546001600160a01b03163314611c8b5760405162461bcd60e51b8152600401610d20906135cb565b600a839055600b829055600c81905580611ca5838561367a565b611caf919061367a565b600d819055600a1015611d045760405162461bcd60e51b815260206004820181905260248201527f53656c6c206665652063616e6e6f74206265206d6f7265207468616e203130256044820152606401610d20565b7f16df2c25b3392f376a685a3826b941b25140108d95899d6b1bd983feafbc1c55600d5460405161154791815260200190565b6005546001600160a01b03163314611d615760405162461bcd60e51b8152600401610d20906135cb565b60125481151560ff909116151503611dc65760405162461bcd60e51b815260206004820152602260248201527f73776170456e61626c656420616c726561647920617420746869732073746174604482015261329760f11b6064820152608401610d20565b6012805460ff1916911515919091179055565b6015546040516327ce014760e01b81526001600160a01b03838116600483015260009216906327ce014790602401611328565b6015546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015610dd5573d6000803e3d6000fd5b6005546001600160a01b03163314611e805760405162461bcd60e51b8152600401610d20906135cb565b610e108110158015611e955750620151808111155b611efd5760405162461bcd60e51b815260206004820152603360248201527f636c61696d57616974206d757374206265207570646174656420746f206265746044820152727765656e203120616e6420323420686f75727360681b6064820152608401610d20565b60155460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610d56565b601554604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611919565b6005546001600160a01b03163314611f9a5760405162461bcd60e51b8152600401610d20906135cb565b6001600160a01b038116611fff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d20565b61100581612bb1565b6005546001600160a01b031633146120325760405162461bcd60e51b8152600401610d20906135cb565b306001600160a01b0382160361208a5760405162461bcd60e51b815260206004820181905260248201527f4f776e65722063616e6e6f7420636c61696d206e617469766520746f6b656e736044820152606401610d20565b6001600160a01b0381166120c45760405133904780156108fc02916000818181858888f19350505050158015610f8c573d6000803e3d6000fd5b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561210d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121319190613600565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015612181573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a59190613619565b50505050565b6000806121b8838561367a565b90508381101561220a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610d20565b9392505050565b6001600160a01b0383166122735760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d20565b6001600160a01b0382166122d45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d20565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661235c5760405162461bcd60e51b8152600401610d2090613867565b6001600160a01b0382166123825760405162461bcd60e51b8152600401610d20906138ac565b601254610100900460ff16806123b057506001600160a01b03831660009081526013602052604090205460ff165b806123d357506001600160a01b03821660009081526013602052604090205460ff165b61241f5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610d20565b806000036124385761243383836000612c03565b505050565b60185460ff161561251a576010546001600160a01b038481169116148061246c57506010546001600160a01b038381169116145b801561249157506001600160a01b03831660009081526017602052604090205460ff16155b80156124b657506001600160a01b03821660009081526017602052604090205460ff16155b1561251a576010546001600160a01b03908116908416036124f8576019548111156124f35760405162461bcd60e51b8152600401610d20906138ef565b61251a565b601a5481111561251a5760405162461bcd60e51b8152600401610d20906138ef565b30600090815260208190526040902054601154811080159081906125485750601054600160a01b900460ff16155b801561256c57506001600160a01b03841660009081526014602052604090205460ff165b801561258757506000600d54600954612585919061367a565b115b8015612595575060125460ff165b15612886576010805460ff60a01b1916600160a01b179055600a5460065460009182916125c2919061367a565b11156125f9576064600a546006546125da919061367a565b6125e49085613850565b6125ee919061373b565b90506125f981612d0c565b612603818461394c565b92506000600c54600854612617919061367a565b600b54600754612627919061367a565b612631919061367a565b90506000841180156126435750600081115b15612876576040805160028082526060820183524792600092919060208301908036833701905050905030816000815181106126815761268161395f565b6001600160a01b03928316602091820292909201810191909152600f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156126da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fe9190613975565b816001815181106127115761271161395f565b6001600160a01b039283166020918202929092010152600f5460405163791ac94760e01b815291169063791ac947906127579089906000908690309042906004016139d6565b600060405180830381600087803b15801561277157600080fd5b505af1158015612785573d6000803e3d6000fd5b5050505060008247612797919061394c565b90506000600b546007546127ab919061367a565b111561282657600084600b546007546127c4919061367a565b6127ce9084613850565b6127d8919061373b565b600e549091506127f1906001600160a01b031682612f57565b6040518181527fddce3d5e4f18a9c2902704a38b56baadd81a9af59b8ded8a3220b6a6c1696b6b9060200160405180910390a1505b6000600c54600854612838919061367a565b111561287257600084600c54600854612851919061367a565b61285b9084613850565b612865919061373b565b905061287081613070565b505b5050505b50506010805460ff60a01b191690555b6010546001600160a01b03861660009081526013602052604090205460ff600160a01b9092048216159116806128d457506001600160a01b03851660009081526013602052604090205460ff165b156128dd575060005b6010546001600160a01b0387811691161480159061290957506010546001600160a01b03868116911614155b80156129125750805b1561291b575060005b801561297c576010546000906001600160a01b03908116908816036129435750600954612948565b50600d545b600060646129568388613850565b612960919061373b565b905061296c818761394c565b9550612979883083612c03565b50505b612987868686612c03565b6015546001600160a01b031663e30443bc876129b8816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156129fe57600080fd5b505af1925050508015612a0f575060015b506015546001600160a01b031663e30443bc86612a41816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612a8757600080fd5b505af1925050508015612a98575060015b50601054600160a01b900460ff16612b6f576016546015546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015612b17575060408051601f3d908101601f19168201909252612b1491810190613636565b60015b15612b6d5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050565b60008184841115612b9b5760405162461bcd60e51b8152600401610d2091906133ab565b506000612ba8848661394c565b95945050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316612c295760405162461bcd60e51b8152600401610d2090613867565b6001600160a01b038216612c4f5760405162461bcd60e51b8152600401610d20906138ac565b612c8c81604051806060016040528060268152602001613a48602691396001600160a01b0386166000908152602081905260409020549190612b77565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612cbb90826121ab565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612329565b6000612d1960028361373b565b90506000612d27828461394c565b60408051600280825260608201835292935047926000926020830190803683370190505090503081600081518110612d6157612d6161395f565b6001600160a01b03928316602091820292909201810191909152600f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dde9190613975565b81600181518110612df157612df161395f565b6001600160a01b039283166020918202929092010152600f5460405163791ac94760e01b815291169063791ac94790612e379087906000908690309042906004016139d6565b600060405180830381600087803b158015612e5157600080fd5b505af1158015612e65573d6000803e3d6000fd5b5050505060008247612e77919061394c565b600f5460405163f305d71960e01b815230600482015260248101879052600060448201819052606482015261dead60848201524260a48201529192506001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015612ee6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612f0b9190613636565b505060408051878152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a1505050505050565b80471015612fa75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d20565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612ff4576040519150601f19603f3d011682016040523d82523d6000602084013e612ff9565b606091505b50509050806124335760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d20565b6040805160028082526060820183526000926020830190803683375050600f54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156130da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130fe9190613975565b816000815181106131115761311161395f565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106131655761316561395f565b6001600160a01b039283166020918202929092010152600f5460405163b6f9de9560e01b815291169063b6f9de959084906131ab90600090869030904290600401613a12565b6000604051808303818588803b1580156131c457600080fd5b505af11580156131d8573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600093507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031692506370a082319150602401602060405180830381865afa158015613244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132689190613600565b60155460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192506000917f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af11580156132e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133069190613619565b905080156121a557601554604051633243c79160e01b8152600481018490526001600160a01b0390911690633243c79190602401600060405180830381600087803b15801561335457600080fd5b505af1158015613368573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b18260405161339d91815260200190565b60405180910390a150505050565b600060208083528351808285015260005b818110156133d8578581018301518582016040015282016133bc565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461100557600080fd5b6000806040838503121561342157600080fd5b823561342c816133f9565b946020939093013593505050565b60006020828403121561344c57600080fd5b813561220a816133f9565b60008060006060848603121561346c57600080fd5b8335613477816133f9565b92506020840135613487816133f9565b929592945050506040919091013590565b6000602082840312156134aa57600080fd5b5035919050565b801515811461100557600080fd5b6000602082840312156134d157600080fd5b813561220a816134b1565b6000806000606084860312156134f157600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561351b57600080fd5b8235613526816133f9565b91506020830135613536816134b1565b809150509250929050565b6000806040838503121561355457600080fd5b50508035926020909101359150565b6000806040838503121561357657600080fd5b8235613581816133f9565b91506020830135613536816133f9565b600181811c908216806135a557607f821691505b6020821081036135c557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561361257600080fd5b5051919050565b60006020828403121561362b57600080fd5b815161220a816134b1565b60008060006060848603121561364b57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c8757610c87613664565b60208082526024908201527f4163636f756e7420697320616c72656164792073657420746f207468617420736040820152637461746560e01b606082015260800190565b600080600080600080600080610100898b0312156136ee57600080fd5b88516136f9816133f9565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008261375857634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561379857816000190482111561377e5761377e613664565b8085161561378b57918102915b93841c9390800290613762565b509250929050565b6000826137af57506001610c87565b816137bc57506000610c87565b81600181146137d257600281146137dc576137f8565b6001915050610c87565b60ff8411156137ed576137ed613664565b50506001821b610c87565b5060208310610133831016604e8410600b841016171561381b575081810a610c87565b613825838361375d565b806000190482111561383957613839613664565b029392505050565b600061220a60ff8416836137a0565b8082028115828204841417610c8757610c87613664565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252603b908201527f416e74695768616c653a205472616e7366657220616d6f756e7420657863656560408201527f647320746865206d61785472616e73616374696f6e416d6f756e740000000000606082015260800190565b81810381811115610c8757610c87613664565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561398757600080fd5b815161220a816133f9565b600081518084526020808501945080840160005b838110156139cb5781516001600160a01b0316875295820195908201906001016139a6565b509495945050505050565b85815284602082015260a0604082015260006139f560a0830186613992565b6001600160a01b0394909416606083015250608001529392505050565b848152608060208201526000613a2b6080830186613992565b6001600160a01b0394909416604083015250606001529291505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f1b103ac122c2eb32e7ebb693f013d2290b22b30b2a0e02ef722ce4e6ca3ceeb64736f6c6343000811003360a06040523480156200001157600080fd5b50604051620022cd380380620022cd833981016040819052620000349162000149565b6040518060400160405280600e81526020016d2932bbb0b932102a3930b1b5b2b960911b8152506040518060400160405280600f81526020016e2234bb34b232b7322a3930b1b5b2b960891b81525082828281600390816200009791906200022d565b506004620000a682826200022d565b505050620000c3620000bd620000f360201b60201c565b620000f7565b6001600160a01b03166080525050610e10601155620000e782633b9aca00620002f9565b60125550620003259050565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080604083850312156200015d57600080fd5b825160208401519092506001600160a01b03811681146200017d57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620001b357607f821691505b602082108103620001d457634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200022857600081815260208120601f850160051c81016020861015620002035750805b601f850160051c820191505b8181101562000224578281556001016200020f565b5050505b505050565b81516001600160401b0381111562000249576200024962000188565b62000261816200025a84546200019e565b84620001da565b602080601f831160018114620002995760008415620002805750858301515b600019600386901b1c1916600185901b17855562000224565b600085815260208120601f198616915b82811015620002ca57888601518255948401946001909101908401620002a9565b5085821015620002e95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820281158282048414176200031f57634e487b7160e01b600052601160045260246000fd5b92915050565b608051611f85620003486000396000818161055401526117e20152611f856000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c8063715018a611610130578063bc4c4b37116100b8578063e98030c71161007c578063e98030c714610529578063f2fde38b1461053c578063f7c618c11461054f578063fbcbc0f114610576578063ffb2c4791461058957600080fd5b8063bc4c4b37146104b9578063be10b614146104cc578063dd62ed3e146104d5578063e30443bc1461050e578063e7841ec01461052157600080fd5b806395d89b41116100ff57806395d89b411461044f578063a457c2d714610457578063a8b9d2401461046a578063a9059cbb1461047d578063aafd847a1461049057600080fd5b8063715018a61461040657806385a6b3ae1461040e5780638da5cb5b1461041757806391b89fba1461043c57600080fd5b80633009a609116101be5780634e7b827f116101825780634e7b827f146103515780635183d6fd146103745780636a474002146103cc5780636f2789ec146103d457806370a08231146103dd57600080fd5b80633009a60914610300578063313ce5671461030957806331e79db0146103185780633243c7911461032b578063395093511461033e57600080fd5b806318160ddd1161020557806318160ddd1461029f578063226cfa3d146102a757806323b872dd146102c757806327ce0147146102da578063286b3aa0146102ed57600080fd5b806306fdde0314610237578063095ea7b31461025557806309bbedde146102785780630dcb2e891461028a575b600080fd5b61023f6105b7565b60405161024c9190611bb7565b60405180910390f35b610268610263366004611c1a565b610649565b604051901515815260200161024c565b600a545b60405190815260200161024c565b61029d610298366004611c46565b610660565b005b60025461027c565b61027c6102b5366004611c5f565b60106020526000908152604090205481565b6102686102d5366004611c7c565b610722565b61027c6102e8366004611c5f565b61078b565b61029d6102fb366004611c46565b6107e7565b61027c600e5481565b6040516009815260200161024c565b61029d610326366004611c5f565b610816565b61029d610339366004611c46565b61093d565b61026861034c366004611c1a565b6109fb565b61026861035f366004611c5f565b600f6020526000908152604090205460ff1681565b610387610382366004611c46565b610a31565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161024c565b61029d610b85565b61027c60115481565b61027c6103eb366004611c5f565b6001600160a01b031660009081526020819052604090205490565b61029d610c07565b61027c60075481565b6005546001600160a01b03165b6040516001600160a01b03909116815260200161024c565b61027c61044a366004611c5f565b610c3b565b61023f610c46565b610268610465366004611c1a565b610c55565b61027c610478366004611c5f565b610ca4565b61026861048b366004611c1a565b610cd0565b61027c61049e366004611c5f565b6001600160a01b031660009081526009602052604090205490565b6102686104c7366004611ccb565b610cdd565b61027c60125481565b61027c6104e3366004611d04565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61029d61051c366004611c1a565b610d8b565b600e5461027c565b61029d610537366004611c46565b610ef5565b61029d61054a366004611c5f565b61102e565b6104247f000000000000000000000000000000000000000000000000000000000000000081565b610387610584366004611c5f565b6110c6565b61059c610597366004611c46565b61122f565b6040805193845260208401929092529082015260600161024c565b6060600380546105c690611d32565b80601f01602080910402602001604051908101604052809291908181526020018280546105f290611d32565b801561063f5780601f106106145761010080835404028352916020019161063f565b820191906000526020600020905b81548152906001019060200180831161062257829003601f168201915b5050505050905090565b600061065633848461134c565b5060015b92915050565b6005546001600160a01b031633146106935760405162461bcd60e51b815260040161068a90611d6c565b60405180910390fd5b601254810361071d5760405162461bcd60e51b815260206004820152604a60248201527f4e6577206d696d696d756d2062616c616e636520666f72206469766964656e6460448201527f2063616e6e6f742062652073616d652061732063757272656e74206d696e696d606482015269756d2062616c616e636560b01b608482015260a40161068a565b601255565b600061072f848484611470565b610781843361077c85604051806060016040528060288152602001611f03602891396001600160a01b038a16600090815260016020908152604080832033845290915290205491906114af565b61134c565b5060019392505050565b6001600160a01b03811660009081526008602090815260408083205491839052822054600654600160801b926107dd926107d8926107d2916107cd91906114e9565b611572565b90611582565b6115c0565b61065a9190611db7565b6005546001600160a01b031633146108115760405162461bcd60e51b815260040161068a90611d6c565b600e55565b6005546001600160a01b031633146108405760405162461bcd60e51b815260040161068a90611d6c565b6001600160a01b0381166000908152600f602052604090205460ff161561086657600080fd5b6001600160a01b0381166000908152600f60205260408120805460ff191660011790556108949082906115d3565b60405163131836e760e21b8152600a60048201526001600160a01b038216602482015273fc5a64c58b109d04a7886948f9c113d8e3ef32cc90634c60db9c9060440160006040518083038186803b1580156108ee57600080fd5b505af4158015610902573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b6005546001600160a01b031633146109675760405162461bcd60e51b815260040161068a90611d6c565b600061097260025490565b1161097c57600080fd5b80156109f8576109af61098e60025490565b61099c83600160801b6114e9565b6109a69190611db7565b60065490611638565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a26007546109f49082611638565b6007555b50565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161065691859061077c9086611638565b600080600080600080600080600a73fc5a64c58b109d04a7886948f9c113d8e3ef32cc63deb3d89690916040518263ffffffff1660e01b8152600401610a7991815260200190565b602060405180830381865af4158015610a96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aba9190611dd9565b8910610adf575060009650600019955085945086935083925082915081905080610b7a565b6040516368d54f3f60e11b8152600a6004820152602481018a905260009073fc5a64c58b109d04a7886948f9c113d8e3ef32cc9063d1aa9e7e90604401602060405180830381865af4158015610b39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5d9190611df2565b9050610b68816110c6565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b815260206004820152604960248201527f77697468647261774469766964656e642064697361626c65642e20557365207460448201527f68652027636c61696d272066756e6374696f6e206f6e20746865206d61696e2060648201526831b7b73a3930b1ba1760b91b608482015260a40161068a565b565b6005546001600160a01b03163314610c315760405162461bcd60e51b815260040161068a90611d6c565b610c056000611697565b600061065a82610ca4565b6060600480546105c690611d32565b6000610656338461077c85604051806060016040528060258152602001611f2b602591393360009081526001602090815260408083206001600160a01b038d16845290915290205491906114af565b6001600160a01b03811660009081526009602052604081205461065a90610cca8461078b565b906116e9565b6000610656338484611470565b6005546000906001600160a01b03163314610d0a5760405162461bcd60e51b815260040161068a90611d6c565b6000610d158461172b565b90508015610d81576001600160a01b038416600081815260106020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610d6f9085815260200190565b60405180910390a3600191505061065a565b5060009392505050565b6005546001600160a01b03163314610db55760405162461bcd60e51b815260040161068a90611d6c565b6001600160a01b0382166000908152600f602052604090205460ff16610ef1576012548110610e6657610de882826115d3565b604051632f0ad01760e21b8152600a60048201526001600160a01b03831660248201526044810182905273fc5a64c58b109d04a7886948f9c113d8e3ef32cc9063bc2b405c9060640160006040518083038186803b158015610e4957600080fd5b505af4158015610e5d573d6000803e3d6000fd5b50505050610ee4565b610e718260006115d3565b60405163131836e760e21b8152600a60048201526001600160a01b038316602482015273fc5a64c58b109d04a7886948f9c113d8e3ef32cc90634c60db9c9060440160006040518083038186803b158015610ecb57600080fd5b505af4158015610edf573d6000803e3d6000fd5b505050505b610eef826001610cdd565b505b5050565b6005546001600160a01b03163314610f1f5760405162461bcd60e51b815260040161068a90611d6c565b610e108110158015610f345750620151808111155b610f9c5760405162461bcd60e51b815260206004820152603360248201527f636c61696d57616974206d757374206265207570646174656420746f206265746044820152727765656e203120616e6420323420686f75727360681b606482015260840161068a565b6011548103610ffb5760405162461bcd60e51b815260206004820152602560248201527f43616e6e6f742075706461746520636c61696d5761697420746f2073616d652060448201526476616c756560d81b606482015260840161068a565b60115460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601155565b6005546001600160a01b031633146110585760405162461bcd60e51b815260040161068a90611d6c565b6001600160a01b0381166110bd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161068a565b6109f881611697565b6040516317e142d160e01b8152600a60048201526001600160a01b0382166024820152819060009081908190819081908190819073fc5a64c58b109d04a7886948f9c113d8e3ef32cc906317e142d190604401602060405180830381865af4158015611136573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115a9190611dd9565b96506000199550600087126111bc57600e5487111561118857600e546111819088906118b0565b95506111bc565b600e54600a546000911061119d5760006111ac565b600e54600a546111ac916116e9565b90506111b88882611582565b9650505b6111c588610ca4565b94506111d08861078b565b6001600160a01b0389166000908152601060205260409020549094509250826111fa576000611208565b601154611208908490611638565b9150428211611218576000611222565b61122282426116e9565b9050919395975091939597565b600a5460009081908190808203611251575050600e5460009250829150611345565b600e546000805a90506000805b898410801561126c57508582105b15611334578461127b81611e0f565b600a549096508610905061128e57600094505b6000600a60000186815481106112a6576112a6611e28565b60009182526020808320909101546001600160a01b031680835260109091526040909120549091506112d7906118ed565b156112fa576112e7816001610cdd565b156112fa57816112f681611e0f565b9250505b8261130481611e0f565b93505060005a90508085111561132b5761132861132186836116e9565b8790611638565b95505b935061125e9050565b600e85905590975095509193505050505b9193909250565b6001600160a01b0383166113ae5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161068a565b6001600160a01b03821661140f5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161068a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b8152602060048201526014602482015273139bc81d1c985b9cd9995c9cc8185b1b1bddd95960621b604482015260640161068a565b600081848411156114d35760405162461bcd60e51b815260040161068a9190611bb7565b5060006114e08486611e3e565b95945050505050565b6000826000036114fb5750600061065a565b60006115078385611e51565b9050826115148583611db7565b1461156b5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161068a565b9392505050565b6000818181121561065a57600080fd5b60008061158f8385611e68565b9050600083121580156115a25750838112155b806115b757506000831280156115b757508381125b61156b57600080fd5b6000808212156115cf57600080fd5b5090565b6001600160a01b0382166000908152602081905260409020548082111561161257600061160083836116e9565b905061160c8482611914565b50610eef565b80821015610eef57600061162682846116e9565b90506116328482611978565b50505050565b6000806116458385611e90565b90508381101561156b5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161068a565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061156b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506114af565b60008061173783610ca4565b905080156118a7576001600160a01b0383166000908152600960205260409020546117629082611638565b6001600160a01b038416600081815260096020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906117b19084815260200190565b60405180910390a260405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390526000917f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af115801561182d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118519190611ea3565b9050806118a0576001600160a01b03841660009081526009602052604090205461187b90836116e9565b6001600160a01b03909416600090815260096020526040812094909455509192915050565b5092915050565b50600092915050565b6000806118bd8385611ec0565b9050600083121580156118d05750838113155b806115b757506000831280156115b7575083811361156b57600080fd5b6000428211156118ff57506000919050565b60115461190c42846116e9565b101592915050565b61191e82826119bc565b6119586119396107cd836006546114e990919063ffffffff16565b6001600160a01b038416600090815260086020526040902054906118b0565b6001600160a01b0390921660009081526008602052604090209190915550565b6119828282611aa7565b61195861199d6107cd836006546114e990919063ffffffff16565b6001600160a01b03841660009081526008602052604090205490611582565b6001600160a01b038216611a125760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161068a565b611a1e60008383610eef565b600254611a2b9082611638565b6002556001600160a01b038216600090815260208190526040902054611a519082611638565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b038216611b075760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161068a565b611b1382600083610eef565b611b5081604051806060016040528060228152602001611ee1602291396001600160a01b03851660009081526020819052604090205491906114af565b6001600160a01b038316600090815260208190526040902055600254611b7690826116e9565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611a9b565b600060208083528351808285015260005b81811015611be457858101830151858201604001528201611bc8565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146109f857600080fd5b60008060408385031215611c2d57600080fd5b8235611c3881611c05565b946020939093013593505050565b600060208284031215611c5857600080fd5b5035919050565b600060208284031215611c7157600080fd5b813561156b81611c05565b600080600060608486031215611c9157600080fd5b8335611c9c81611c05565b92506020840135611cac81611c05565b929592945050506040919091013590565b80151581146109f857600080fd5b60008060408385031215611cde57600080fd5b8235611ce981611c05565b91506020830135611cf981611cbd565b809150509250929050565b60008060408385031215611d1757600080fd5b8235611d2281611c05565b91506020830135611cf981611c05565b600181811c90821680611d4657607f821691505b602082108103611d6657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082611dd457634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611deb57600080fd5b5051919050565b600060208284031215611e0457600080fd5b815161156b81611c05565b600060018201611e2157611e21611da1565b5060010190565b634e487b7160e01b600052603260045260246000fd5b8181038181111561065a5761065a611da1565b808202811582820484141761065a5761065a611da1565b8082018281126000831280158216821582161715611e8857611e88611da1565b505092915050565b8082018082111561065a5761065a611da1565b600060208284031215611eb557600080fd5b815161156b81611cbd565b81810360008312801583831316838312821617156118a0576118a0611da156fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122030c92f7efd25d6a93c17cbff2ecb5016e3e0c3daadde8345bebb6d49e4d5acc964736f6c63430008110033

Deployed Bytecode

0x6080604052600436106103bc5760003560e01c80637b3c83b1116101f2578063b6f7f6811161010d578063e4893fdc116100a0578063f27fd2541161006f578063f27fd25414610b50578063f2fde38b14610b70578063f7c618c114610b90578063f9d0831a14610bc457600080fd5b8063e4893fdc14610ae5578063e4f24cb014610afb578063e7841ec014610b1b578063e98030c714610b3057600080fd5b8063cdd4bd79116100dc578063cdd4bd7914610a53578063dd62ed3e14610a69578063e01af92c14610aaf578063e2f4560514610acf57600080fd5b8063b6f7f681146109dd578063b94315ff146109fd578063c024666814610a13578063c17b5b8c14610a3357600080fd5b80639c1b8af511610185578063a9059cbb11610154578063a9059cbb14610908578063ad56c13c14610928578063afa4f3b21461098d578063b62496f5146109ad57600080fd5b80639c1b8af51461089d578063a26579ad146108b3578063a457c2d7146108c8578063a8b9d240146108e857600080fd5b8063880bcbc1116101c1578063880bcbc1146108355780638a8c523c146108555780638da5cb5b1461086a57806395d89b411461088857600080fd5b80637b3c83b1146107c95780638095d564146107df578063824e4605146107ff578063871c128d1461081557600080fd5b80633b364da8116102e257806356a6cabf116102755780636ddd1713116102445780636ddd171314610744578063700bb1911461075e57806370a082311461077e578063715018a6146107b457600080fd5b806356a6cabf146106d957806359136fa5146106f957806364b0f6531461070f5780636843cd841461072457600080fd5b80634ada218b116102b15780634ada218b1461064c5780634e71d92d1461066b5780634fbee19314610680578063537c1ac7146106b957600080fd5b80633b364da8146105cc5780633f249df0146105ec5780634626402b1461060c57806349bd5a5e1461062c57600080fd5b8063286b3aa01161035a57806330bb4cff1161032957806330bb4cff1461055b578063313ce5671461057057806331e79db01461058c57806339509351146105ac57600080fd5b8063286b3aa0146104e95780632ba86bf21461050b5780632c1f5216146105255780632ce86fbf1461054557600080fd5b80631694505e116103965780631694505e1461044357806318160ddd1461047b57806318d9ceae1461049057806323b872dd146104c957600080fd5b80630105d0fd146103c857806306fdde03146103f1578063095ea7b31461041357600080fd5b366103c357005b600080fd5b3480156103d457600080fd5b506103de60195481565b6040519081526020015b60405180910390f35b3480156103fd57600080fd5b50610406610be4565b6040516103e891906133ab565b34801561041f57600080fd5b5061043361042e36600461340e565b610c76565b60405190151581526020016103e8565b34801561044f57600080fd5b50600f54610463906001600160a01b031681565b6040516001600160a01b0390911681526020016103e8565b34801561048757600080fd5b506002546103de565b34801561049c57600080fd5b506104336104ab36600461343a565b6001600160a01b031660009081526017602052604090205460ff1690565b3480156104d557600080fd5b506104336104e4366004613457565b610c8d565b3480156104f557600080fd5b50610509610504366004613498565b610cf6565b005b34801561051757600080fd5b506018546104339060ff1681565b34801561053157600080fd5b50601554610463906001600160a01b031681565b34801561055157600080fd5b506103de600a5481565b34801561056757600080fd5b506103de610d8b565b34801561057c57600080fd5b50604051600981526020016103e8565b34801561059857600080fd5b506105096105a736600461343a565b610dfe565b3480156105b857600080fd5b506104336105c736600461340e565b610e5a565b3480156105d857600080fd5b506105096105e7366004613498565b610e90565b3480156105f857600080fd5b5061050961060736600461343a565b610eeb565b34801561061857600080fd5b50600e54610463906001600160a01b031681565b34801561063857600080fd5b50601054610463906001600160a01b031681565b34801561065857600080fd5b5060125461043390610100900460ff1681565b34801561067757600080fd5b50610509610f90565b34801561068c57600080fd5b5061043361069b36600461343a565b6001600160a01b031660009081526013602052604090205460ff1690565b3480156106c557600080fd5b506105096106d436600461343a565b611008565b3480156106e557600080fd5b506105096106f43660046134bf565b6111cb565b34801561070557600080fd5b506103de601a5481565b34801561071b57600080fd5b506103de6112af565b34801561073057600080fd5b506103de61073f36600461343a565b6112f9565b34801561075057600080fd5b506012546104339060ff1681565b34801561076a57600080fd5b50610509610779366004613498565b611369565b34801561078a57600080fd5b506103de61079936600461343a565b6001600160a01b031660009081526020819052604090205490565b3480156107c057600080fd5b5061050961143b565b3480156107d557600080fd5b506103de60065481565b3480156107eb57600080fd5b506105096107fa3660046134dc565b611471565b34801561080b57600080fd5b506103de60075481565b34801561082157600080fd5b50610509610830366004613498565b611554565b34801561084157600080fd5b50610509610850366004613508565b611696565b34801561086157600080fd5b50610509611760565b34801561087657600080fd5b506005546001600160a01b0316610463565b34801561089457600080fd5b506104066117f3565b3480156108a957600080fd5b506103de60165481565b3480156108bf57600080fd5b506103de611802565b3480156108d457600080fd5b506104336108e336600461340e565b61184c565b3480156108f457600080fd5b506103de61090336600461343a565b61189b565b34801561091457600080fd5b5061043361092336600461340e565b6118ce565b34801561093457600080fd5b5061094861094336600461343a565b6118db565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e0820152610100016103e8565b34801561099957600080fd5b506105096109a8366004613498565b611976565b3480156109b957600080fd5b506104336109c836600461343a565b60146020526000908152604090205460ff1681565b3480156109e957600080fd5b506105096109f8366004613541565b611a30565b348015610a0957600080fd5b506103de600c5481565b348015610a1f57600080fd5b50610509610a2e366004613508565b611b9f565b348015610a3f57600080fd5b50610509610a4e3660046134dc565b611c61565b348015610a5f57600080fd5b506103de600b5481565b348015610a7557600080fd5b506103de610a84366004613563565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610abb57600080fd5b50610509610aca3660046134bf565b611d37565b348015610adb57600080fd5b506103de60115481565b348015610af157600080fd5b506103de60085481565b348015610b0757600080fd5b506103de610b1636600461343a565b611dd9565b348015610b2757600080fd5b506103de611e0c565b348015610b3c57600080fd5b50610509610b4b366004613498565b611e56565b348015610b5c57600080fd5b50610948610b6b366004613498565b611f2e565b348015610b7c57600080fd5b50610509610b8b36600461343a565b611f70565b348015610b9c57600080fd5b506104637f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec781565b348015610bd057600080fd5b50610509610bdf36600461343a565b612008565b606060038054610bf390613591565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1f90613591565b8015610c6c5780601f10610c4157610100808354040283529160200191610c6c565b820191906000526020600020905b815481529060010190602001808311610c4f57829003601f168201915b5050505050905090565b6000610c83338484612211565b5060015b92915050565b6000610c9a848484612336565b610cec8433610ce785604051806060016040528060288152602001613a6e602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190612b77565b612211565b5060019392505050565b6005546001600160a01b03163314610d295760405162461bcd60e51b8152600401610d20906135cb565b60405180910390fd5b60155460405163014359d560e51b8152600481018390526001600160a01b039091169063286b3aa0906024015b600060405180830381600087803b158015610d7057600080fd5b505af1158015610d84573d6000803e3d6000fd5b5050505050565b601554604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df99190613600565b905090565b6005546001600160a01b03163314610e285760405162461bcd60e51b8152600401610d20906135cb565b60155460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401610d56565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c83918590610ce790866121ab565b6005546001600160a01b03163314610eba5760405162461bcd60e51b8152600401610d20906135cb565b601554604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e8990602401610d56565b6005546001600160a01b03163314610f155760405162461bcd60e51b8152600401610d20906135cb565b60155460405163bc4c4b3760e01b81526001600160a01b038381166004830152600060248301529091169063bc4c4b37906044016020604051808303816000875af1158015610f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8c9190613619565b5050565b60155460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015610fe1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110059190613619565b50565b6005546001600160a01b031633146110325760405162461bcd60e51b8152600401610d20906135cb565b600e546001600160a01b03908116908216036110a15760405162461bcd60e51b815260206004820152602860248201527f4d61726b6574696e672077616c6c657420697320616c72656164792074686174604482015267206164647265737360c01b6064820152608401610d20565b6001600160a01b0381163b156111075760405162461bcd60e51b815260206004820152602560248201527f4d61726b6574696e672077616c6c65742063616e6e6f74206265206120636f6e6044820152641d1c9858dd60da1b6064820152608401610d20565b61deac196001600160a01b038216016111765760405162461bcd60e51b815260206004820152602b60248201527f4d61726b6574696e672077616c6c65742063616e6e6f7420626520746865207a60448201526a65726f206164647265737360a81b6064820152608401610d20565b600e80546001600160a01b0319166001600160a01b0383169081179091556040519081527f2551960305e8f85b09658bb3075878e3e3cef37a5f7b5d43261f5e6f36b3d6a4906020015b60405180910390a150565b6005546001600160a01b031633146111f55760405162461bcd60e51b8152600401610d20906135cb565b60185460ff161515811515036112685760405162461bcd60e51b815260206004820152603260248201527f4d6178207472616e73616374696f6e206c696d697420697320616c72656164796044820152712073657420746f207468617420737461746560701b6064820152608401610d20565b6018805460ff191682151590811790915560405160ff909116151581527fe81be35e61864c26afd7a4655e99f321378d0aaae1e5af8ee67b658a7460f3cf906020016111c0565b601554604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610dd5573d6000803e3d6000fd5b6015546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611345573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c879190613600565b6015546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af11580156113bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e09190613636565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146114655760405162461bcd60e51b8152600401610d20906135cb565b61146f6000612bb1565b565b6005546001600160a01b0316331461149b5760405162461bcd60e51b8152600401610d20906135cb565b600683905560078290556008819055806114b5838561367a565b6114bf919061367a565b6009819055600a10156115145760405162461bcd60e51b815260206004820152601f60248201527f427579206665652063616e6e6f74206265206d6f7265207468616e20313025006044820152606401610d20565b7f491005465ab6f82fd10f4b13a1b1e5ca452bc4856b019f63775e33a6b1ad2feb60095460405161154791815260200190565b60405180910390a1505050565b6005546001600160a01b0316331461157e5760405162461bcd60e51b8152600401610d20906135cb565b62030d40811015801561159457506207a1208111155b6115fd5760405162461bcd60e51b815260206004820152603460248201527f676173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b6064820152608401610d20565b60165481036116635760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610d20565b60165460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3601655565b6005546001600160a01b031633146116c05760405162461bcd60e51b8152600401610d20906135cb565b6001600160a01b03821660009081526017602052604090205481151560ff9091161515036117005760405162461bcd60e51b8152600401610d209061368d565b6001600160a01b038216600081815260176020908152604091829020805460ff191685151590811790915591519182527f8727c4afe988887760e8db0bbad9f9fcceee6428545956832f67c8fdbd589c1091015b60405180910390a25050565b6005546001600160a01b0316331461178a5760405162461bcd60e51b8152600401610d20906135cb565b601254610100900460ff16156117e25760405162461bcd60e51b815260206004820152601860248201527f54726164696e6720616c726561647920656e61626c65642e00000000000000006044820152606401610d20565b6012805461ffff1916610101179055565b606060048054610bf390613591565b60155460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015610dd5573d6000803e3d6000fd5b6000610c833384610ce785604051806060016040528060258152602001613a96602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190612b77565b6015546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611328565b6000610c83338484612336565b60155460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa158015611937573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061195b91906136d1565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146119a05760405162461bcd60e51b8152600401610d20906135cb565b620186a06119ad60025490565b6119b7919061373b565b8111611a2b5760405162461bcd60e51b815260206004820152603e60248201527f53776170546f6b656e734174416d6f756e74206d75737420626520677265617460448201527f6572207468616e20302e30303125206f6620746f74616c20737570706c7900006064820152608401610d20565b601155565b6005546001600160a01b03163314611a5a5760405162461bcd60e51b8152600401610d20906135cb565b6103e8611a696009600a613841565b600254611a76919061373b565b611a80919061373b565b8210158015611ab457506103e8611a996009600a613841565b600254611aa6919061373b565b611ab0919061373b565b8110155b611b265760405162461bcd60e51b815260206004820152603f60248201527f4d6178205472616e73616374696f6e206c696d69732063616e6e6f742062652060448201527f6c6f776572207468616e20302e3125206f6620746f74616c20737570706c79006064820152608401610d20565b611b326009600a613841565b611b3c9083613850565b601955611b4b6009600a613841565b611b559082613850565b601a8190556019546040517f8c8cbc911b80df94332ececb8eb0945274d76fa965600a0f01f42af3f8afb13192611b93928252602082015260400190565b60405180910390a15050565b6005546001600160a01b03163314611bc95760405162461bcd60e51b8152600401610d20906135cb565b6001600160a01b03821660009081526013602052604090205481151560ff909116151503611c095760405162461bcd60e51b8152600401610d209061368d565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611754565b6005546001600160a01b03163314611c8b5760405162461bcd60e51b8152600401610d20906135cb565b600a839055600b829055600c81905580611ca5838561367a565b611caf919061367a565b600d819055600a1015611d045760405162461bcd60e51b815260206004820181905260248201527f53656c6c206665652063616e6e6f74206265206d6f7265207468616e203130256044820152606401610d20565b7f16df2c25b3392f376a685a3826b941b25140108d95899d6b1bd983feafbc1c55600d5460405161154791815260200190565b6005546001600160a01b03163314611d615760405162461bcd60e51b8152600401610d20906135cb565b60125481151560ff909116151503611dc65760405162461bcd60e51b815260206004820152602260248201527f73776170456e61626c656420616c726561647920617420746869732073746174604482015261329760f11b6064820152608401610d20565b6012805460ff1916911515919091179055565b6015546040516327ce014760e01b81526001600160a01b03838116600483015260009216906327ce014790602401611328565b6015546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015610dd5573d6000803e3d6000fd5b6005546001600160a01b03163314611e805760405162461bcd60e51b8152600401610d20906135cb565b610e108110158015611e955750620151808111155b611efd5760405162461bcd60e51b815260206004820152603360248201527f636c61696d57616974206d757374206265207570646174656420746f206265746044820152727765656e203120616e6420323420686f75727360681b6064820152608401610d20565b60155460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610d56565b601554604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd90602401611919565b6005546001600160a01b03163314611f9a5760405162461bcd60e51b8152600401610d20906135cb565b6001600160a01b038116611fff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d20565b61100581612bb1565b6005546001600160a01b031633146120325760405162461bcd60e51b8152600401610d20906135cb565b306001600160a01b0382160361208a5760405162461bcd60e51b815260206004820181905260248201527f4f776e65722063616e6e6f7420636c61696d206e617469766520746f6b656e736044820152606401610d20565b6001600160a01b0381166120c45760405133904780156108fc02916000818181858888f19350505050158015610f8c573d6000803e3d6000fd5b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa15801561210d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121319190613600565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015612181573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121a59190613619565b50505050565b6000806121b8838561367a565b90508381101561220a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610d20565b9392505050565b6001600160a01b0383166122735760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610d20565b6001600160a01b0382166122d45760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610d20565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661235c5760405162461bcd60e51b8152600401610d2090613867565b6001600160a01b0382166123825760405162461bcd60e51b8152600401610d20906138ac565b601254610100900460ff16806123b057506001600160a01b03831660009081526013602052604090205460ff165b806123d357506001600160a01b03821660009081526013602052604090205460ff165b61241f5760405162461bcd60e51b815260206004820152601860248201527f54726164696e67206e6f742079657420656e61626c65642100000000000000006044820152606401610d20565b806000036124385761243383836000612c03565b505050565b60185460ff161561251a576010546001600160a01b038481169116148061246c57506010546001600160a01b038381169116145b801561249157506001600160a01b03831660009081526017602052604090205460ff16155b80156124b657506001600160a01b03821660009081526017602052604090205460ff16155b1561251a576010546001600160a01b03908116908416036124f8576019548111156124f35760405162461bcd60e51b8152600401610d20906138ef565b61251a565b601a5481111561251a5760405162461bcd60e51b8152600401610d20906138ef565b30600090815260208190526040902054601154811080159081906125485750601054600160a01b900460ff16155b801561256c57506001600160a01b03841660009081526014602052604090205460ff165b801561258757506000600d54600954612585919061367a565b115b8015612595575060125460ff165b15612886576010805460ff60a01b1916600160a01b179055600a5460065460009182916125c2919061367a565b11156125f9576064600a546006546125da919061367a565b6125e49085613850565b6125ee919061373b565b90506125f981612d0c565b612603818461394c565b92506000600c54600854612617919061367a565b600b54600754612627919061367a565b612631919061367a565b90506000841180156126435750600081115b15612876576040805160028082526060820183524792600092919060208301908036833701905050905030816000815181106126815761268161395f565b6001600160a01b03928316602091820292909201810191909152600f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa1580156126da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fe9190613975565b816001815181106127115761271161395f565b6001600160a01b039283166020918202929092010152600f5460405163791ac94760e01b815291169063791ac947906127579089906000908690309042906004016139d6565b600060405180830381600087803b15801561277157600080fd5b505af1158015612785573d6000803e3d6000fd5b5050505060008247612797919061394c565b90506000600b546007546127ab919061367a565b111561282657600084600b546007546127c4919061367a565b6127ce9084613850565b6127d8919061373b565b600e549091506127f1906001600160a01b031682612f57565b6040518181527fddce3d5e4f18a9c2902704a38b56baadd81a9af59b8ded8a3220b6a6c1696b6b9060200160405180910390a1505b6000600c54600854612838919061367a565b111561287257600084600c54600854612851919061367a565b61285b9084613850565b612865919061373b565b905061287081613070565b505b5050505b50506010805460ff60a01b191690555b6010546001600160a01b03861660009081526013602052604090205460ff600160a01b9092048216159116806128d457506001600160a01b03851660009081526013602052604090205460ff165b156128dd575060005b6010546001600160a01b0387811691161480159061290957506010546001600160a01b03868116911614155b80156129125750805b1561291b575060005b801561297c576010546000906001600160a01b03908116908816036129435750600954612948565b50600d545b600060646129568388613850565b612960919061373b565b905061296c818761394c565b9550612979883083612c03565b50505b612987868686612c03565b6015546001600160a01b031663e30443bc876129b8816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156129fe57600080fd5b505af1925050508015612a0f575060015b506015546001600160a01b031663e30443bc86612a41816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612a8757600080fd5b505af1925050508015612a98575060015b50601054600160a01b900460ff16612b6f576016546015546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015612b17575060408051601f3d908101601f19168201909252612b1491810190613636565b60015b15612b6d5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050565b60008184841115612b9b5760405162461bcd60e51b8152600401610d2091906133ab565b506000612ba8848661394c565b95945050505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316612c295760405162461bcd60e51b8152600401610d2090613867565b6001600160a01b038216612c4f5760405162461bcd60e51b8152600401610d20906138ac565b612c8c81604051806060016040528060268152602001613a48602691396001600160a01b0386166000908152602081905260409020549190612b77565b6001600160a01b038085166000908152602081905260408082209390935590841681522054612cbb90826121ab565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101612329565b6000612d1960028361373b565b90506000612d27828461394c565b60408051600280825260608201835292935047926000926020830190803683370190505090503081600081518110612d6157612d6161395f565b6001600160a01b03928316602091820292909201810191909152600f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dde9190613975565b81600181518110612df157612df161395f565b6001600160a01b039283166020918202929092010152600f5460405163791ac94760e01b815291169063791ac94790612e379087906000908690309042906004016139d6565b600060405180830381600087803b158015612e5157600080fd5b505af1158015612e65573d6000803e3d6000fd5b5050505060008247612e77919061394c565b600f5460405163f305d71960e01b815230600482015260248101879052600060448201819052606482015261dead60848201524260a48201529192506001600160a01b03169063f305d71990839060c40160606040518083038185885af1158015612ee6573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612f0b9190613636565b505060408051878152602081018490529081018690527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561915060600160405180910390a1505050505050565b80471015612fa75760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610d20565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612ff4576040519150601f19603f3d011682016040523d82523d6000602084013e612ff9565b606091505b50509050806124335760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610d20565b6040805160028082526060820183526000926020830190803683375050600f54604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156130da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130fe9190613975565b816000815181106131115761311161395f565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7816001815181106131655761316561395f565b6001600160a01b039283166020918202929092010152600f5460405163b6f9de9560e01b815291169063b6f9de959084906131ab90600090869030904290600401613a12565b6000604051808303818588803b1580156131c457600080fd5b505af11580156131d8573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600093507f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec76001600160a01b031692506370a082319150602401602060405180830381865afa158015613244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132689190613600565b60155460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018390529192506000917f000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec79091169063a9059cbb906044016020604051808303816000875af11580156132e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133069190613619565b905080156121a557601554604051633243c79160e01b8152600481018490526001600160a01b0390911690633243c79190602401600060405180830381600087803b15801561335457600080fd5b505af1158015613368573d6000803e3d6000fd5b505050507fb0cc2628d6d644cf6be9d8110e142297ac910d6d8026d795a99f272fd9ad60b18260405161339d91815260200190565b60405180910390a150505050565b600060208083528351808285015260005b818110156133d8578581018301518582016040015282016133bc565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461100557600080fd5b6000806040838503121561342157600080fd5b823561342c816133f9565b946020939093013593505050565b60006020828403121561344c57600080fd5b813561220a816133f9565b60008060006060848603121561346c57600080fd5b8335613477816133f9565b92506020840135613487816133f9565b929592945050506040919091013590565b6000602082840312156134aa57600080fd5b5035919050565b801515811461100557600080fd5b6000602082840312156134d157600080fd5b813561220a816134b1565b6000806000606084860312156134f157600080fd5b505081359360208301359350604090920135919050565b6000806040838503121561351b57600080fd5b8235613526816133f9565b91506020830135613536816134b1565b809150509250929050565b6000806040838503121561355457600080fd5b50508035926020909101359150565b6000806040838503121561357657600080fd5b8235613581816133f9565b91506020830135613536816133f9565b600181811c908216806135a557607f821691505b6020821081036135c557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561361257600080fd5b5051919050565b60006020828403121561362b57600080fd5b815161220a816134b1565b60008060006060848603121561364b57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b80820180821115610c8757610c87613664565b60208082526024908201527f4163636f756e7420697320616c72656164792073657420746f207468617420736040820152637461746560e01b606082015260800190565b600080600080600080600080610100898b0312156136ee57600080fd5b88516136f9816133f9565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60008261375857634e487b7160e01b600052601260045260246000fd5b500490565b600181815b8085111561379857816000190482111561377e5761377e613664565b8085161561378b57918102915b93841c9390800290613762565b509250929050565b6000826137af57506001610c87565b816137bc57506000610c87565b81600181146137d257600281146137dc576137f8565b6001915050610c87565b60ff8411156137ed576137ed613664565b50506001821b610c87565b5060208310610133831016604e8410600b841016171561381b575081810a610c87565b613825838361375d565b806000190482111561383957613839613664565b029392505050565b600061220a60ff8416836137a0565b8082028115828204841417610c8757610c87613664565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252603b908201527f416e74695768616c653a205472616e7366657220616d6f756e7420657863656560408201527f647320746865206d61785472616e73616374696f6e416d6f756e740000000000606082015260800190565b81810381811115610c8757610c87613664565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561398757600080fd5b815161220a816133f9565b600081518084526020808501945080840160005b838110156139cb5781516001600160a01b0316875295820195908201906001016139a6565b509495945050505050565b85815284602082015260a0604082015260006139f560a0830186613992565b6001600160a01b0394909416606083015250608001529392505050565b848152608060208201526000613a2b6080830186613992565b6001600160a01b0394909416604083015250606001529291505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f1b103ac122c2eb32e7ebb693f013d2290b22b30b2a0e02ef722ce4e6ca3ceeb64736f6c63430008110033

Libraries Used


Deployed Bytecode Sourcemap

31150:19810:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43826:39;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;43826:39:0;;;;;;;;15241:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16154:169::-;;;;;;;;;;-1:-1:-1;16154:169:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;16154:169:0;1205:187:1;31536:41:0;;;;;;;;;;-1:-1:-1;31536:41:0;;;;-1:-1:-1;;;;;31536:41:0;;;;;;-1:-1:-1;;;;;1588:32:1;;;1570:51;;1558:2;1543:18;31536:41:0;1397:230:1;15561:108:0;;;;;;;;;;-1:-1:-1;15649:12:0;;15561:108;;45541:141;;;;;;;;;;-1:-1:-1;45541:141:0;;;;;:::i;:::-;-1:-1:-1;;;;;45640:34:0;45616:4;45640:34;;;:25;:34;;;;;;;;;45541:141;16331:355;;;;;;;;;;-1:-1:-1;16331:355:0;;;;;:::i;:::-;;:::i;50680:128::-;;;;;;;;;;-1:-1:-1;50680:128:0;;;;;:::i;:::-;;:::i;:::-;;43777:42;;;;;;;;;;-1:-1:-1;43777:42:0;;;;;;;;31980:38;;;;;;;;;;-1:-1:-1;31980:38:0;;;;-1:-1:-1;;;;;31980:38:0;;;31342:33;;;;;;;;;;;;;;;;48603:141;;;;;;;;;;;;;:::i;15461:92::-;;;;;;;;;;-1:-1:-1;15461:92:0;;15544:1;2904:36:1;;2892:2;2877:18;15461:92:0;2762:184:1;49214:129:0;;;;;;;;;;-1:-1:-1;49214:129:0;;;;;:::i;:::-;;:::i;16694:218::-;;;;;;;;;;-1:-1:-1;16694:218:0;;;;;:::i;:::-;;:::i;48040:179::-;;;;;;;;;;-1:-1:-1;48040:179:0;;;;;:::i;:::-;;:::i;50403:132::-;;;;;;;;;;-1:-1:-1;50403:132:0;;;;;:::i;:::-;;:::i;31498:29::-;;;;;;;;;;-1:-1:-1;31498:29:0;;;;-1:-1:-1;;;;;31498:29:0;;;31584;;;;;;;;;;-1:-1:-1;31584:29:0;;;;-1:-1:-1;;;;;31584:29:0;;;31815;;;;;;;;;;-1:-1:-1;31815:29:0;;;;;;;;;;;50292:103;;;;;;;;;;;;;:::i;37036:125::-;;;;;;;;;;-1:-1:-1;37036:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;37125:28:0;37101:4;37125:28;;;:19;:28;;;;;;;;;37036:125;38171:454;;;;;;;;;;-1:-1:-1;38171:454:0;;;;;:::i;:::-;;:::i;44191:311::-;;;;;;;;;;-1:-1:-1;44191:311:0;;;;;:::i;:::-;;:::i;43872:40::-;;;;;;;;;;;;;;;;50816:141;;;;;;;;;;;;;:::i;48911:139::-;;;;;;;;;;-1:-1:-1;48911:139:0;;;;;:::i;:::-;;:::i;31782:26::-;;;;;;;;;;-1:-1:-1;31782:26:0;;;;;;;;50013:271;;;;;;;;;;-1:-1:-1;50013:271:0;;;;;:::i;:::-;;:::i;15677:127::-;;;;;;;;;;-1:-1:-1;15677:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;15778:18:0;15751:7;15778:18;;;;;;;;;;;;15677:127;772:103;;;;;;;;;;;;;:::i;31190:32::-;;;;;;;;;;;;;;;;37169:484;;;;;;;;;;-1:-1:-1;37169:484:0;;;;;:::i;:::-;;:::i;31229:31::-;;;;;;;;;;;;;;;;47638:394;;;;;;;;;;-1:-1:-1;47638:394:0;;;;;:::i;:::-;;:::i;45207:326::-;;;;;;;;;;-1:-1:-1;45207:326:0;;;;;:::i;:::-;;:::i;38633:175::-;;;;;;;;;;;;;:::i;549:87::-;;;;;;;;;;-1:-1:-1;622:6:0;;-1:-1:-1;;;;;622:6:0;549:87;;15349:104;;;;;;;;;;;;;:::i;32068:41::-;;;;;;;;;;;;;;;;48487:108;;;;;;;;;;;;;:::i;16920:269::-;;;;;;;;;;-1:-1:-1;16920:269:0;;;;;:::i;:::-;;:::i;48752:151::-;;;;;;;;;;-1:-1:-1;48752:151:0;;;;;:::i;:::-;;:::i;15812:175::-;;;;;;;;;;-1:-1:-1;15812:175:0;;;;;:::i;:::-;;:::i;49351:318::-;;;;;;;;;;-1:-1:-1;49351:318:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4593:32:1;;;4575:51;;4657:2;4642:18;;4635:34;;;;4685:18;;;4678:34;;;;4743:2;4728:18;;4721:34;;;;4786:3;4771:19;;4764:35;4613:3;4815:19;;4808:35;4874:3;4859:19;;4852:35;4918:3;4903:19;;4896:35;4562:3;4547:19;49351:318:0;4236:701:1;47392:238:0;;;;;;;;;;-1:-1:-1;47392:238:0;;;;;:::i;:::-;;:::i;31913:58::-;;;;;;;;;;-1:-1:-1;31913:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44510:689;;;;;;;;;;-1:-1:-1;44510:689:0;;;;;:::i;:::-;;:::i;31421:31::-;;;;;;;;;;;;;;;;36742:286;;;;;;;;;;-1:-1:-1;36742:286:0;;;;;:::i;:::-;;:::i;37661:502::-;;;;;;;;;;-1:-1:-1;37661:502:0;;;;;:::i;:::-;;:::i;31382:32::-;;;;;;;;;;;;;;;;15995:151;;;;;;;;;;-1:-1:-1;15995:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;16111:18:0;;;16084:7;16111:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15995:151;38816:179;;;;;;;;;;-1:-1:-1;38816:179:0;;;;;:::i;:::-;;:::i;31740:33::-;;;;;;;;;;;;;;;;31267:30;;;;;;;;;;;;;;;;49058:148;;;;;;;;;;-1:-1:-1;49058:148:0;;;;;:::i;:::-;;:::i;50543:129::-;;;;;;;;;;;;;:::i;48227:252::-;;;;;;;;;;-1:-1:-1;48227:252:0;;;;;:::i;:::-;;:::i;49677:328::-;;;;;;;;;;-1:-1:-1;49677:328:0;;;;;:::i;:::-;;:::i;883:201::-;;;;;;;;;;-1:-1:-1;883:201:0;;;;;:::i;:::-;;:::i;32025:36::-;;;;;;;;;;;;;;;35440:441;;;;;;;;;;-1:-1:-1;35440:441:0;;;;;:::i;:::-;;:::i;15241:100::-;15295:13;15328:5;15321:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15241:100;:::o;16154:169::-;16237:4;16254:39;175:10;16277:7;16286:6;16254:8;:39::i;:::-;-1:-1:-1;16311:4:0;16154:169;;;;;:::o;16331:355::-;16471:4;16488:36;16498:6;16506:9;16517:6;16488:9;:36::i;:::-;16535:121;16544:6;175:10;16566:89;16604:6;16566:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16566:19:0;;;;;;:11;:19;;;;;;;;175:10;16566:33;;;;;;;;;;:37;:89::i;:::-;16535:8;:121::i;:::-;-1:-1:-1;16674:4:0;16331:355;;;;;:::o;50680:128::-;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;;;;;;;;;50756:15:::1;::::0;:44:::1;::::0;-1:-1:-1;;;50756:44:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;50756:15:0;;::::1;::::0;:37:::1;::::0;133:18:1;;50756:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;50680:128:::0;:::o;48603:141::-;48693:15;;:43;;;-1:-1:-1;;;48693:43:0;;;;48666:7;;-1:-1:-1;;;;;48693:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48686:50;;48603:141;:::o;49214:129::-;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;49290:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;49290:45:0;;-1:-1:-1;;;;;1588:32:1;;;49290:45:0::1;::::0;::::1;1570:51:1::0;49290:15:0;;::::1;::::0;:36:::1;::::0;1543:18:1;;49290:45:0::1;1397:230:1::0;16694:218:0;175:10;16782:4;16831:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;16831:34:0;;;;;;;;;;16782:4;;16799:83;;16822:7;;16831:50;;16870:10;16831:38;:50::i;48040:179::-;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;48139:15:::1;::::0;:72:::1;::::0;-1:-1:-1;;;48139:72:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;48139:15:0;;::::1;::::0;:53:::1;::::0;133:18:1;;48139:72:0::1;14:177:1::0;50403:132:0;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;50472:15:::1;::::0;:55:::1;::::0;-1:-1:-1;;;50472:55:0;;-1:-1:-1;;;;;6725:32:1;;;50472:55:0::1;::::0;::::1;6707:51:1::0;50472:15:0::1;6774:18:1::0;;;6767:50;50472:15:0;;::::1;::::0;:30:::1;::::0;6680:18:1;;50472:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50403:132:::0;:::o;50292:103::-;50329:15;;:58;;-1:-1:-1;;;50329:58:0;;50368:10;50329:58;;;6707:51:1;50329:15:0;6774:18:1;;;6767:50;-1:-1:-1;;;;;50329:15:0;;;;:30;;6680:18:1;;50329:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50292:103::o;38171:454::-;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;38283:14:::1;::::0;-1:-1:-1;;;;;38283:14:0;;::::1;38264:33:::0;;::::1;::::0;38256:86:::1;;;::::0;-1:-1:-1;;;38256:86:0;;7280:2:1;38256:86:0::1;::::0;::::1;7262:21:1::0;7319:2;7299:18;;;7292:30;7358:34;7338:18;;;7331:62;-1:-1:-1;;;7409:18:1;;;7402:38;7457:19;;38256:86:0::1;7078:404:1::0;38256:86:0::1;-1:-1:-1::0;;;;;35973:19:0;;;:23;38353:78:::1;;;::::0;-1:-1:-1;;;38353:78:0;;7689:2:1;38353:78:0::1;::::0;::::1;7671:21:1::0;7728:2;7708:18;;;7701:30;7767:34;7747:18;;;7740:62;-1:-1:-1;;;7818:18:1;;;7811:35;7863:19;;38353:78:0::1;7487:401:1::0;38353:78:0::1;-1:-1:-1::0;;;;;;;38450:23:0;::::1;::::0;38442:79:::1;;;::::0;-1:-1:-1;;;38442:79:0;;8095:2:1;38442:79:0::1;::::0;::::1;8077:21:1::0;8134:2;8114:18;;;8107:30;8173:34;8153:18;;;8146:62;-1:-1:-1;;;8224:18:1;;;8217:41;8275:19;;38442:79:0::1;7893:407:1::0;38442:79:0::1;38532:14;:32:::0;;-1:-1:-1;;;;;;38532:32:0::1;-1:-1:-1::0;;;;;38532:32:0;::::1;::::0;;::::1;::::0;;;38580:37:::1;::::0;1570:51:1;;;38580:37:0::1;::::0;1558:2:1;1543:18;38580:37:0::1;;;;;;;;38171:454:::0;:::o;44191:311::-;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;44290:26:::1;::::0;::::1;;44280:36;;::::0;::::1;;::::0;44272:99:::1;;;::::0;-1:-1:-1;;;44272:99:0;;8507:2:1;44272:99:0::1;::::0;::::1;8489:21:1::0;8546:2;8526:18;;;8519:30;8585:34;8565:18;;;8558:62;-1:-1:-1;;;8636:18:1;;;8629:48;8694:19;;44272:99:0::1;8305:414:1::0;44272:99:0::1;44382:26;:35:::0;;-1:-1:-1;;44382:35:0::1;::::0;::::1;;::::0;;::::1;::::0;;;44435:59:::1;::::0;44382:35:::1;44467:26:::0;;;1370:14:1;1363:22;1345:41;;44435:59:0::1;::::0;1333:2:1;1318:18;44435:59:0::1;1205:187:1::0;50816:141:0;50908:15;;:41;;;-1:-1:-1;;;50908:41:0;;;;50881:7;;-1:-1:-1;;;;;50908:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;48911:139;49008:15;;:34;;-1:-1:-1;;;49008:34:0;;-1:-1:-1;;;;;1588:32:1;;;49008:34:0;;;1570:51:1;48981:7:0;;49008:15;;:25;;1543:18:1;;49008:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;50013:271::-;50145:15;;:28;;-1:-1:-1;;;;;;50145:28:0;;;;;160:25:1;;;50079:18:0;;;;;;-1:-1:-1;;;;;50145:15:0;;:23;;133:18:1;;50145:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50189:87;;;9266:25:1;;;9322:2;9307:18;;9300:34;;;9350:18;;;9343:34;;;9408:2;9393:18;;9386:34;;;50078:95:0;;-1:-1:-1;50078:95:0;;-1:-1:-1;50078:95:0;-1:-1:-1;50266:9:0;;50254:5;;50189:87;;9253:3:1;9238:19;50189:87:0;;;;;;;50067:217;;;50013:271;:::o;772:103::-;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;837:30:::1;864:1;837:18;:30::i;:::-;772:103::o:0;37169:484::-;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;37303:17:::1;:40:::0;;;37354:16:::1;:39:::0;;;37404:15:::1;:38:::0;;;37426:16;37469:38:::1;37376:17:::0;37325:18;37469:38:::1;:::i;:::-;:57;;;;:::i;:::-;37455:11;:71:::0;;;37562:2:::1;-1:-1:-1::0;37547:17:0::1;37539:61;;;::::0;-1:-1:-1;;;37539:61:0;;9895:2:1;37539:61:0::1;::::0;::::1;9877:21:1::0;9934:2;9914:18;;;9907:30;9973:33;9953:18;;;9946:61;10024:18;;37539:61:0::1;9693:355:1::0;37539:61:0::1;37618:27;37633:11;;37618:27;;;;160:25:1::0;;148:2;133:18;;14:177;37618:27:0::1;;;;;;;;37169:484:::0;;;:::o;47638:394::-;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;47736:7:::1;47724:8;:19;;:42;;;;;47759:7;47747:8;:19;;47724:42;47716:107;;;::::0;-1:-1:-1;;;47716:107:0;;10255:2:1;47716:107:0::1;::::0;::::1;10237:21:1::0;10294:2;10274:18;;;10267:30;10333:34;10313:18;;;10306:62;-1:-1:-1;;;10384:18:1;;;10377:50;10444:19;;47716:107:0::1;10053:416:1::0;47716:107:0::1;47854:16;;47842:8;:28:::0;47834:85:::1;;;::::0;-1:-1:-1;;;47834:85:0;;10676:2:1;47834:85:0::1;::::0;::::1;10658:21:1::0;10715:2;10695:18;;;10688:30;10754:34;10734:18;;;10727:62;-1:-1:-1;;;10805:18:1;;;10798:42;10857:19;;47834:85:0::1;10474:408:1::0;47834:85:0::1;47969:16;::::0;47935:51:::1;::::0;47959:8;;47935:51:::1;::::0;;;::::1;47997:16;:27:::0;47638:394::o;45207:326::-;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45317:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;:45;::::1;;:34;::::0;;::::1;:45;;::::0;45308:95:::1;;;;-1:-1:-1::0;;;45308:95:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;45414:34:0;::::1;;::::0;;;:25:::1;:34;::::0;;;;;;;;:44;;-1:-1:-1;;45414:44:0::1;::::0;::::1;;::::0;;::::1;::::0;;;45476:49;;1345:41:1;;;45476:49:0::1;::::0;1318:18:1;45476:49:0::1;;;;;;;;45207:326:::0;;:::o;38633:175::-;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;38696:14:::1;::::0;::::1;::::0;::::1;;;38695:15;38687:52;;;::::0;-1:-1:-1;;;38687:52:0;;11494:2:1;38687:52:0::1;::::0;::::1;11476:21:1::0;11533:2;11513:18;;;11506:30;11572:26;11552:18;;;11545:54;11616:18;;38687:52:0::1;11292:348:1::0;38687:52:0::1;38750:14;:21:::0;;-1:-1:-1;;38782:18:0;;;;;38633:175::o;15349:104::-;15405:13;15438:7;15431:14;;;;;:::i;48487:108::-;48560:15;;:27;;;-1:-1:-1;;;48560:27:0;;;;48533:7;;-1:-1:-1;;;;;48560:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;;;;;16920:269;17013:4;17030:129;175:10;17053:7;17062:96;17101:15;17062:96;;;;;;;;;;;;;;;;;175:10;17062:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;17062:34:0;;;;;;;;;;;;:38;:96::i;48752:151::-;48848:15;;:47;;-1:-1:-1;;;48848:47:0;;-1:-1:-1;;;;;1588:32:1;;;48848:47:0;;;1570:51:1;48821:7:0;;48848:15;;:38;;1543:18:1;;48848:47:0;1397:230:1;15812:175:0;15898:4;15915:42;175:10;15939:9;15950:6;15915:9;:42::i;49351:318::-;49626:15;;:35;;-1:-1:-1;;;49626:35:0;;-1:-1:-1;;;;;1588:32:1;;;49626:35:0;;;1570:51:1;49447:7:0;;;;;;;;;;;;;;;;49626:15;;;:26;;1543:18:1;;49626:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49619:42;;;;;;;;;;;;;;;;49351:318;;;;;;;;;:::o;47392:238::-;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;47507:7:::1;47491:13;15649:12:::0;;;15561:108;47491:13:::1;:23;;;;:::i;:::-;47479:9;:35;47471:110;;;::::0;-1:-1:-1;;;47471:110:0;;12755:2:1;47471:110:0::1;::::0;::::1;12737:21:1::0;12794:2;12774:18;;;12767:30;12833:34;12813:18;;;12806:62;12904:32;12884:18;;;12877:60;12954:19;;47471:110:0::1;12553:426:1::0;47471:110:0::1;47592:18;:30:::0;47392:238::o;44510:689::-;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;44733:5:::1;44712:16;15544:1:::0;44712:2:::1;:16;:::i;:::-;15649:12:::0;;44695:34:::1;;;;:::i;:::-;44694:44;;;;:::i;:::-;44665:24;:73;;:164;;;;-1:-1:-1::0;44824:5:0::1;44803:16;15544:1:::0;44803:2:::1;:16;:::i;:::-;15649:12:::0;;44786:34:::1;;;;:::i;:::-;44785:44;;;;:::i;:::-;44756:25;:73;;44665:164;44643:278;;;::::0;-1:-1:-1;;;44643:278:0;;14569:2:1;44643:278:0::1;::::0;::::1;14551:21:1::0;14608:2;14588:18;;;14581:30;14647:34;14627:18;;;14620:62;14718:33;14698:18;;;14691:61;14769:19;;44643:278:0::1;14367:427:1::0;44643:278:0::1;44989:16;15544:1:::0;44989:2:::1;:16;:::i;:::-;44960:46;::::0;:24;:46:::1;:::i;:::-;44933:23;:73:::0;45073:16:::1;15544:1:::0;45073:2:::1;:16;:::i;:::-;45044:46;::::0;:25;:46:::1;:::i;:::-;45017:24;:73:::0;;;45141:23:::1;::::0;45108:83:::1;::::0;::::1;::::0;::::1;::::0;15146:25:1;;15202:2;15187:18;;15180:34;15134:2;15119:18;;14972:248;45108:83:0::1;;;;;;;;44510:689:::0;;:::o;36742:286::-;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36837:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:40;::::1;;:28;::::0;;::::1;:40;;::::0;36829:89:::1;;;;-1:-1:-1::0;;;36829:89:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36929:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;36929:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;36986:34;;1345:41:1;;;36986:34:0::1;::::0;1318:18:1;36986:34:0::1;1205:187:1::0;37661:502:0;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;37799:18:::1;:42:::0;;;37852:17:::1;:41:::0;;;37904:16:::1;:40:::0;;;37927:17;37972:40:::1;37875:18:::0;37822:19;37972:40:::1;:::i;:::-;:60;;;;:::i;:::-;37957:12;:75:::0;;;38069:2:::1;-1:-1:-1::0;38053:18:0::1;38045:63;;;::::0;-1:-1:-1;;;38045:63:0;;15427:2:1;38045:63:0::1;::::0;::::1;15409:21:1::0;;;15446:18;;;15439:30;15505:34;15485:18;;;15478:62;15557:18;;38045:63:0::1;15225:356:1::0;38045:63:0::1;38126:29;38142:12;;38126:29;;;;160:25:1::0;;148:2;133:18;;14:177;38816:179:0;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;38892:11:::1;::::0;:23;::::1;;:11;::::0;;::::1;:23;;::::0;38884:70:::1;;;::::0;-1:-1:-1;;;38884:70:0;;15788:2:1;38884:70:0::1;::::0;::::1;15770:21:1::0;15827:2;15807:18;;;15800:30;15866:34;15846:18;;;15839:62;-1:-1:-1;;;15917:18:1;;;15910:32;15959:19;;38884:70:0::1;15586:398:1::0;38884:70:0::1;38965:11;:22:::0;;-1:-1:-1;;38965:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;38816:179::o;49058:148::-;49151:15;;:47;;-1:-1:-1;;;49151:47:0;;-1:-1:-1;;;;;1588:32:1;;;49151:47:0;;;1570:51:1;49124:7:0;;49151:15;;:38;;1543:18:1;;49151:47:0;1397:230:1;50543:129:0;50625:15;;:39;;;-1:-1:-1;;;50625:39:0;;;;50598:7;;-1:-1:-1;;;;;50625:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;48227:252;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;48328:5:::1;48312:12;:21;;:47;;;;;48353:6;48337:12;:22;;48312:47;48304:111;;;::::0;-1:-1:-1;;;48304:111:0;;16191:2:1;48304:111:0::1;::::0;::::1;16173:21:1::0;16230:2;16210:18;;;16203:30;16269:34;16249:18;;;16242:62;-1:-1:-1;;;16320:18:1;;;16313:49;16379:19;;48304:111:0::1;15989:415:1::0;48304:111:0::1;48426:15;::::0;:45:::1;::::0;-1:-1:-1;;;48426:45:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;48426:15:0;;::::1;::::0;:31:::1;::::0;133:18:1;;48426:45:0::1;14:177:1::0;49677:328:0;49957:15;;:40;;-1:-1:-1;;;49957:40:0;;;;;160:25:1;;;49778:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49957:15:0;;;;:33;;133:18:1;;49957:40:0;14:177:1;883:201:0;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;972:22:0;::::1;964:73;;;::::0;-1:-1:-1;;;964:73:0;;16611:2:1;964:73:0::1;::::0;::::1;16593:21:1::0;16650:2;16630:18;;;16623:30;16689:34;16669:18;;;16662:62;-1:-1:-1;;;16740:18:1;;;16733:36;16786:19;;964:73:0::1;16409:402:1::0;964:73:0::1;1048:28;1067:8;1048:18;:28::i;35440:441::-:0;622:6;;-1:-1:-1;;;;;622:6:0;175:10;684:23;676:68;;;;-1:-1:-1;;;676:68:0;;;;;;;:::i;:::-;35536:4:::1;-1:-1:-1::0;;;;;35519:22:0;::::1;::::0;35511:67:::1;;;::::0;-1:-1:-1;;;35511:67:0;;17018:2:1;35511:67:0::1;::::0;::::1;17000:21:1::0;;;17037:18;;;17030:30;17096:34;17076:18;;;17069:62;17148:18;;35511:67:0::1;16816:356:1::0;35511:67:0::1;-1:-1:-1::0;;;;;35593:21:0;::::1;35589:126;;35631:51;::::0;35639:10:::1;::::0;35660:21:::1;35631:51:::0;::::1;;;::::0;::::1;::::0;;;35660:21;35639:10;35631:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;35589:126;35787:35;::::0;-1:-1:-1;;;35787:35:0;;35816:4:::1;35787:35;::::0;::::1;1570:51:1::0;35752:5:0;;35725:17:::1;::::0;-1:-1:-1;;;;;35787:20:0;::::1;::::0;::::1;::::0;1543:18:1;;35787:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35833:40;::::0;-1:-1:-1;;;35833:40:0;;35853:10:::1;35833:40;::::0;::::1;17351:51:1::0;17418:18;;;17411:34;;;35769:53:0;;-1:-1:-1;;;;;;35833:19:0;::::1;::::0;::::1;::::0;17324:18:1;;35833:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35500:381;;35440:441:::0;:::o;1314:181::-;1372:7;;1404:5;1408:1;1404;:5;:::i;:::-;1392:17;;1433:1;1428;:6;;1420:46;;;;-1:-1:-1;;;1420:46:0;;17658:2:1;1420:46:0;;;17640:21:1;17697:2;17677:18;;;17670:30;17736:29;17716:18;;;17709:57;17783:18;;1420:46:0;17456:351:1;1420:46:0;1486:1;1314:181;-1:-1:-1;;;1314:181:0:o;18578:378::-;-1:-1:-1;;;;;18714:19:0;;18706:68;;;;-1:-1:-1;;;18706:68:0;;18014:2:1;18706:68:0;;;17996:21:1;18053:2;18033:18;;;18026:30;18092:34;18072:18;;;18065:62;-1:-1:-1;;;18143:18:1;;;18136:34;18187:19;;18706:68:0;17812:400:1;18706:68:0;-1:-1:-1;;;;;18793:21:0;;18785:68;;;;-1:-1:-1;;;18785:68:0;;18419:2:1;18785:68:0;;;18401:21:1;18458:2;18438:18;;;18431:30;18497:34;18477:18;;;18470:62;-1:-1:-1;;;18548:18:1;;;18541:32;18590:19;;18785:68:0;18217:398:1;18785:68:0;-1:-1:-1;;;;;18864:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18916:32;;160:25:1;;;18916:32:0;;133:18:1;18916:32:0;;;;;;;;18578:378;;;:::o;39003:4631::-;-1:-1:-1;;;;;39135:18:0;;39127:68;;;;-1:-1:-1;;;39127:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39214:16:0;;39206:64;;;;-1:-1:-1;;;39206:64:0;;;;;;;:::i;:::-;39289:14;;;;;;;;:43;;-1:-1:-1;;;;;;39307:25:0;;;;;;:19;:25;;;;;;;;39289:43;:70;;;-1:-1:-1;;;;;;39336:23:0;;;;;;:19;:23;;;;;;;;39289:70;39281:107;;;;-1:-1:-1;;;39281:107:0;;19632:2:1;39281:107:0;;;19614:21:1;19671:2;19651:18;;;19644:30;19710:26;19690:18;;;19683:54;19754:18;;39281:107:0;19430:348:1;39281:107:0;39404:6;39414:1;39404:11;39401:92;;39432:28;39448:4;39454:2;39458:1;39432:15;:28::i;:::-;39003:4631;;;:::o;39401:92::-;39509:26;;;;39505:770;;;39575:13;;-1:-1:-1;;;;;39567:21:0;;;39575:13;;39567:21;;:44;;-1:-1:-1;39598:13:0;;-1:-1:-1;;;;;39592:19:0;;;39598:13;;39592:19;39567:44;39566:107;;;;-1:-1:-1;;;;;;39633:31:0;;;;;;:25;:31;;;;;;;;:40;39566:107;:169;;;;-1:-1:-1;;;;;;39695:29:0;;;;;;:25;:29;;;;;;;;:40;39566:169;39562:702;;;39782:13;;-1:-1:-1;;;;;39782:13:0;;;39774:21;;;;39770:479;;39864:23;;39854:6;:33;;39820:180;;;;-1:-1:-1;;;39820:180:0;;;;;;;:::i;:::-;39770:479;;;40093:24;;40083:6;:34;;40049:180;;;;-1:-1:-1;;;40049:180:0;;;;;;;:::i;:::-;40336:4;40287:28;15778:18;;;;;;;;;;;40394;;40370:42;;;;;;;40429:33;;-1:-1:-1;40454:8:0;;-1:-1:-1;;;40454:8:0;;;;40453:9;40429:33;:79;;;;-1:-1:-1;;;;;;40479:29:0;;;;;;:25;:29;;;;;;;;40429:79;:126;;;;;40554:1;40539:12;;40525:11;;:26;;;;:::i;:::-;:30;40429:126;:154;;;;-1:-1:-1;40572:11:0;;;;40429:154;40425:1919;;;40610:8;:15;;-1:-1:-1;;;;40610:15:0;-1:-1:-1;;;40610:15:0;;;40717:18;;40697:17;;40610:15;;;;40697:38;;40717:18;40697:38;:::i;:::-;:42;40694:219;;;40844:3;40822:18;;40802:17;;:38;;;;:::i;:::-;40778:63;;:20;:63;:::i;:::-;:69;;;;:::i;:::-;40760:87;;40866:31;40881:15;40866:14;:31::i;:::-;40929:39;40953:15;40929:39;;:::i;:::-;;;40985:16;41064;;41046:15;;:34;;;;:::i;:::-;41024:17;;41005:16;;:36;;;;:::i;:::-;41004:77;;;;:::i;:::-;40985:96;;41136:1;41113:20;:24;:40;;;;;41152:1;41141:8;:12;41113:40;41110:1190;;;41265:16;;;41279:1;41265:16;;;;;;;;41199:21;;41174:22;;41265:16;41279:1;41265:16;;;;;;;;;;-1:-1:-1;41265:16:0;41241:40;;41318:4;41300;41305:1;41300:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41300:23:0;;;:7;;;;;;;;;;:23;;;;41352:15;;:22;;;-1:-1:-1;;;41352:22:0;;;;:15;;;;;:20;;:22;;;;;41300:7;;41352:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41342:4;41347:1;41342:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41342:32:0;;;:7;;;;;;;;;:32;41395:15;;:235;;-1:-1:-1;;;41395:235:0;;:15;;;:66;;:235;;41484:20;;41395:15;;41551:4;;41586;;41614:15;;41395:235;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41667:18;41712:14;41688:21;:38;;;;:::i;:::-;41667:59;;41791:1;41770:17;;41751:16;;:36;;;;:::i;:::-;41750:42;41747:296;;;41817:19;41893:8;41872:17;;41853:16;;:36;;;;:::i;:::-;41839:51;;:10;:51;:::i;:::-;:62;;;;:::i;:::-;41940:14;;41817:84;;-1:-1:-1;41924:45:0;;-1:-1:-1;;;;;41940:14:0;41817:84;41924:7;:45::i;:::-;41997:26;;160:25:1;;;41997:26:0;;148:2:1;133:18;41997:26:0;;;;;;;41794:249;41747:296;42105:1;42085:16;;42067:15;;:34;;;;:::i;:::-;42066:40;42063:222;;;42131:17;42203:8;42183:16;;42165:15;;:34;;;;:::i;:::-;42151:49;;:10;:49;:::i;:::-;:60;;;;:::i;:::-;42131:80;;42234:31;42255:9;42234:20;:31::i;:::-;42108:177;42063:222;41155:1145;;;41110:1190;-1:-1:-1;;42316:8:0;:16;;-1:-1:-1;;;;42316:16:0;;;40425:1919;42372:8;;-1:-1:-1;;;;;42396:25:0;;42356:12;42396:25;;;:19;:25;;;;;;42372:8;-1:-1:-1;;;42372:8:0;;;;;42371:9;;42396:25;;:52;;-1:-1:-1;;;;;;42425:23:0;;;;;;:19;:23;;;;;;;;42396:52;42393:99;;;-1:-1:-1;42475:5:0;42393:99;42556:13;;-1:-1:-1;;;;;42548:21:0;;;42556:13;;42548:21;;;;:44;;-1:-1:-1;42579:13:0;;-1:-1:-1;;;;;42573:19:0;;;42579:13;;42573:19;;42548:44;:55;;;;;42596:7;42548:55;42545:102;;;-1:-1:-1;42630:5:0;42545:102;42662:7;42659:387;;;42730:13;;42686:18;;-1:-1:-1;;;;;42730:13:0;;;42722:21;;;;42719:151;;-1:-1:-1;42777:11:0;;42719:151;;;-1:-1:-1;42842:12:0;;42719:151;42884:12;42921:3;42899:19;42908:10;42899:6;:19;:::i;:::-;:25;;;;:::i;:::-;42884:40;-1:-1:-1;42962:13:0;42884:40;42962:6;:13;:::i;:::-;42953:22;;42992:42;43008:4;43022;43029;42992:15;:42::i;:::-;42671:375;;42659:387;43058:33;43074:4;43080:2;43084:6;43058:15;:33::i;:::-;43108:15;;-1:-1:-1;;;;;43108:15:0;:26;43143:4;43150:15;43143:4;-1:-1:-1;;;;;15778:18:0;15751:7;15778:18;;;;;;;;;;;;15677:127;43150:15;43108:58;;-1:-1:-1;;;;;;43108:58:0;;;;;;;-1:-1:-1;;;;;17369:32:1;;;43108:58:0;;;17351:51:1;17418:18;;;17411:34;17324:18;;43108:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43104:74;43192:15;;-1:-1:-1;;;;;43192:15:0;:26;43227:2;43232:13;43227:2;-1:-1:-1;;;;;15778:18:0;15751:7;15778:18;;;;;;;;;;;;15677:127;43232:13;43192:54;;-1:-1:-1;;;;;;43192:54:0;;;;;;;-1:-1:-1;;;;;17369:32:1;;;43192:54:0;;;17351:51:1;17418:18;;;17411:34;17324:18;;43192:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43188:70;43274:8;;-1:-1:-1;;;43274:8:0;;;;43270:357;;43313:16;;43350:15;;:28;;-1:-1:-1;;;;;;43350:28:0;;;;;160:25:1;;;-1:-1:-1;;;;;43350:15:0;;;;:23;;133:18:1;;43350:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;43350:28:0;;;;;;;;-1:-1:-1;;43350:28:0;;;;;;;;;;;;:::i;:::-;;;43346:270;;;43476:86;;;9266:25:1;;;9322:2;9307:18;;9300:34;;;9350:18;;;9343:34;;;9408:2;9393:18;;9386:34;;;43552:9:0;;43541:4;;43476:86;;9253:3:1;9238:19;43476:86:0;;;;;;;43379:199;;;43346:270;43284:343;43270:357;39116:4518;;;39003:4631;;;:::o;1647:192::-;1733:7;1769:12;1761:6;;;;1753:29;;;;-1:-1:-1;;;1753:29:0;;;;;;;;:::i;:::-;-1:-1:-1;1793:9:0;1805:5;1809:1;1805;:5;:::i;:::-;1793:17;1647:192;-1:-1:-1;;;;;1647:192:0:o;1092:191::-;1185:6;;;-1:-1:-1;;;;;1202:17:0;;;-1:-1:-1;;;;;;1202:17:0;;;;;;;1235:40;;1185:6;;;1202:17;1185:6;;1235:40;;1166:16;;1235:40;1155:128;1092:191;:::o;17197:569::-;-1:-1:-1;;;;;17337:20:0;;17329:70;;;;-1:-1:-1;;;17329:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17418:23:0;;17410:71;;;;-1:-1:-1;;;17410:71:0;;;;;;;:::i;:::-;17570;17592:6;17570:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17570:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;17550:17:0;;;:9;:17;;;;;;;;;;;:91;;;;17675:20;;;;;;;:32;;17700:6;17675:24;:32::i;:::-;-1:-1:-1;;;;;17652:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;17723:35;160:25:1;;;17652:20:0;;17723:35;;;;;;133:18:1;17723:35:0;14:177:1;45690:947:0;45749:12;45764:10;45773:1;45764:6;:10;:::i;:::-;45749:25;-1:-1:-1;45785:17:0;45805:13;45749:25;45805:6;:13;:::i;:::-;45914:16;;;45928:1;45914:16;;;;;;;;45785:33;;-1:-1:-1;45856:21:0;;45831:22;;45914:16;;;;;;;;;;-1:-1:-1;45914:16:0;45890:40;;45959:4;45941;45946:1;45941:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45941:23:0;;;:7;;;;;;;;;;:23;;;;45985:15;;:22;;;-1:-1:-1;;;45985:22:0;;;;:15;;;;;:20;;:22;;;;;45941:7;;45985:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45975:4;45980:1;45975:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;45975:32:0;;;:7;;;;;;;;;:32;46020:15;;:207;;-1:-1:-1;;;46020:207:0;;:15;;;:66;;:207;;46101:4;;46020:15;;46164:4;;46191;;46211:15;;46020:207;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46248:18;46293:14;46269:21;:38;;;;:::i;:::-;46320:15;;:248;;-1:-1:-1;;;46320:248:0;;46393:4;46320:248;;;22553:34:1;22603:18;;;22596:34;;;46320:15:0;22646:18:1;;;22639:34;;;22689:18;;;22682:34;31658:42:0;22732:19:1;;;22725:44;46542:15:0;22785:19:1;;;22778:35;46248:59:0;;-1:-1:-1;;;;;;46320:15:0;;:31;;46248:59;;22487:19:1;;46320:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;46586:43:0;;;23026:25:1;;;23082:2;23067:18;;23060:34;;;23110:18;;;23103:34;;;46586:43:0;;-1:-1:-1;23014:2:1;22999:18;46586:43:0;;;;;;;45738:899;;;;;45690:947;:::o;36012:315::-;36125:6;36100:21;:31;;36092:73;;;;-1:-1:-1;;;36092:73:0;;23350:2:1;36092:73:0;;;23332:21:1;23389:2;23369:18;;;23362:30;23428:31;23408:18;;;23401:59;23477:18;;36092:73:0;23148:353:1;36092:73:0;36179:12;36197:9;-1:-1:-1;;;;;36197:14:0;36219:6;36197:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36178:52;;;36249:7;36241:78;;;;-1:-1:-1;;;36241:78:0;;23918:2:1;36241:78:0;;;23900:21:1;23957:2;23937:18;;;23930:30;23996:34;23976:18;;;23969:62;24067:28;24047:18;;;24040:56;24113:19;;36241:78:0;23716:422:1;46645:739:0;46733:16;;;46747:1;46733:16;;;;;;;;46709:21;;46733:16;;;;;;;;-1:-1:-1;;46770:15:0;;:22;;;-1:-1:-1;;;46770:22:0;;;;46709:40;;-1:-1:-1;;;;;;46770:15:0;;;;:20;;-1:-1:-1;46770:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46760:4;46765:1;46760:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;46760:32:0;;;-1:-1:-1;;;;;46760:32:0;;;;;46813:11;46803:4;46808:1;46803:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46803:21:0;;;:7;;;;;;;;;:21;46837:15;;:185;;-1:-1:-1;;;46837:185:0;;:15;;;:66;;46911:6;;46837:185;;:15;;46949:4;;46976;;46996:15;;46837:185;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47072:44:0;;-1:-1:-1;;;47072:44:0;;47110:4;47072:44;;;1570:51:1;47043:26:0;;-1:-1:-1;47079:11:0;-1:-1:-1;;;;;47072:29:0;;-1:-1:-1;47072:29:0;;-1:-1:-1;1543:18:1;;47072:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47179:15;;47142:74;;-1:-1:-1;;;47142:74:0;;-1:-1:-1;;;;;47179:15:0;;;47142:74;;;17351:51:1;17418:18;;;17411:34;;;47043:73:0;;-1:-1:-1;47127:12:0;;47149:11;47142:28;;;;;;17324:18:1;;47142:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47127:89;;47233:7;47229:148;;;47257:15;;:55;;-1:-1:-1;;;47257:55:0;;;;;160:25:1;;;-1:-1:-1;;;;;47257:15:0;;;;:35;;133:18:1;;47257:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47332:33;47346:18;47332:33;;;;160:25:1;;148:2;133:18;;14:177;47332:33:0;;;;;;;;46698:686;;;46645:739;:::o;196:548:1:-;308:4;337:2;366;355:9;348:21;398:6;392:13;441:6;436:2;425:9;421:18;414:34;466:1;476:140;490:6;487:1;484:13;476:140;;;585:14;;;581:23;;575:30;551:17;;;570:2;547:26;540:66;505:10;;476:140;;;480:3;665:1;660:2;651:6;640:9;636:22;632:31;625:42;735:2;728;724:7;719:2;711:6;707:15;703:29;692:9;688:45;684:54;676:62;;;;196:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1632:247::-;1691:6;1744:2;1732:9;1723:7;1719:23;1715:32;1712:52;;;1760:1;1757;1750:12;1712:52;1799:9;1786:23;1818:31;1843:5;1818:31;:::i;1884:456::-;1961:6;1969;1977;2030:2;2018:9;2009:7;2005:23;2001:32;1998:52;;;2046:1;2043;2036:12;1998:52;2085:9;2072:23;2104:31;2129:5;2104:31;:::i;:::-;2154:5;-1:-1:-1;2211:2:1;2196:18;;2183:32;2224:33;2183:32;2224:33;:::i;:::-;1884:456;;2276:7;;-1:-1:-1;;;2330:2:1;2315:18;;;;2302:32;;1884:456::o;2345:180::-;2404:6;2457:2;2445:9;2436:7;2432:23;2428:32;2425:52;;;2473:1;2470;2463:12;2425:52;-1:-1:-1;2496:23:1;;2345:180;-1:-1:-1;2345:180:1:o;3159:118::-;3245:5;3238:13;3231:21;3224:5;3221:32;3211:60;;3267:1;3264;3257:12;3282:241;3338:6;3391:2;3379:9;3370:7;3366:23;3362:32;3359:52;;;3407:1;3404;3397:12;3359:52;3446:9;3433:23;3465:28;3487:5;3465:28;:::i;3528:316::-;3605:6;3613;3621;3674:2;3662:9;3653:7;3649:23;3645:32;3642:52;;;3690:1;3687;3680:12;3642:52;-1:-1:-1;;3713:23:1;;;3783:2;3768:18;;3755:32;;-1:-1:-1;3834:2:1;3819:18;;;3806:32;;3528:316;-1:-1:-1;3528:316:1:o;3849:382::-;3914:6;3922;3975:2;3963:9;3954:7;3950:23;3946:32;3943:52;;;3991:1;3988;3981:12;3943:52;4030:9;4017:23;4049:31;4074:5;4049:31;:::i;:::-;4099:5;-1:-1:-1;4156:2:1;4141:18;;4128:32;4169:30;4128:32;4169:30;:::i;:::-;4218:7;4208:17;;;3849:382;;;;;:::o;4942:248::-;5010:6;5018;5071:2;5059:9;5050:7;5046:23;5042:32;5039:52;;;5087:1;5084;5077:12;5039:52;-1:-1:-1;;5110:23:1;;;5180:2;5165:18;;;5152:32;;-1:-1:-1;4942:248:1:o;5195:388::-;5263:6;5271;5324:2;5312:9;5303:7;5299:23;5295:32;5292:52;;;5340:1;5337;5330:12;5292:52;5379:9;5366:23;5398:31;5423:5;5398:31;:::i;:::-;5448:5;-1:-1:-1;5505:2:1;5490:18;;5477:32;5518:33;5477:32;5518:33;:::i;5588:380::-;5667:1;5663:12;;;;5710;;;5731:61;;5785:4;5777:6;5773:17;5763:27;;5731:61;5838:2;5830:6;5827:14;5807:18;5804:38;5801:161;;5884:10;5879:3;5875:20;5872:1;5865:31;5919:4;5916:1;5909:15;5947:4;5944:1;5937:15;5801:161;;5588:380;;;:::o;5973:356::-;6175:2;6157:21;;;6194:18;;;6187:30;6253:34;6248:2;6233:18;;6226:62;6320:2;6305:18;;5973:356::o;6334:184::-;6404:6;6457:2;6445:9;6436:7;6432:23;6428:32;6425:52;;;6473:1;6470;6463:12;6425:52;-1:-1:-1;6496:16:1;;6334:184;-1:-1:-1;6334:184:1:o;6828:245::-;6895:6;6948:2;6936:9;6927:7;6923:23;6919:32;6916:52;;;6964:1;6961;6954:12;6916:52;6996:9;6990:16;7015:28;7037:5;7015:28;:::i;8724:306::-;8812:6;8820;8828;8881:2;8869:9;8860:7;8856:23;8852:32;8849:52;;;8897:1;8894;8887:12;8849:52;8926:9;8920:16;8910:26;;8976:2;8965:9;8961:18;8955:25;8945:35;;9020:2;9009:9;9005:18;8999:25;8989:35;;8724:306;;;;;:::o;9431:127::-;9492:10;9487:3;9483:20;9480:1;9473:31;9523:4;9520:1;9513:15;9547:4;9544:1;9537:15;9563:125;9628:9;;;9649:10;;;9646:36;;;9662:18;;:::i;10887:400::-;11089:2;11071:21;;;11128:2;11108:18;;;11101:30;11167:34;11162:2;11147:18;;11140:62;-1:-1:-1;;;11233:2:1;11218:18;;11211:34;11277:3;11262:19;;10887:400::o;11645:681::-;11776:6;11784;11792;11800;11808;11816;11824;11832;11885:3;11873:9;11864:7;11860:23;11856:33;11853:53;;;11902:1;11899;11892:12;11853:53;11934:9;11928:16;11953:31;11978:5;11953:31;:::i;:::-;12003:5;11993:15;;;12048:2;12037:9;12033:18;12027:25;12017:35;;12092:2;12081:9;12077:18;12071:25;12061:35;;12136:2;12125:9;12121:18;12115:25;12105:35;;12180:3;12169:9;12165:19;12159:26;12149:36;;12225:3;12214:9;12210:19;12204:26;12194:36;;12270:3;12259:9;12255:19;12249:26;12239:36;;12315:3;12304:9;12300:19;12294:26;12284:36;;11645:681;;;;;;;;;;;:::o;12331:217::-;12371:1;12397;12387:132;;12441:10;12436:3;12432:20;12429:1;12422:31;12476:4;12473:1;12466:15;12504:4;12501:1;12494:15;12387:132;-1:-1:-1;12533:9:1;;12331:217::o;12984:422::-;13073:1;13116:5;13073:1;13130:270;13151:7;13141:8;13138:21;13130:270;;;13210:4;13206:1;13202:6;13198:17;13192:4;13189:27;13186:53;;;13219:18;;:::i;:::-;13269:7;13259:8;13255:22;13252:55;;;13289:16;;;;13252:55;13368:22;;;;13328:15;;;;13130:270;;;13134:3;12984:422;;;;;:::o;13411:806::-;13460:5;13490:8;13480:80;;-1:-1:-1;13531:1:1;13545:5;;13480:80;13579:4;13569:76;;-1:-1:-1;13616:1:1;13630:5;;13569:76;13661:4;13679:1;13674:59;;;;13747:1;13742:130;;;;13654:218;;13674:59;13704:1;13695:10;;13718:5;;;13742:130;13779:3;13769:8;13766:17;13763:43;;;13786:18;;:::i;:::-;-1:-1:-1;;13842:1:1;13828:16;;13857:5;;13654:218;;13956:2;13946:8;13943:16;13937:3;13931:4;13928:13;13924:36;13918:2;13908:8;13905:16;13900:2;13894:4;13891:12;13887:35;13884:77;13881:159;;;-1:-1:-1;13993:19:1;;;14025:5;;13881:159;14072:34;14097:8;14091:4;14072:34;:::i;:::-;14142:6;14138:1;14134:6;14130:19;14121:7;14118:32;14115:58;;;14153:18;;:::i;:::-;14191:20;;13411:806;-1:-1:-1;;;13411:806:1:o;14222:140::-;14280:5;14309:47;14350:4;14340:8;14336:19;14330:4;14309:47;:::i;14799:168::-;14872:9;;;14903;;14920:15;;;14914:22;;14900:37;14890:71;;14941:18;;:::i;18620:401::-;18822:2;18804:21;;;18861:2;18841:18;;;18834:30;18900:34;18895:2;18880:18;;18873:62;-1:-1:-1;;;18966:2:1;18951:18;;18944:35;19011:3;18996:19;;18620:401::o;19026:399::-;19228:2;19210:21;;;19267:2;19247:18;;;19240:30;19306:34;19301:2;19286:18;;19279:62;-1:-1:-1;;;19372:2:1;19357:18;;19350:33;19415:3;19400:19;;19026:399::o;19783:423::-;19985:2;19967:21;;;20024:2;20004:18;;;19997:30;20063:34;20058:2;20043:18;;20036:62;20134:29;20129:2;20114:18;;20107:57;20196:3;20181:19;;19783:423::o;20211:128::-;20278:9;;;20299:11;;;20296:37;;;20313:18;;:::i;20476:127::-;20537:10;20532:3;20528:20;20525:1;20518:31;20568:4;20565:1;20558:15;20592:4;20589:1;20582:15;20608:251;20678:6;20731:2;20719:9;20710:7;20706:23;20702:32;20699:52;;;20747:1;20744;20737:12;20699:52;20779:9;20773:16;20798:31;20823:5;20798:31;:::i;20864:461::-;20917:3;20955:5;20949:12;20982:6;20977:3;20970:19;21008:4;21037:2;21032:3;21028:12;21021:19;;21074:2;21067:5;21063:14;21095:1;21105:195;21119:6;21116:1;21113:13;21105:195;;;21184:13;;-1:-1:-1;;;;;21180:39:1;21168:52;;21240:12;;;;21275:15;;;;21216:1;21134:9;21105:195;;;-1:-1:-1;21316:3:1;;20864:461;-1:-1:-1;;;;;20864:461:1:o;21330:582::-;21629:6;21618:9;21611:25;21672:6;21667:2;21656:9;21652:18;21645:34;21715:3;21710:2;21699:9;21695:18;21688:31;21592:4;21736:57;21788:3;21777:9;21773:19;21765:6;21736:57;:::i;:::-;-1:-1:-1;;;;;21829:32:1;;;;21824:2;21809:18;;21802:60;-1:-1:-1;21893:3:1;21878:19;21871:35;21728:65;21330:582;-1:-1:-1;;;21330:582:1:o;24143:510::-;24414:6;24403:9;24396:25;24457:3;24452:2;24441:9;24437:18;24430:31;24377:4;24478:57;24530:3;24519:9;24515:19;24507:6;24478:57;:::i;:::-;-1:-1:-1;;;;;24571:32:1;;;;24566:2;24551:18;;24544:60;-1:-1:-1;24635:2:1;24620:18;24613:34;24470:65;24143:510;-1:-1:-1;;24143:510:1:o

Swarm Source

ipfs://30c92f7efd25d6a93c17cbff2ecb5016e3e0c3daadde8345bebb6d49e4d5acc9
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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