ETH Price: $3,174.17 (-8.27%)
Gas: 2 Gwei

Token

Melania Trumps Butthole ($BUTTHOLE)
 

Overview

Max Total Supply

100,000,000 $BUTTHOLE

Holders

62

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000000109463911 $BUTTHOLE

Value
$0.00
0x2adae1fedd886b9e04f5f8c17f771d99ba73f83d
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:
BUTTHOLE

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-03-07
*/

/**

        Melania Trump’s Butthole

            100M supply

    They hate us because they anus.

            T.me/MTButthole

           www.MTButthole.com

            X.com/MTButthole

*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.15;

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

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

interface IUniswapV2Pair {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 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 (uint256);

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

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

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

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 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 (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    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 (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IERC20 {
    function totalSupply() external view returns (uint256);

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

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

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

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

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 internal _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 18;
    }

    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 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);
}

interface DividendPayingTokenInterface {
    function dividendOf(address _owner) external view returns (uint256);

    function distributeDividends() external payable;

    function withdrawDividend() external;

    event DividendsDistributed(address indexed from, uint256 weiAmount);

    event DividendWithdrawn(address indexed to, uint256 weiAmount);
}

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;
    }
}

contract Ownable is Context {
    address private _owner;

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

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;
    }
}

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

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

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

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

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

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

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

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

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

    uint256 internal constant magnitude = 2**128;

    uint256 internal magnifiedDividendPerShare;

    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    uint256 public totalDividendsDistributed;

    constructor(string memory _name, string memory _symbol)
        ERC20(_name, _symbol)
    {}

    receive() external payable {
        distributeDividends();
    }

    function distributeDividends() public payable override {
        require(totalSupply() > 0);

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

            totalDividendsDistributed = totalDividendsDistributed.add(
                msg.value
            );
        }
    }

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

    function _withdrawDividendOfUser(address payable user)
        internal
        virtual
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );
            emit DividendWithdrawn(user, _withdrawableDividend);
            (bool success, ) = user.call{
                value: _withdrawableDividend,
                gas: 3000
            }("");

            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 BUTTHOLE is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;

    address public uniswapV2Pair;
    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    bool private swapping;
    bool public tradingEnabled = false;

    uint256 public sellAmount = 1;
    uint256 public buyAmount = 1;

    uint256 private totalSellFees;
    uint256 private totalBuyFees;

    BUTTHOLEDividendTracker public dividendTracker;

    address payable public marketingWallet;
    address payable public DevWallet;

    // Max tx, dividend threshold and tax variables
    uint256 public maxWallet;
    uint256 public swapThreshold;
    uint256 public swapTokensAtAmount;
    uint256 public sellRewardsFee;
    uint256 public sellMarketingFees;
    uint256 public buyMarketingFees;
    uint256 public buyRewardsFee;
    uint256 public buyDevFee;
    uint256 public sellDevFee;

    // gas for processing auto claim dividends 
    uint256 public gasForProcessing = 300000;

    // exlcude from fees and max transaction amount
    mapping(address => bool) private _isExcludedFromFees;

    mapping(address => bool) public automatedMarketMakerPairs;

    //for allowing specific address to trade while trading has not been enabled yet 
    mapping(address => bool) private canTransferBeforeTradingIsEnabled;  
    
    event updateMarketingWallet(address wallet);
    event updateDevWallet(address wallet);

    event UpdateDividendTracker(
        address indexed newAddress,
        address indexed oldAddress
    );

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event TradingEnabled();

    event UpdateFees(
        uint256 sellMarketingFees,
        uint256 sellRewardsFee,
        uint256 buyMarketingFees,
        uint256 buyRewardsFee,
        uint256 buyDevFee,
        uint256 sellDevFee
    );


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

    event GasForProcessingUpdated(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );

    event SendDividends(uint256 amount, uint256 opAmount, bool success);

    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );

    event UpdatePayoutToken(address token);

    constructor() ERC20("Melania Trumps Butthole", "$BUTTHOLE") {
        marketingWallet = payable(0xe6c1e7b41d709730EA18fc309673e88166F591bf);
        DevWallet = payable(0xA93bC64A07976882A43bb87E111c14599f8CfdC0);
        address router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;

        buyMarketingFees = 3600;
        sellMarketingFees = 3600;
        buyRewardsFee = 0;
        sellRewardsFee = 0;
        buyDevFee = 400;
        sellDevFee = 400;

        totalBuyFees = buyRewardsFee
            .add(buyMarketingFees)
            .add(buyDevFee);
        totalSellFees = sellRewardsFee
            .add(sellMarketingFees)
            .add(sellDevFee);

        dividendTracker = new BUTTHOLEDividendTracker(
            payable(this),
            router,
            0x576e2BeD8F7b46D34016198911Cdf9886f78bea7,
            "BUTTHOLETRACKER",
            "MTBTRACKER"
        );

        uniswapV2Router = IUniswapV2Router02(router);
        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(
                address(this),
                uniswapV2Router.WETH()
            );

        _setAutomatedMarketMakerPair(uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(DEAD);
        dividendTracker.excludedFromDividends(address(0));
        dividendTracker.excludeFromDividends(router);
        dividendTracker.excludeFromDividends(marketingWallet);
        dividendTracker.excludeFromDividends(owner());

        // exclude from paying fees or having max transaction amount
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[address(dividendTracker)] = true;
        _isExcludedFromFees[address(marketingWallet)] = true;
        _isExcludedFromFees[address(DevWallet)] = true;
        _isExcludedFromFees[msg.sender] = true;

        uint256 totalTokenSupply = (100_000_000) * (10**18);
        _mint(owner(), totalTokenSupply); // only time internal mint function is ever called is to create supply
        maxWallet = totalTokenSupply / 50; // 2%
        swapThreshold = totalTokenSupply / 200; // 0.5%
        swapTokensAtAmount = totalTokenSupply / 1000; // 0.1%
        canTransferBeforeTradingIsEnabled[owner()] = true;
        canTransferBeforeTradingIsEnabled[address(this)] = true; 
    }

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

    receive() external payable {}

    function enableTrading() external onlyOwner {
        require(!tradingEnabled);
        tradingEnabled = true;
        emit TradingEnabled();
    }
    
    // set new marketing wallet
    function setMarketingWallet(address wallet) external onlyOwner {
        _isExcludedFromFees[wallet] = true;
        marketingWallet = payable(wallet);
        emit updateMarketingWallet(wallet);
    }

    //set new Dev wallet
    function setDevWallet(address wallet) external onlyOwner {
        _isExcludedFromFees[wallet] = true;
        DevWallet = payable(wallet);
        emit updateDevWallet(wallet);
    }    
    
    // exclude a wallet from fees 
    function setExcludeFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    // exclude from dividends (rewards)
    function setExcludeDividends(address account) public onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    // include in dividends 
    function setIncludeDividends(address account) public onlyOwner {
        dividendTracker.includeFromDividends(account);
        dividendTracker.setBalance(account, 0);
    }

    //allow a wallet to trade before trading enabled
    function setCanTransferBefore(address wallet, bool enable)
        external
        onlyOwner
    {
        canTransferBeforeTradingIsEnabled[wallet] = enable;
    }

    // set max wallet, can not be lower than 0.05% of supply
    function setmaxWallet(uint256 _maxwallet) external onlyOwner {
        require(_maxwallet >= 50000, "max wallet cannot be set to less than 0.05%");
        maxWallet = _maxwallet * (10 ** 18);
    }

    // tax threshold
    function setSwapTriggerAmount(uint256 amount) public onlyOwner {
        swapTokensAtAmount = amount * (10 ** 18);
    }

    function changeSwapthreshold(uint256 _swapThreshold) public onlyOwner {
        require(_swapThreshold > 0 && _swapThreshold <= 3000001, "Swap threshold must be greater than 0 and less than 3% of total supply");
        swapThreshold = _swapThreshold * (10 ** 18);
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        _setAutomatedMarketMakerPair(pair, value);
    }

    function setAllowCustomTokens(bool allow) public onlyOwner {
        dividendTracker.setAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) public onlyOwner {
        dividendTracker.setAllowAutoReinvest(allow);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateGasForProcessing(uint256 newValue) public onlyOwner {
        require(newValue >= 200000 && newValue <= 1000000);
        emit GasForProcessingUpdated(newValue, gasForProcessing);
        gasForProcessing = newValue;
    }

    function transferAdmin(address newOwner) public onlyOwner {
        dividendTracker.excludeFromDividends(newOwner);
        _isExcludedFromFees[newOwner] = true;
        transferOwnership(newOwner);
    }

    function updateFees(
        uint256 marketingBuy,
        uint256 marketingSell,
        uint256 RewardsBuy,
        uint256 RewardsSell,
        uint256 DevBuy,
        uint256 DevSell
    ) public onlyOwner {
        buyMarketingFees = marketingBuy;
        buyRewardsFee = RewardsBuy;
        sellMarketingFees = marketingSell;
        sellRewardsFee = RewardsSell;
        buyDevFee = DevBuy;
        sellDevFee = DevSell;

        totalSellFees = sellRewardsFee
            .add(sellMarketingFees)
            .add(sellDevFee);

        totalBuyFees = buyRewardsFee
            .add(buyMarketingFees)
            .add(buyDevFee);

        require(totalSellFees <= 500 && totalBuyFees <= 500, "total fees cannot exceed 8% sell or buy");

        emit UpdateFees(
            sellMarketingFees,
            sellRewardsFee,
            buyMarketingFees,
            buyRewardsFee,
            buyDevFee,
            sellDevFee
        );
    }

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

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

    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 getAccountDividendsInfo(address account)
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256
        )
    {
        return dividendTracker.getAccount(account);
    }

    function getAccountDividendsInfoAtIndex(uint256 index)
        external
        view
        returns (
            address,
            int256,
            int256,
            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 getLastProcessedIndex() external view returns (uint256) {
        return dividendTracker.getLastProcessedIndex();
    }

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

    function setAutoClaim(bool value) external {
        dividendTracker.setAutoClaim(msg.sender, value);
    }

    function setReinvest(bool value) external {
        dividendTracker.setReinvest(msg.sender, value);
    }

    function setDividendsPaused(bool value) external onlyOwner {
        dividendTracker.setDividendsPaused(value);
    }

    function isExcludedFromAutoClaim(address account)
        external
        view
        returns (bool)
    {
        return dividendTracker.isExcludedFromAutoClaim(account);
    }

    function isReinvest(address account) external view returns (bool) {
        return dividendTracker.isReinvest(account);
    }

    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");
        uint256 RewardsFee;
        uint256 marketingFees;
        uint256 DevFee;

        if (!canTransferBeforeTradingIsEnabled[from]) {
            require(tradingEnabled, "Trading has not yet been enabled");
        }        
        
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        } 
        
        if (to == DEAD) {
            _burn(from, amount);
            return;
        }

        else if (
            !swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]
        ) {
            bool isSelling = automatedMarketMakerPairs[to];
            bool isBuying = automatedMarketMakerPairs[from];
            
            if (!isBuying && !isSelling) {
                super._transfer(from, to, amount);
                dividendTracker.setBalance(from, balanceOf(from));
                dividendTracker.setBalance(to, balanceOf(to));
                return;
            }

            else if (isSelling) {
                RewardsFee = sellRewardsFee;
                marketingFees = sellMarketingFees;
                DevFee = sellDevFee;

            } else if (isBuying) {
                RewardsFee = buyRewardsFee;
                marketingFees = buyMarketingFees;
                DevFee = buyDevFee;

                uint256 contractBalanceRecipient = balanceOf(to);
                require(contractBalanceRecipient + amount <= maxWallet,"Exceeds maximum wallet token amount." );
            }
            uint256 totalFees = RewardsFee
                .add(marketingFees + DevFee);

            uint256 contractTokenBalance = balanceOf(address(this));

            bool canSwap = contractTokenBalance >= swapTokensAtAmount;

            if (canSwap && !automatedMarketMakerPairs[from]) {
                swapping = true;

                uint256 remainingBalance = balanceOf(address(this));
                swapAndSendDividends(remainingBalance);
                buyAmount = 1;
                sellAmount = 1;
                swapping = false;
            }

            uint256 fees = amount.mul(totalFees).div(10000);

            amount = amount.sub(fees);

            if (isSelling) {
                sellAmount = sellAmount.add(fees);
            } else {
                buyAmount = buyAmount.add(fees);
            }

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

        }

        super._transfer(from, to, amount);
        dividendTracker.setBalance(from, balanceOf(from));
        dividendTracker.setBalance(to, balanceOf(to));
        
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        uint256 tokensToSwap = (tokenAmount > swapThreshold) ? swapThreshold : tokenAmount;
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokensToSwap );
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokensToSwap,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function updatePayoutToken(address token) public onlyOwner {
        dividendTracker.updatePayoutToken(token);
        emit UpdatePayoutToken(token);
    }

    function getPayoutToken() public view returns (address) {
        return dividendTracker.getPayoutToken();
    }

    function getMinimumTokenBalanceForAutoDividends() public view returns (uint256) {
        return dividendTracker.getMinimumTokenBalanceForAutoDividends();
    }

    function getMinimumTokenBalanceForDividends() public view returns (uint256) {
        return dividendTracker.getMinimumTokenBalanceForDividends();
    }        

    function setMinimumTokenBalanceForAutoDividends(uint256 value)
        public
        onlyOwner
    {
        dividendTracker.setMinimumTokenBalanceForAutoDividends(value);
    }

    function setMinimumTokenBalanceForDividends(uint256 value)
        public
        onlyOwner
    {
        dividendTracker.setMinimumTokenBalanceForDividends(value);
    }

    function forceSwapAndSendDividends(uint256 tokens) public onlyOwner {
        tokens = tokens * (10**18);
        uint256 totalAmount = buyAmount.add(sellAmount);
        uint256 fromBuy = tokens.mul(buyAmount).div(totalAmount);
        uint256 fromSell = tokens.mul(sellAmount).div(totalAmount);

        swapAndSendDividends(tokens);

        buyAmount = buyAmount.sub(fromBuy);
        sellAmount = sellAmount.sub(fromSell);
    }

    function swapAndSendDividends(uint256 tokens) private {
        if (tokens == 0) {
            return;
        }
        swapTokensForEth(tokens);
        uint256 totalAmount = buyAmount.add(sellAmount);

        bool success = true;
        bool successOp1 = true;
        bool successOp2 = true;

        uint256 dividends;
        uint256 dividendsFromBuy;
        uint256 dividendsFromSell;

        if (buyRewardsFee > 0) {
            dividendsFromBuy = address(this)
            .balance
            .mul(buyAmount)
            .div(totalAmount)
            .mul(buyRewardsFee)
            .div(buyRewardsFee + buyMarketingFees + buyDevFee);
        }
        if (sellRewardsFee > 0) {
            dividendsFromSell = address(this)
            .balance
            .mul(sellAmount)
            .div(totalAmount)
            .mul(sellRewardsFee)
            .div(sellRewardsFee + sellMarketingFees + sellDevFee);
        }
        dividends = dividendsFromBuy.add(dividendsFromSell);

        if (dividends > 0) {
            (success, ) = address(dividendTracker).call{value: dividends}("");
        }
        
        uint256 _completeFees = sellMarketingFees.add(sellDevFee) +
            buyMarketingFees.add(buyDevFee);

        uint256 feePortions;
        if (_completeFees > 0) {
            feePortions = address(this).balance.div(_completeFees);
        }
        uint256 marketingPayout = buyMarketingFees.add(sellMarketingFees) * feePortions;
        uint256 DevPayout = buyDevFee.add(sellDevFee) * feePortions;

        if (marketingPayout > 0) {
            (successOp1, ) = address(marketingWallet).call{value: marketingPayout}("");
        }
        if (DevPayout > 0) {
            (successOp2, ) = address(DevWallet).call{value: DevPayout}("");
        }

        emit SendDividends(
            dividends,
            marketingPayout + DevPayout,
            success && successOp1 && successOp2
        );
    }

    function airdropToWallets(
        address[] memory airdropWallets,
        uint256[] memory amount
    ) external onlyOwner {
        require(airdropWallets.length == amount.length,"Arrays must be the same length");
        require(airdropWallets.length <= 200, "Wallets list length must be <= 200");
        for (uint256 i = 0; i < airdropWallets.length; i++) {
            address wallet = airdropWallets[i];
            uint256 airdropAmount = amount[i] * (10**18);
            super._transfer(msg.sender, wallet, airdropAmount);
            dividendTracker.setBalance(payable(wallet), balanceOf(wallet));
        }
    }
}

contract BUTTHOLEDividendTracker is DividendPayingToken, Ownable {
    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 => bool) public excludedFromAutoClaim;
    mapping(address => bool) public autoReinvest;
    address public defaultToken; 
    bool public allowCustomTokens;
    bool public allowAutoReinvest;
    bool public dividendsPaused = false;

    string private trackerName;
    string private trackerTicker;

    IUniswapV2Router02 public uniswapV2Router;

    BUTTHOLE public BUTTHOLEContract;

    mapping(address => uint256) public lastClaimTimes;

    uint256 private minimumTokenBalanceForAutoDividends;
    uint256 private minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event DividendReinvested(
        address indexed acount,
        uint256 value,
        bool indexed automatic
    );
    event Claim(
        address indexed account,
        uint256 amount,
        bool indexed automatic
    );
    event DividendsPaused(bool paused);
    event SetAllowCustomTokens(bool allow);
    event SetAllowAutoReinvest(bool allow);

    constructor(
        address payable mainContract,
        address router,
        address token,
        string memory _name,
        string memory _ticker
    ) DividendPayingToken(_name, _ticker) {
        trackerName = _name;
        trackerTicker = _ticker;
        defaultToken = token;
        BUTTHOLEContract = BUTTHOLE(mainContract);
        minimumTokenBalanceForAutoDividends = 50_000_000 * (10**18);
        minimumTokenBalanceForDividends = 100 * (10**18);

        uniswapV2Router = IUniswapV2Router02(router);
        allowCustomTokens = true;
        allowAutoReinvest = false;
    }

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

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

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

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

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

    function isExcludedFromAutoClaim(address account)
        external
        view
        onlyOwner
        returns (bool)
    {
        return excludedFromAutoClaim[account];
    }

    function isReinvest(address account)
        external
        view
        onlyOwner
        returns (bool)
    {
        return autoReinvest[account];
    }

    function setAllowCustomTokens(bool allow) external onlyOwner {
        require(allowCustomTokens != allow);
        allowCustomTokens = allow;
        emit SetAllowCustomTokens(allow);
    }

    function setAllowAutoReinvest(bool allow) external onlyOwner {
        require(allowAutoReinvest != allow);
        allowAutoReinvest = allow;
        emit SetAllowAutoReinvest(allow);
    }

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

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

        emit ExcludeFromDividends(account);
    }

    function includeFromDividends(address account) external onlyOwner {
        excludedFromDividends[account] = false;
    }

    function setAutoClaim(address account, bool value) external onlyOwner {
        excludedFromAutoClaim[account] = value;
    }

    function setReinvest(address account, bool value) external onlyOwner {
        autoReinvest[account] = value;
    }

    function setMinimumTokenBalanceForAutoDividends(uint256 value)
        external
        onlyOwner
    {
        minimumTokenBalanceForAutoDividends = value * (10**18);
    }

    function setMinimumTokenBalanceForDividends(uint256 value)
        external
        onlyOwner
    {
        minimumTokenBalanceForDividends = value * (10**18);
    }

    function setDividendsPaused(bool value) external onlyOwner {
        require(dividendsPaused != value);
        dividendsPaused = value;
        emit DividendsPaused(value);
    }

    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
        )
    {
        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];
    }

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

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

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

        if (newBalance < minimumTokenBalanceForDividends) {
            tokenHoldersMap.remove(account);
            _setBalance(account, 0);

            return;
        }

        _setBalance(account, newBalance);

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

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

        if (numberOfTokenHolders == 0 || dividendsPaused) {
            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 >= numberOfTokenHolders) {
                _lastProcessedIndex = 0;
            }

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

            if (!excludedFromAutoClaim[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)
    {
        if (dividendsPaused) {
            return false;
        }

        bool reinvest = autoReinvest[account];

        if (automatic && reinvest && !allowAutoReinvest) {
            return false;
        }

        uint256 amount = reinvest
            ? _reinvestDividendOfUser(account)
            : _withdrawDividendOfUser(account);

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

        return false;
    }

    function updatePayoutToken(address token) public onlyOwner {
        defaultToken = token;
    }

    function getPayoutToken() public view returns (address) {
        return defaultToken;
    }

    function getMinimumTokenBalanceForAutoDividends() public view returns (uint256) {
        return minimumTokenBalanceForAutoDividends;
    }

    function getMinimumTokenBalanceForDividends() public view returns (uint256) {
        return minimumTokenBalanceForDividends;
    }        

    function _reinvestDividendOfUser(address account)
        private
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(account);
        if (_withdrawableDividend > 0) {
            bool success;

            withdrawnDividends[account] = withdrawnDividends[account].add(
                _withdrawableDividend
            );

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

            uint256 prevBalance = BUTTHOLEContract.balanceOf(address(this));

            // make the swap
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableDividend
                }(
                    0, // accept any amount of Tokens
                    path,
                    address(this),
                    block.timestamp
                )
            {
                uint256 received = BUTTHOLEContract
                    .balanceOf(address(this))
                    .sub(prevBalance);
                if (received > 0) {
                    success = true;
                    BUTTHOLEContract.transfer(account, received);
                } else {
                    success = false;
                }
            } catch {
                success = false;
            }

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

            return _withdrawableDividend;
        }

        return 0;
    }

    function _withdrawDividendOfUser(address payable user)
        internal
        override
        returns (uint256)
    {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(
                _withdrawableDividend
            );

            address tokenAddress = defaultToken;
            bool success;

            if (tokenAddress == address(0)) {
                (success, ) = user.call{
                    value: _withdrawableDividend,
                    gas: 3000
                }("");
            } else {
                address[] memory path = new address[](2);
                path[0] = uniswapV2Router.WETH();
                path[1] = tokenAddress;
                try
                    uniswapV2Router
                        .swapExactETHForTokensSupportingFeeOnTransferTokens{
                        value: _withdrawableDividend
                    }(
                        0, // accept any amount of Tokens
                        path,
                        user,
                        block.timestamp
                    )
                {
                    success = true;
                } catch {
                    success = false;
                }
            }

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

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

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

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

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

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

    function set(
        Map storage map,
        address key,
        uint256 val
    ) internal {
        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) internal {
        if (!map.inserted[key]) {
            return;
        }

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

        uint256 index = map.indexOf[key];
        uint256 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();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"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":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","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":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"opAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"}],"name":"SendDividends","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":[],"name":"TradingEnabled","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":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"sellMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyDevFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellDevFee","type":"uint256"}],"name":"UpdateFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"UpdatePayoutToken","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"updateDevWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"updateMarketingWallet","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DevWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"airdropWallets","type":"address[]"},{"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"airdropToWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","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":[],"name":"buyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_swapThreshold","type":"uint256"}],"name":"changeSwapthreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","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 BUTTHOLEDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"forceSwapAndSendDividends","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"}],"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"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimumTokenBalanceForAutoDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimumTokenBalanceForDividends","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":"getPayoutToken","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"isExcludedFromAutoClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"isReinvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"sellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowAutoReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"allow","type":"bool"}],"name":"setAllowCustomTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutoClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"enable","type":"bool"}],"name":"setCanTransferBefore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setDividendsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setExcludeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludeFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setIncludeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinimumTokenBalanceForAutoDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setReinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTriggerAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxwallet","type":"uint256"}],"name":"setmaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"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":"newOwner","type":"address"}],"name":"transferAdmin","outputs":[],"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":"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":"marketingBuy","type":"uint256"},{"internalType":"uint256","name":"marketingSell","type":"uint256"},{"internalType":"uint256","name":"RewardsBuy","type":"uint256"},{"internalType":"uint256","name":"RewardsSell","type":"uint256"},{"internalType":"uint256","name":"DevBuy","type":"uint256"},{"internalType":"uint256","name":"DevSell","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"updatePayoutToken","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"}]

608060405260088054600161ff0160a01b03191661dead17905560016009819055600a55620493e060195534801562000036575f80fd5b506040518060400160405280601781526020017f4d656c616e6961205472756d70732042757474686f6c65000000000000000000815250604051806040016040528060098152602001682442555454484f4c4560b81b8152508160039081620000a0919062000ad6565b506004620000af828262000ad6565b5050505f620000c36200080a60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e80546001600160a01b031990811673e6c1e7b41d709730ea18fc309673e88166f591bf17909155600f805490911673a93bc64a07976882a43bb87e111c14599f8cfdc0179055610e10601581905560148190555f6016819055601381905561019060178190556018819055737a250d5630b4cf539739df2c5dacb4c659f2488d92620001aa92620001a3916200080e565b906200080e565b600c55601854601454601354620001c89291620001a391906200080e565b600b81905550308173576e2bed8f7b46d34016198911cdf9886f78bea7604051620001f39062000a29565b6001600160a01b0393841681529183166020830152909116604082015260a060608201819052600f908201526e212aaa2a2427a622aa2920a1a5a2a960891b60c082015260e060808201819052600a908201526926aa212a2920a1a5a2a960b11b61010082015261012001604051809103905ff08015801562000278573d5f803e3d5ffd5b50600d80546001600160a01b039283166001600160a01b0319918216179091556006805492841692909116821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620002e1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000307919062000b9e565b6001600160a01b031663c9c653963060065f9054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000367573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200038d919062000b9e565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af1158015620003d8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620003fe919062000b9e565b600780546001600160a01b0319166001600160a01b039290921691821790556200042a9060016200087d565b600d5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db0906024015f604051808303815f87803b1580156200046e575f80fd5b505af115801562000481573d5f803e3d5ffd5b5050600d5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db091506024015f604051808303815f87803b158015620004c8575f80fd5b505af1158015620004db573d5f803e3d5ffd5b5050600d5460085460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db091506024015f604051808303815f87803b15801562000526575f80fd5b505af115801562000539573d5f803e3d5ffd5b5050600d54604051634e7b827f60e01b81525f60048201526001600160a01b039091169250634e7b827f9150602401602060405180830381865afa15801562000584573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005aa919062000bc6565b50600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015f604051808303815f87803b158015620005f0575f80fd5b505af115801562000603573d5f803e3d5ffd5b5050600d54600e5460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db091506024015f604051808303815f87803b1580156200064e575f80fd5b505af115801562000661573d5f803e3d5ffd5b5050600d546001600160a01b031691506331e79db090506200068b6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b158015620006ca575f80fd5b505af1158015620006dd573d5f803e3d5ffd5b5050305f908152601a60205260408082208054600160ff199182168117909255600d546001600160a01b0390811685528385208054831684179055600e54811685528385208054831684179055600f5416845282842080548216831790553384529190922080549091169091179055506a52b7d2dcc80cd2e4000000905062000779620007726005546001600160a01b031690565b8262000942565b6200078660328262000be7565b6010556200079660c88262000be7565b601155620007a76103e88262000be7565b6012556001601c5f620007c26005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081015f908120805494151560ff19958616179055308152601c9092529020805490911660011790555062000c279050565b3390565b5f806200081c838562000c07565b905083811015620008745760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b90505b92915050565b6001600160a01b0382165f908152601b60205260409020805460ff191682158015919091179091556200090757600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015f604051808303815f87803b158015620008ef575f80fd5b505af115801562000902573d5f803e3d5ffd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b6001600160a01b0382166200099a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200086b565b600254620009a990826200080e565b6002556001600160a01b0382165f90815260208190526040902054620009d090826200080e565b6001600160a01b0383165f81815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b612f5c806200454a83390190565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168062000a6057607f821691505b60208210810362000a7f57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000a24575f81815260208120601f850160051c8101602086101562000aad5750805b601f850160051c820191505b8181101562000ace5782815560010162000ab9565b505050505050565b81516001600160401b0381111562000af25762000af262000a37565b62000b0a8162000b03845462000a4b565b8462000a85565b602080601f83116001811462000b40575f841562000b285750858301515b5f19600386901b1c1916600185901b17855562000ace565b5f85815260208120601f198616915b8281101562000b705788860151825594840194600190910190840162000b4f565b508582101562000b8e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121562000baf575f80fd5b81516001600160a01b038116811462000874575f80fd5b5f6020828403121562000bd7575f80fd5b8151801515811462000874575f80fd5b5f8262000c0257634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156200087757634e487b7160e01b5f52601160045260245ffd5b6139158062000c355f395ff3fe608060405260043610610419575f3560e01c806375829def11610220578063a457c2d711610129578063d8032ed3116100b3578063f27fd25411610078578063f27fd25414610c36578063f2fde38b14610c55578063f5d3c79a14610c74578063f8b45b0514610c93578063fc6b151c14610ca8575f80fd5b8063d8032ed314610b96578063dd62ed3e14610bb5578063e2f4560514610bf9578063e7841ec014610c0e578063e7cb7f8714610c22575f80fd5b8063b115e4df116100f9578063b115e4df14610b01578063b62496f514610b20578063ba079d4914610b4e578063bb8d513114610b6d578063bdd4f29f14610b82575f80fd5b8063a457c2d714610a4e578063a8b9d24014610a6d578063a9059cbb14610a8c578063ad56c13c14610aab575f80fd5b806395d89b41116101aa5780639c1b8af51161017a5780639c1b8af5146109d15780639c3372ea146109e65780639c3b4fdc14610a055780639ec1037e14610a1a578063a0d82dc514610a39575f80fd5b806395d89b4114610960578063992c58e4146109745780639a7a23d6146109935780639abba4e6146109b2575f80fd5b8063868730c7116101f0578063868730c7146108dc578063871c128d146108fb5780638a8c523c1461091a5780638da5cb5b1461092e57806395451c291461094b575f80fd5b806375829def1461086a57806375f0a8741461088957806377a3b609146108a85780637fdde05c146108bd575f80fd5b80633f407b84116103225780635ebf4db9116102ac5780636d48467b1161027c5780636d48467b146107da578063700bb191146107f957806370a0823114610818578063715018a61461083757806372d8edf41461084b575f80fd5b80635ebf4db9146107695780635eee4bae1461078857806364b0f653146107a75780636843cd84146107bb575f80fd5b80634e71d92d116102f25780634e71d92d146106cb5780634fbee193146106df5780635124f874146107165780635a84c5eb1461072b5780635d098b381461074a575f80fd5b80633f407b841461065857806340ffdd801461066d57806349bd5a5e1461068c5780634ada218b146106ab575f80fd5b80631fa70531116103a35780632c1f5216116103735780632c1f5216146105cc57806330bb4cff146105eb578063313ce567146105ff5780633599bb171461061a5780633950935114610639575f80fd5b80631fa70531146105655780632307b4411461057a57806323b872dd1461059957806325cd3598146105b8575f80fd5b806308dfe8a5116103e957806308dfe8a5146104c5578063095ea7b3146104e45780631694505e1461051357806318160ddd146105325780631f53ac0214610546575f80fd5b806303fd2a45146104245780630445b6671461046057806305ca5f081461048357806306fdde03146104a4575f80fd5b3661042057005b5f80fd5b34801561042f575f80fd5b50600854610443906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561046b575f80fd5b5061047560115481565b604051908152602001610457565b34801561048e575f80fd5b506104a261049d366004613234565b610cc7565b005b3480156104af575f80fd5b506104b8610d95565b604051610457919061324b565b3480156104d0575f80fd5b506104a26104df3660046132b7565b610e25565b3480156104ef575f80fd5b506105036104fe3660046132ee565b610ead565b6040519015158152602001610457565b34801561051e575f80fd5b50600654610443906001600160a01b031681565b34801561053d575f80fd5b50600254610475565b348015610551575f80fd5b506104a2610560366004613318565b610ec3565b348015610570575f80fd5b50610475600a5481565b348015610585575f80fd5b506104a2610594366004613403565b610f59565b3480156105a4575f80fd5b506105036105b33660046134bf565b611122565b3480156105c3575f80fd5b50610443611189565b3480156105d7575f80fd5b50600d54610443906001600160a01b031681565b3480156105f6575f80fd5b506104756111f9565b34801561060a575f80fd5b5060405160128152602001610457565b348015610625575f80fd5b506104a26106343660046134fd565b611264565b348015610644575f80fd5b506105036106533660046132ee565b6112ec565b348015610663575f80fd5b5061047560095481565b348015610678575f80fd5b506104a26106873660046134fd565b611321565b348015610697575f80fd5b50600754610443906001600160a01b031681565b3480156106b6575f80fd5b5060085461050390600160a81b900460ff1681565b3480156106d6575f80fd5b506104a261137c565b3480156106ea575f80fd5b506105036106f9366004613318565b6001600160a01b03165f908152601a602052604090205460ff1690565b348015610721575f80fd5b5061047560155481565b348015610736575f80fd5b506104a2610745366004613234565b6113f0565b348015610755575f80fd5b506104a2610764366004613318565b61144b565b348015610774575f80fd5b506104a2610783366004613234565b6114da565b348015610793575f80fd5b506104a26107a2366004613234565b611535565b3480156107b2575f80fd5b50610475611577565b3480156107c6575f80fd5b506104756107d5366004613318565b6115be565b3480156107e5575f80fd5b506105036107f4366004613318565b61162b565b348015610804575f80fd5b506104a2610813366004613234565b611698565b348015610823575f80fd5b50610475610832366004613318565b611765565b348015610842575f80fd5b506104a261177f565b348015610856575f80fd5b506104a2610865366004613318565b6117f2565b348015610875575f80fd5b506104a2610884366004613318565b61184e565b348015610894575f80fd5b50600e54610443906001600160a01b031681565b3480156108b3575f80fd5b5061047560165481565b3480156108c8575f80fd5b506104a26108d73660046132b7565b6118fd565b3480156108e7575f80fd5b506104a26108f63660046134fd565b611951565b348015610906575f80fd5b506104a2610915366004613234565b611989565b348015610925575f80fd5b506104a2611a03565b348015610939575f80fd5b506005546001600160a01b0316610443565b348015610956575f80fd5b5061047560145481565b34801561096b575f80fd5b506104b8611a80565b34801561097f575f80fd5b506104a261098e366004613518565b611a8f565b34801561099e575f80fd5b506104a26109ad3660046132b7565b611be9565b3480156109bd575f80fd5b506104a26109cc366004613234565b611c21565b3480156109dc575f80fd5b5061047560195481565b3480156109f1575f80fd5b506104a2610a003660046134fd565b611cf6565b348015610a10575f80fd5b5061047560175481565b348015610a25575f80fd5b506104a2610a34366004613318565b611d52565b348015610a44575f80fd5b5061047560185481565b348015610a59575f80fd5b50610503610a683660046132ee565b611e0e565b348015610a78575f80fd5b50610475610a87366004613318565b611e5b565b348015610a97575f80fd5b50610503610aa63660046132ee565b611e8d565b348015610ab6575f80fd5b50610aca610ac5366004613318565b611e99565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610457565b348015610b0c575f80fd5b50600f54610443906001600160a01b031681565b348015610b2b575f80fd5b50610503610b3a366004613318565b601b6020525f908152604090205460ff1681565b348015610b59575f80fd5b50610503610b68366004613318565b611f26565b348015610b78575f80fd5b5061047560135481565b348015610b8d575f80fd5b50610475611f58565b348015610ba1575f80fd5b506104a2610bb0366004613318565b611f9f565b348015610bc0575f80fd5b50610475610bcf366004613557565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610c04575f80fd5b5061047560125481565b348015610c19575f80fd5b5061047561205d565b348015610c2d575f80fd5b506104756120a4565b348015610c41575f80fd5b50610aca610c50366004613234565b6120eb565b348015610c60575f80fd5b506104a2610c6f366004613318565b612128565b348015610c7f575f80fd5b506104a2610c8e3660046134fd565b612212565b348015610c9e575f80fd5b5061047560105481565b348015610cb3575f80fd5b506104a2610cc2366004613234565b61224a565b6005546001600160a01b03163314610cfa5760405162461bcd60e51b8152600401610cf190613583565b60405180910390fd5b610d0c81670de0b6b3a76400006135cc565b90505f610d26600954600a546122f290919063ffffffff16565b90505f610d4882610d42600a548661235790919063ffffffff16565b906123d5565b90505f610d6483610d426009548761235790919063ffffffff16565b9050610d6f84612416565b600a54610d7c9083612706565b600a55600954610d8c9082612706565b60095550505050565b606060038054610da4906135e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd0906135e3565b8015610e1b5780601f10610df257610100808354040283529160200191610e1b565b820191905f5260205f20905b815481529060010190602001808311610dfe57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610e4f5760405162461bcd60e51b8152600401610cf190613583565b6001600160a01b0382165f818152601a6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b5f610eb9338484612747565b5060015b92915050565b6005546001600160a01b03163314610eed5760405162461bcd60e51b8152600401610cf190613583565b6001600160a01b0381165f818152601a6020908152604091829020805460ff19166001179055600f80546001600160a01b0319168417905590519182527f1816467f4e41d8dd27500ca11dc471852ca93f9b624c4d8d4430b8c4fa6424fa91015b60405180910390a150565b6005546001600160a01b03163314610f835760405162461bcd60e51b8152600401610cf190613583565b8051825114610fd45760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610cf1565b60c8825111156110315760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401610cf1565b5f5b825181101561111d575f83828151811061104f5761104f61361b565b602002602001015190505f83838151811061106c5761106c61361b565b6020026020010151670de0b6b3a764000061108791906135cc565b905061109433838361286b565b600d546001600160a01b031663e30443bc836110af81611765565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b1580156110f2575f80fd5b505af1158015611104573d5f803e3d5ffd5b50505050505080806111159061362f565b915050611033565b505050565b5f61112e848484612971565b61117f843361117a85604051806060016040528060288152602001613893602891396001600160a01b038a165f9081526001602090815260408083203384529091529020549190612e9c565b612747565b5060019392505050565b600d54604080516304b9a6b360e31b815290515f926001600160a01b0316916325cd35989160048083019260209291908290030181865afa1580156111d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f49190613647565b905090565b600d54604080516342d359d760e11b815290515f926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611240573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f49190613662565b6005546001600160a01b0316331461128e5760405162461bcd60e51b8152600401610cf190613583565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b5f604051808303815f87803b1580156112d3575f80fd5b505af11580156112e5573d5f803e3d5ffd5b5050505050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610eb991859061117a90866122f2565b6005546001600160a01b0316331461134b5760405162461bcd60e51b8152600401610cf190613583565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd80906024016112bc565b600d5460405163bc4c4b3760e01b81523360048201525f60248201526001600160a01b039091169063bc4c4b37906044016020604051808303815f875af11580156113c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ed9190613679565b50565b6005546001600160a01b0316331461141a5760405162461bcd60e51b8152600401610cf190613583565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb906024016112bc565b6005546001600160a01b031633146114755760405162461bcd60e51b8152600401610cf190613583565b6001600160a01b0381165f818152601a6020908152604091829020805460ff19166001179055600e80546001600160a01b0319168417905590519182527faacebbe32c0dbd14817cfb53e3cc8be68c7e133928317145be50a0d86c2244339101610f4e565b6005546001600160a01b031633146115045760405162461bcd60e51b8152600401610cf190613583565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db9906024016112bc565b6005546001600160a01b0316331461155f5760405162461bcd60e51b8152600401610cf190613583565b61157181670de0b6b3a76400006135cc565b60125550565b600d54604080516304ddf6ef60e11b815290515f926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611240573d5f803e3d5ffd5b600d546040516370a0823160e01b81526001600160a01b0383811660048301525f9216906370a08231906024015b602060405180830381865afa158015611607573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebd9190613662565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301525f921690636d48467b906024015b602060405180830381865afa158015611674573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebd9190613679565b600d546040516001624d3b8760e01b03198152600481018390525f91829182916001600160a01b03169063ffb2c479906024016060604051808303815f875af11580156116e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170b9190613694565b604080518481526020810184905290810182905260608101889052929550909350915032905f907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b031633146117a95760405162461bcd60e51b8152600401610cf190613583565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461181c5760405162461bcd60e51b8152600401610cf190613583565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024016112bc565b6005546001600160a01b031633146118785760405162461bcd60e51b8152600401610cf190613583565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015f604051808303815f87803b1580156118bc575f80fd5b505af11580156118ce573d5f803e3d5ffd5b5050506001600160a01b0382165f908152601a60205260409020805460ff19166001179055506113ed81612128565b6005546001600160a01b031633146119275760405162461bcd60e51b8152600401610cf190613583565b6001600160a01b03919091165f908152601c60205260409020805460ff1916911515919091179055565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d639906044016112bc565b6005546001600160a01b031633146119b35760405162461bcd60e51b8152600401610cf190613583565b62030d4081101580156119c95750620f42408111155b6119d1575f80fd5b60195460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db7905f90a3601955565b6005546001600160a01b03163314611a2d5760405162461bcd60e51b8152600401610cf190613583565b600854600160a81b900460ff1615611a43575f80fd5b6008805460ff60a81b1916600160a81b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c7905f90a1565b606060048054610da4906135e3565b6005546001600160a01b03163314611ab95760405162461bcd60e51b8152600401610cf190613583565b601586905560168490556014859055601383905560178290556018819055611aeb81611ae585886122f2565b906122f2565b600b55601754601554601654611b069291611ae591906122f2565b600c55600b546101f410801590611b2157506101f4600c5411155b611b7d5760405162461bcd60e51b815260206004820152602760248201527f746f74616c20666565732063616e6e6f74206578636565642038252073656c6c604482015266206f722062757960c81b6064820152608401610cf1565b601454601354601554601654601754601854604080519687526020870195909552938501929092526060840152608083015260a08201527ffb0d6f48717e74b9ad8ae84d152197402ac50bd6431ea28437926861021948ff9060c00160405180910390a1505050505050565b6005546001600160a01b03163314611c135760405162461bcd60e51b8152600401610cf190613583565b611c1d8282612ed4565b5050565b6005546001600160a01b03163314611c4b5760405162461bcd60e51b8152600401610cf190613583565b5f81118015611c5d5750622dc6c18111155b611cde5760405162461bcd60e51b815260206004820152604660248201527f53776170207468726573686f6c64206d7573742062652067726561746572207460448201527f68616e203020616e64206c657373207468616e203325206f6620746f74616c20606482015265737570706c7960d01b608482015260a401610cf1565b611cf081670de0b6b3a76400006135cc565b60115550565b6005546001600160a01b03163314611d205760405162461bcd60e51b8152600401610cf190613583565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea906024016112bc565b6005546001600160a01b03163314611d7c5760405162461bcd60e51b8152600401610cf190613583565b600d54604051630928847160e01b81526001600160a01b038381166004830152909116906309288471906024015f604051808303815f87803b158015611dc0575f80fd5b505af1158015611dd2573d5f803e3d5ffd5b5050600d546040516338c110ef60e21b81526001600160a01b0385811660048301525f6024830152909116925063e30443bc91506044016112bc565b5f610eb9338461117a856040518060600160405280602581526020016138bb60259139335f9081526001602090815260408083206001600160a01b038d1684529091529020549190612e9c565b600d546040516302a2e74960e61b81526001600160a01b0383811660048301525f92169063a8b9d240906024016115ec565b5f610eb9338484612971565b600d5460405163fbcbc0f160e01b81526001600160a01b0383811660048301525f92839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015611eee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1291906136bf565b949c939b5091995097509550909350915050565b600d5460405163ba079d4960e01b81526001600160a01b0383811660048301525f92169063ba079d4990602401611659565b600d546040805163bdd4f29f60e01b815290515f926001600160a01b03169163bdd4f29f9160048083019260209291908290030181865afa158015611240573d5f803e3d5ffd5b6005546001600160a01b03163314611fc95760405162461bcd60e51b8152600401610cf190613583565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed3906024015f604051808303815f87803b15801561200d575f80fd5b505af115801561201f573d5f803e3d5ffd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050610f4e565b600d546040805163039e107b60e61b815290515f926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611240573d5f803e3d5ffd5b600d546040805163e7cb7f8760e01b815290515f926001600160a01b03169163e7cb7f879160048083019260209291908290030181865afa158015611240573d5f803e3d5ffd5b600d54604051635183d6fd60e01b8152600481018390525f91829182918291829182916001600160a01b0390911690635183d6fd90602401611ed3565b6005546001600160a01b031633146121525760405162461bcd60e51b8152600401610cf190613583565b6001600160a01b0381166121b75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cf1565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a04906044016112bc565b6005546001600160a01b031633146122745760405162461bcd60e51b8152600401610cf190613583565b61c3508110156122da5760405162461bcd60e51b815260206004820152602b60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c65737360448201526a207468616e20302e30352560a81b6064820152608401610cf1565b6122ec81670de0b6b3a76400006135cc565b60105550565b5f806122fe838561370e565b9050838110156123505760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610cf1565b9392505050565b5f825f0361236657505f610ebd565b5f61237183856135cc565b90508261237e8583613721565b146123505760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610cf1565b5f61235083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f96565b805f036124205750565b61242981612fc2565b5f612441600954600a546122f290919063ffffffff16565b601654909150600190819081905f9081908190156124a15761249e60175460155460165461246f919061370e565b612479919061370e565b610d426016546124988b610d42600a544761235790919063ffffffff16565b90612357565b91505b601354156124eb576124e86018546014546013546124bf919061370e565b6124c9919061370e565b610d426013546124988b610d426009544761235790919063ffffffff16565b90505b6124f582826122f2565b9250821561255257600d546040516001600160a01b039091169084905f81818185875af1925050503d805f8114612547576040519150601f19603f3d011682016040523d82523d5f602084013e61254c565b606091505b50909650505b5f61256a6017546015546122f290919063ffffffff16565b601854601454612579916122f2565b612583919061370e565b90505f81156125995761259647836123d5565b90505b5f816125b26014546015546122f290919063ffffffff16565b6125bc91906135cc565b90505f826125d76018546017546122f290919063ffffffff16565b6125e191906135cc565b9050811561263e57600e546040516001600160a01b039091169083905f81818185875af1925050503d805f8114612633576040519150601f19603f3d011682016040523d82523d5f602084013e612638565b606091505b50909950505b801561269957600f546040516001600160a01b039091169082905f81818185875af1925050503d805f811461268e576040519150601f19603f3d011682016040523d82523d5f602084013e612693565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd0876126c5838561370e565b8c80156126cf57508b5b80156126d857508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b5f61235083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e9c565b6001600160a01b0383166127a95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cf1565b6001600160a01b03821661280a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cf1565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166128915760405162461bcd60e51b8152600401610cf190613740565b6001600160a01b0382166128b75760405162461bcd60e51b8152600401610cf190613785565b6128f38160405180606001604052806026815260200161386d602691396001600160a01b0386165f908152602081905260409020549190612e9c565b6001600160a01b038085165f90815260208190526040808220939093559084168152205461292190826122f2565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161285e565b6001600160a01b0383166129975760405162461bcd60e51b8152600401610cf190613740565b6001600160a01b0382166129bd5760405162461bcd60e51b8152600401610cf190613785565b6001600160a01b0383165f908152601c60205260408120548190819060ff16612a3957600854600160a81b900460ff16612a395760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610cf1565b835f03612a5357612a4b86865f61286b565b505050505050565b6008546001600160a01b0390811690861603612a7357612a4b868561312c565b600854600160a01b900460ff16158015612aa557506001600160a01b0386165f908152601a602052604090205460ff16155b8015612ac957506001600160a01b0385165f908152601a602052604090205460ff16155b15612d9f576001600160a01b038086165f908152601b602052604080822054928916825290205460ff918216911680158015612b03575081155b15612c0757612b1388888861286b565b600d546001600160a01b031663e30443bc89612b2e81611765565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612b71575f80fd5b505af1158015612b83573d5f803e3d5ffd5b5050600d546001600160a01b0316915063e30443bc905088612ba481611765565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612be7575f80fd5b505af1158015612bf9573d5f803e3d5ffd5b505050505050505050505050565b8115612c2157601354945060145493506018549250612cac565b8015612cac576016549450601554935060175492505f612c4088611765565b601054909150612c50888361370e565b1115612caa5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610cf1565b505b5f612cc1612cba858761370e565b87906122f2565b90505f612ccd30611765565b60125490915081108015908190612cfc57506001600160a01b038b165f908152601b602052604090205460ff16155b15612d42576008805460ff60a01b1916600160a01b1790555f612d1e30611765565b9050612d2981612416565b506001600a8190556009556008805460ff60a01b191690555b5f612d53612710610d428c87612357565b9050612d5f8a82612706565b99508515612d7c57600954612d7490826122f2565b600955612d8d565b600a54612d8990826122f2565b600a555b612d988c308361286b565b5050505050505b612daa86868661286b565b600d546001600160a01b031663e30443bc87612dc581611765565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612e08575f80fd5b505af1158015612e1a573d5f803e3d5ffd5b5050600d546001600160a01b0316915063e30443bc905086612e3b81611765565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612e7e575f80fd5b505af1158015612e90573d5f803e3d5ffd5b50505050505050505050565b5f8184841115612ebf5760405162461bcd60e51b8152600401610cf1919061324b565b505f612ecb84866137c8565b95945050505050565b6001600160a01b0382165f908152601b60205260409020805460ff19168215801591909117909155612f5b57600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015f604051808303815f87803b158015612f44575f80fd5b505af1158015612f56573d5f803e3d5ffd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b5f8183612fb65760405162461bcd60e51b8152600401610cf1919061324b565b505f612ecb8486613721565b5f6011548211612fd25781612fd6565b6011545b6040805160028082526060820183529293505f92909160208301908036833701905050905030815f8151811061300e5761300e61361b565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613065573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130899190613647565b8160018151811061309c5761309c61361b565b6001600160a01b0392831660209182029290920101526006546130c29130911684612747565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906130fa9085905f908690309042906004016137db565b5f604051808303815f87803b158015613111575f80fd5b505af1158015613123573d5f803e3d5ffd5b50505050505050565b6001600160a01b03821661318c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610cf1565b6131c88160405180606001604052806022815260200161384b602291396001600160a01b0385165f908152602081905260409020549190612e9c565b6001600160a01b0383165f908152602081905260409020556002546131ed9082612706565b6002556040518181525f906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b5f60208284031215613244575f80fd5b5035919050565b5f6020808352835180828501525f5b818110156132765785810183015185820160400152820161325a565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146113ed575f80fd5b80151581146113ed575f80fd5b5f80604083850312156132c8575f80fd5b82356132d381613296565b915060208301356132e3816132aa565b809150509250929050565b5f80604083850312156132ff575f80fd5b823561330a81613296565b946020939093013593505050565b5f60208284031215613328575f80fd5b813561235081613296565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561337057613370613333565b604052919050565b5f67ffffffffffffffff82111561339157613391613333565b5060051b60200190565b5f82601f8301126133aa575f80fd5b813560206133bf6133ba83613378565b613347565b82815260059290921b840181019181810190868411156133dd575f80fd5b8286015b848110156133f857803583529183019183016133e1565b509695505050505050565b5f8060408385031215613414575f80fd5b823567ffffffffffffffff8082111561342b575f80fd5b818501915085601f83011261343e575f80fd5b8135602061344e6133ba83613378565b82815260059290921b8401810191818101908984111561346c575f80fd5b948201945b8386101561349357853561348481613296565b82529482019490820190613471565b965050860135925050808211156134a8575f80fd5b506134b58582860161339b565b9150509250929050565b5f805f606084860312156134d1575f80fd5b83356134dc81613296565b925060208401356134ec81613296565b929592945050506040919091013590565b5f6020828403121561350d575f80fd5b8135612350816132aa565b5f805f805f8060c0878903121561352d575f80fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b5f8060408385031215613568575f80fd5b823561357381613296565b915060208301356132e381613296565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610ebd57610ebd6135b8565b600181811c908216806135f757607f821691505b60208210810361361557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60018201613640576136406135b8565b5060010190565b5f60208284031215613657575f80fd5b815161235081613296565b5f60208284031215613672575f80fd5b5051919050565b5f60208284031215613689575f80fd5b8151612350816132aa565b5f805f606084860312156136a6575f80fd5b8351925060208401519150604084015190509250925092565b5f805f805f8060c087890312156136d4575f80fd5b86516136df81613296565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b80820180821115610ebd57610ebd6135b8565b5f8261373b57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610ebd57610ebd6135b8565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156138295784516001600160a01b031683529383019391830191600101613804565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e608907cd1163410bcf4c91977786d6fa7efc0e88e61e308114b309643cf449b64736f6c6343000814003360806040526012805460ff60b01b191690553480156200001d575f80fd5b5060405162002f5c38038062002f5c833981016040819052620000409162000238565b81818181600362000052838262000369565b50600462000061828262000369565b50505050505f620000776200015e60201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250905f907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506013620000d2838262000369565b506014620000e1828262000369565b505060128054601680546001600160a01b03199081166001600160a01b03988916179091556a295be96e6406697200000060185568056bc75e2d631000006019556015805490911695871695909517909455600160a01b929094166001600160a81b0319909316929092171760ff60a81b19169091555062000431565b3390565b6001600160a01b038116811462000177575f80fd5b50565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126200019e575f80fd5b81516001600160401b0380821115620001bb57620001bb6200017a565b604051601f8301601f19908116603f01168101908282118183101715620001e657620001e66200017a565b8160405283815260209250868385880101111562000202575f80fd5b5f91505b8382101562000225578582018301518183018401529082019062000206565b5f93810190920192909252949350505050565b5f805f805f60a086880312156200024d575f80fd5b85516200025a8162000162565b60208701519095506200026d8162000162565b6040870151909450620002808162000162565b60608701519093506001600160401b03808211156200029d575f80fd5b620002ab89838a016200018e565b93506080880151915080821115620002c1575f80fd5b50620002d0888289016200018e565b9150509295509295909350565b600181811c90821680620002f257607f821691505b6020821081036200031157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111562000364575f81815260208120601f850160051c810160208610156200033f5750805b601f850160051c820191505b8181101562000360578281556001016200034b565b5050505b505050565b81516001600160401b038111156200038557620003856200017a565b6200039d81620003968454620002dd565b8462000317565b602080601f831160018114620003d3575f8415620003bb5750858301515b5f19600386901b1c1916600185901b17855562000360565b5f85815260208120601f198616915b828110156200040357888601518255948401946001909101908401620003e2565b50858210156200042157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b612b1d806200043f5f395ff3fe60806040526004361061032a575f3560e01c8063715018a6116101a3578063a9059cbb116100f2578063dd62ed3e11610092578063e7cb7f871161006d578063e7cb7f87146109ca578063f2fde38b146109de578063fbcbc0f1146109fd578063ffb2c47914610a1c575f80fd5b8063dd62ed3e14610953578063e30443bc14610997578063e7841ec0146109b6575f80fd5b8063ba079d49116100cd578063ba079d49146108e2578063bc4c4b3714610901578063bdd4f29f14610920578063d8032ed314610934575f80fd5b8063a9059cbb14610870578063aafd847a1461088f578063b22f8a04146108c3575f80fd5b806394807f251161015d5780639eec101e116101385780639eec101e146107f2578063a423406914610812578063a457c2d714610832578063a8b9d24014610851575f80fd5b806394807f25146107a057806395d89b41146107bf5780639c3372ea146107d3575f80fd5b8063715018a6146106fd57806374c13fda1461071157806385a6b3ae146107305780638bc1d639146107455780638da5cb5b1461076457806391b89fba14610781575f80fd5b8063313ce567116102795780635183d6fd116102195780636a474002116101f45780636a474002146106685780636b69163b1461067c5780636d48467b146106aa57806370a08231146106c9575f80fd5b80635183d6fd146105d45780635a84c5eb1461062a5780635ebf4db914610649575f80fd5b80633950935111610254578063395093511461054857806340ffdd801461056757806341808904146105865780634e7b827f146105a6575f80fd5b8063313ce567146104ef57806331e79db01461050a5780633599bb1714610529575f80fd5b806318160ddd116102e457806323b872dd116102bf57806323b872dd1461047f57806325cd35981461049e57806327ce0147146104bb5780633009a609146104da575f80fd5b806318160ddd146104125780631d4ff89a14610426578063226cfa3d14610454575f80fd5b806303c833021461033d57806306fdde0314610345578063092884711461036f578063095ea7b31461038e57806309bbedde146103bd5780631694505e146103db575f80fd5b3661033957610337610a56565b005b5f80fd5b610337610a56565b348015610350575f80fd5b50610359610ae7565b60405161036691906126c4565b60405180910390f35b34801561037a575f80fd5b50610337610389366004612726565b610b77565b348015610399575f80fd5b506103ad6103a8366004612741565b610bca565b6040519015158152602001610366565b3480156103c8575f80fd5b50600a545b604051908152602001610366565b3480156103e6575f80fd5b506015546103fa906001600160a01b031681565b6040516001600160a01b039091168152602001610366565b34801561041d575f80fd5b506002546103cd565b348015610431575f80fd5b506103ad610440366004612726565b60116020525f908152604090205460ff1681565b34801561045f575f80fd5b506103cd61046e366004612726565b60176020525f908152604090205481565b34801561048a575f80fd5b506103ad61049936600461276b565b610be0565b3480156104a9575f80fd5b506012546001600160a01b03166103fa565b3480156104c6575f80fd5b506103cd6104d5366004612726565b610c47565b3480156104e5575f80fd5b506103cd600e5481565b3480156104fa575f80fd5b5060405160128152602001610366565b348015610515575f80fd5b50610337610524366004612726565b610ca2565b348015610534575f80fd5b506103376105433660046127b6565b610d3a565b348015610553575f80fd5b506103ad610562366004612741565b610dda565b348015610572575f80fd5b506103376105813660046127b6565b610e0f565b348015610591575f80fd5b506012546103ad90600160a81b900460ff1681565b3480156105b1575f80fd5b506103ad6105c0366004612726565b600f6020525f908152604090205460ff1681565b3480156105df575f80fd5b506105f36105ee3660046127d1565b610ea4565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610366565b348015610635575f80fd5b506103376106443660046127d1565b610efe565b348015610654575f80fd5b506103376106633660046127d1565b610f40565b348015610673575f80fd5b50610337610f82565b348015610687575f80fd5b506103ad610696366004612726565b60106020525f908152604090205460ff1681565b3480156106b5575f80fd5b506103ad6106c4366004612726565b61102c565b3480156106d4575f80fd5b506103cd6106e3366004612726565b6001600160a01b03165f9081526020819052604090205490565b348015610708575f80fd5b50610337611076565b34801561071c575f80fd5b506012546103fa906001600160a01b031681565b34801561073b575f80fd5b506103cd60085481565b348015610750575f80fd5b5061033761075f3660046127e8565b6110e9565b34801561076f575f80fd5b506009546001600160a01b03166103fa565b34801561078c575f80fd5b506103cd61079b366004612726565b61113d565b3480156107ab575f80fd5b506016546103fa906001600160a01b031681565b3480156107ca575f80fd5b50610359611147565b3480156107de575f80fd5b506103376107ed3660046127b6565b611156565b3480156107fd575f80fd5b506012546103ad90600160a01b900460ff1681565b34801561081d575f80fd5b506012546103ad90600160b01b900460ff1681565b34801561083d575f80fd5b506103ad61084c366004612741565b6111eb565b34801561085c575f80fd5b506103cd61086b366004612726565b611238565b34801561087b575f80fd5b506103ad61088a366004612741565b611263565b34801561089a575f80fd5b506103cd6108a9366004612726565b6001600160a01b03165f9081526007602052604090205490565b3480156108ce575f80fd5b506103376108dd3660046127e8565b61126f565b3480156108ed575f80fd5b506103ad6108fc366004612726565b6112c3565b34801561090c575f80fd5b506103ad61091b3660046127e8565b61130d565b34801561092b575f80fd5b506019546103cd565b34801561093f575f80fd5b5061033761094e366004612726565b611487565b34801561095e575f80fd5b506103cd61096d36600461281f565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b3480156109a2575f80fd5b506103376109b1366004612741565b6114d3565b3480156109c1575f80fd5b50600e546103cd565b3480156109d5575f80fd5b506018546103cd565b3480156109e9575f80fd5b506103376109f8366004612726565b611569565b348015610a08575f80fd5b506105f3610a17366004612726565b611653565b348015610a27575f80fd5b50610a3b610a363660046127d1565b6116fc565b60408051938452602084019290925290820152606001610366565b5f610a6060025490565b11610a69575f80fd5b3415610ae557610a9c610a7b60025490565b610a8934600160801b611819565b610a93919061285f565b6005549061189e565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610ae1903461189e565b6008555b565b606060138054610af69061287e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b229061287e565b8015610b6d5780601f10610b4457610100808354040283529160200191610b6d565b820191905f5260205f20905b815481529060010190602001808311610b5057829003601f168201915b5050505050905090565b6009546001600160a01b03163314610baa5760405162461bcd60e51b8152600401610ba1906128b6565b60405180910390fd5b6001600160a01b03165f908152600f60205260409020805460ff19169055565b5f610bd63384846118fc565b5060015b92915050565b5f610bec848484611a1f565b610c3d8433610c3885604051806060016040528060288152602001612a9b602891396001600160a01b038a165f9081526001602090815260408083203384529091529020549190611a84565b6118fc565b5060019392505050565b6001600160a01b0381165f9081526006602090815260408083205491839052822054600554600160801b92610c9892610c9392610c8d91610c889190611819565b611abc565b90611aca565b611b04565b610bda919061285f565b6009546001600160a01b03163314610ccc5760405162461bcd60e51b8152600401610ba1906128b6565b6001600160a01b0381165f908152600f60205260408120805460ff19166001179055610cf9908290611b15565b610d04600a82611b71565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b25905f90a250565b6009546001600160a01b03163314610d645760405162461bcd60e51b8152600401610ba1906128b6565b801515601260169054906101000a900460ff16151503610d82575f80fd5b60128054821515600160b01b0260ff60b01b199091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610dcf90831515815260200190565b60405180910390a150565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610bd6918590610c38908661189e565b6009546001600160a01b03163314610e395760405162461bcd60e51b8152600401610ba1906128b6565b801515601260159054906101000a900460ff16151503610e57575f80fd5b60128054821515600160a81b0260ff60a81b199091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610dcf90831515815260200190565b5f805f805f80610eb3600a5490565b8710610ed057505f94505f19935083925084915081905080610ef5565b5f610edc600a89611ca4565b9050610ee781611653565b965096509650965096509650505b91939550919395565b6009546001600160a01b03163314610f285760405162461bcd60e51b8152600401610ba1906128b6565b610f3a81670de0b6b3a76400006128eb565b60185550565b6009546001600160a01b03163314610f6a5760405162461bcd60e51b8152600401610ba1906128b6565b610f7c81670de0b6b3a76400006128eb565b60195550565b60405162461bcd60e51b815260206004820152606d60248201527f42555454484f4c455f4469766964656e645f547261636b65723a20776974686460448201527f7261774469766964656e642064697361626c65642e205573652074686520276360648201527f6c61696d272066756e6374696f6e206f6e20746865206d61696e20425554544860848201526c27a6229031b7b73a3930b1ba1760991b60a482015260c401610ba1565b6009545f906001600160a01b031633146110585760405162461bcd60e51b8152600401610ba1906128b6565b506001600160a01b03165f9081526010602052604090205460ff1690565b6009546001600160a01b031633146110a05760405162461bcd60e51b8152600401610ba1906128b6565b6009546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6009546001600160a01b031633146111135760405162461bcd60e51b8152600401610ba1906128b6565b6001600160a01b03919091165f908152601060205260409020805460ff1916911515919091179055565b5f610bda82611238565b606060148054610af69061287e565b6009546001600160a01b031633146111805760405162461bcd60e51b8152600401610ba1906128b6565b801515601260149054906101000a900460ff1615150361119e575f80fd5b60128054821515600160a01b0260ff60a01b199091161790556040517f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890610dcf90831515815260200190565b5f610bd63384610c3885604051806060016040528060258152602001612ac360259139335f9081526001602090815260408083206001600160a01b038d1684529091529020549190611a84565b6001600160a01b0381165f90815260076020526040812054610bda9061125d84610c47565b90611cd4565b5f610bd6338484611a1f565b6009546001600160a01b031633146112995760405162461bcd60e51b8152600401610ba1906128b6565b6001600160a01b03919091165f908152601160205260409020805460ff1916911515919091179055565b6009545f906001600160a01b031633146112ef5760405162461bcd60e51b8152600401610ba1906128b6565b506001600160a01b03165f9081526011602052604090205460ff1690565b6009545f906001600160a01b031633146113395760405162461bcd60e51b8152600401610ba1906128b6565b601254600160b01b900460ff161561135257505f610bda565b6001600160a01b0383165f9081526011602052604090205460ff168280156113775750805b801561138d5750601254600160a81b900460ff16155b1561139b575f915050610bda565b5f816113af576113aa85611d15565b6113b8565b6113b885611fbd565b9050801561147d576001600160a01b0385165f908152601760205260409020429055811561142b57831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c8360405161141e91815260200190565b60405180910390a3611472565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0928360405161146991815260200190565b60405180910390a35b600192505050610bda565b505f949350505050565b6009546001600160a01b031633146114b15760405162461bcd60e51b8152600401610ba1906128b6565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031633146114fd5760405162461bcd60e51b8152600401610ba1906128b6565b6001600160a01b0382165f908152600f602052604090205460ff1661153b5760195481101561153f57611531600a83611b71565b61153b825f611b15565b5050565b6115498282611b15565b601854811061155e5761153b600a838361231a565b61153b600a83611b71565b6009546001600160a01b031633146115935760405162461bcd60e51b8152600401610ba1906128b6565b6001600160a01b0381166115f85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ba1565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b805f80808080611664600a876123c0565b94505f1993505f85126116c257600e5485111561169057600e54611689908690612408565b93506116c2565b600e54600a545f91106116a3575f6116b2565b600e54600a546116b291611cd4565b90506116be8682611aca565b9450505b6116cb86611238565b92506116d686610c47565b6001600160a01b0387165f90815260176020526040902054969895975093959294915050565b600a545f908190819080158061171b5750601254600160b01b900460ff165b15611730575050600e545f9250829150611812565b600e545f805a90505f805b898410801561174957508582105b15611801578461175881612902565b955050858510611766575f94505b5f600a5f01868154811061177c5761177c61291a565b5f9182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff166117c8576117b581600161130d565b156117c857816117c481612902565b9250505b826117d281612902565b9350505f5a9050808511156117f8576117f56117ee8683611cd4565b879061189e565b95505b935061173b9050565b600e85905590975095509193505050505b9193909250565b5f825f0361182857505f610bda565b5f61183383856128eb565b905082611840858361285f565b146118975760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610ba1565b9392505050565b5f806118aa838561292e565b9050838110156118975760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610ba1565b6001600160a01b03831661195e5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ba1565b6001600160a01b0382166119bf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ba1565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602f60248201527f42555454484f4c455f4469766964656e645f547261636b65723a204e6f20747260448201526e185b9cd9995c9cc8185b1b1bddd959608a1b6064820152608401610ba1565b505050565b5f8184841115611aa75760405162461bcd60e51b8152600401610ba191906126c4565b505f611ab38486612941565b95945050505050565b5f8181811215610bda575f80fd5b5f80611ad68385612954565b90505f8312158015611ae85750838112155b80611afc57505f83128015611afc57508381125b611897575f80fd5b5f80821215611b11575f80fd5b5090565b6001600160a01b0382165f9081526020819052604090205480821115611b52575f611b408383611cd4565b9050611b4c8482612441565b50505050565b80821015611a7f575f611b658284611cd4565b9050611b4c84826124a3565b6001600160a01b0381165f90815260038301602052604090205460ff16611b96575050565b6001600160a01b0381165f9081526003830160209081526040808320805460ff1916905560018086018352818420849055600286019092528220548454909291611bdf91612941565b90505f845f018281548110611bf657611bf661291a565b5f9182526020808320909101546001600160a01b03908116808452600289019092526040808420879055908716835282209190915585549091508190869085908110611c4457611c4461291a565b5f91825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558454859080611c7d57611c7d61297b565b5f8281526020902081015f1990810180546001600160a01b03191690550190555050505050565b5f825f018281548110611cb957611cb961291a565b5f918252602090912001546001600160a01b03169392505050565b5f61189783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611a84565b5f80611d2083611238565b90508015611fb5576001600160a01b0383165f90815260076020526040902054611d4a908261189e565b6001600160a01b038085165f90815260076020526040812092909255601254169081611dcb576040516001600160a01b03861690610bb89085905f818181858888f193505050503d805f8114611dbb576040519150601f19603f3d011682016040523d82523d5f602084013e611dc0565b606091505b505080915050611f1d565b6040805160028082526060820183525f926020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611e32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e56919061298f565b815f81518110611e6857611e6861291a565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611e9c57611e9c61291a565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de95908690611ee1905f9086908c9042906004016129ec565b5f604051808303818588803b158015611ef8575f80fd5b505af193505050508015611f0a575060015b611f16575f9150611f1b565b600191505b505b80611f69576001600160a01b0385165f90815260076020526040902054611f449084611cd4565b6001600160a01b039095165f9081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d84604051611fa491815260200190565b60405180910390a250909392505050565b505f92915050565b5f80611fc883611238565b90508015611fb5576001600160a01b0383165f90815260076020526040812054611ff2908361189e565b6001600160a01b0385165f9081526007602052604080822092909255815160028082526060820190935290918160200160208202803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015612077573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061209b919061298f565b815f815181106120ad576120ad61291a565b6001600160a01b0392831660209182029290920101526016548251911690829060019081106120de576120de61291a565b6001600160a01b0392831660209182029290920101526016546040516370a0823160e01b81523060048201525f9291909116906370a0823190602401602060405180830381865afa158015612135573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121599190612a20565b60155460405163b6f9de9560e01b81529192506001600160a01b03169063b6f9de95908690612192905f908790309042906004016129ec565b5f604051808303818588803b1580156121a9575f80fd5b505af1935050505080156121bb575060015b6121c7575f92506122c3565b6016546040516370a0823160e01b81523060048201525f916122379184916001600160a01b0316906370a0823190602401602060405180830381865afa158015612213573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061125d9190612a20565b905080156122bd5760165460405163a9059cbb60e01b81526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb906044016020604051808303815f875af1158015612293573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122b79190612a37565b506122c1565b5f93505b505b82612310576001600160a01b0386165f908152600760205260409020546122ea9085611cd4565b6001600160a01b039096165f908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b0382165f90815260038401602052604090205460ff161561235d576001600160a01b0382165f9081526001840160205260409020819055505050565b6001600160a01b0382165f8181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b0381165f90815260038301602052604081205460ff166123e957505f19610bda565b506001600160a01b03165f908152600291909101602052604090205490565b5f806124148385612a52565b90505f83121580156124265750838113155b80611afc57505f83128015611afc5750838113611897575f80fd5b61244b82826124e6565b612484612466610c888360055461181990919063ffffffff16565b6001600160a01b0384165f9081526006602052604090205490612408565b6001600160a01b039092165f9081526006602052604090209190915550565b6124ad82826125c3565b6124846124c8610c888360055461181990919063ffffffff16565b6001600160a01b0384165f9081526006602052604090205490611aca565b6001600160a01b03821661253c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610ba1565b600254612549908261189e565b6002556001600160a01b0382165f9081526020819052604090205461256e908261189e565b6001600160a01b0383165f81815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b0382166126235760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610ba1565b61265f81604051806060016040528060228152602001612a79602291396001600160a01b0385165f908152602081905260409020549190611a84565b6001600160a01b0383165f908152602081905260409020556002546126849082611cd4565b6002556040518181525f906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016125b7565b5f6020808352835180828501525f5b818110156126ef578581018301518582016040015282016126d3565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114612723575f80fd5b50565b5f60208284031215612736575f80fd5b81356118978161270f565b5f8060408385031215612752575f80fd5b823561275d8161270f565b946020939093013593505050565b5f805f6060848603121561277d575f80fd5b83356127888161270f565b925060208401356127988161270f565b929592945050506040919091013590565b8015158114612723575f80fd5b5f602082840312156127c6575f80fd5b8135611897816127a9565b5f602082840312156127e1575f80fd5b5035919050565b5f80604083850312156127f9575f80fd5b82356128048161270f565b91506020830135612814816127a9565b809150509250929050565b5f8060408385031215612830575f80fd5b823561283b8161270f565b915060208301356128148161270f565b634e487b7160e01b5f52601160045260245ffd5b5f8261287957634e487b7160e01b5f52601260045260245ffd5b500490565b600181811c9082168061289257607f821691505b6020821081036128b057634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8082028115828204841417610bda57610bda61284b565b5f600182016129135761291361284b565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610bda57610bda61284b565b81810381811115610bda57610bda61284b565b8082018281125f8312801582168215821617156129735761297361284b565b505092915050565b634e487b7160e01b5f52603160045260245ffd5b5f6020828403121561299f575f80fd5b81516118978161270f565b5f8151808452602080850194508084015f5b838110156129e15781516001600160a01b0316875295820195908201906001016129bc565b509495945050505050565b848152608060208201525f612a0460808301866129aa565b6001600160a01b03949094166040830152506060015292915050565b5f60208284031215612a30575f80fd5b5051919050565b5f60208284031215612a47575f80fd5b8151611897816127a9565b8181035f831280158383131683831282161715612a7157612a7161284b565b509291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207baa357f8585242405d15dbbefcf52dda31ac82a45ba2fc3641bcda8a0dd2a3264736f6c63430008140033

Deployed Bytecode

0x608060405260043610610419575f3560e01c806375829def11610220578063a457c2d711610129578063d8032ed3116100b3578063f27fd25411610078578063f27fd25414610c36578063f2fde38b14610c55578063f5d3c79a14610c74578063f8b45b0514610c93578063fc6b151c14610ca8575f80fd5b8063d8032ed314610b96578063dd62ed3e14610bb5578063e2f4560514610bf9578063e7841ec014610c0e578063e7cb7f8714610c22575f80fd5b8063b115e4df116100f9578063b115e4df14610b01578063b62496f514610b20578063ba079d4914610b4e578063bb8d513114610b6d578063bdd4f29f14610b82575f80fd5b8063a457c2d714610a4e578063a8b9d24014610a6d578063a9059cbb14610a8c578063ad56c13c14610aab575f80fd5b806395d89b41116101aa5780639c1b8af51161017a5780639c1b8af5146109d15780639c3372ea146109e65780639c3b4fdc14610a055780639ec1037e14610a1a578063a0d82dc514610a39575f80fd5b806395d89b4114610960578063992c58e4146109745780639a7a23d6146109935780639abba4e6146109b2575f80fd5b8063868730c7116101f0578063868730c7146108dc578063871c128d146108fb5780638a8c523c1461091a5780638da5cb5b1461092e57806395451c291461094b575f80fd5b806375829def1461086a57806375f0a8741461088957806377a3b609146108a85780637fdde05c146108bd575f80fd5b80633f407b84116103225780635ebf4db9116102ac5780636d48467b1161027c5780636d48467b146107da578063700bb191146107f957806370a0823114610818578063715018a61461083757806372d8edf41461084b575f80fd5b80635ebf4db9146107695780635eee4bae1461078857806364b0f653146107a75780636843cd84146107bb575f80fd5b80634e71d92d116102f25780634e71d92d146106cb5780634fbee193146106df5780635124f874146107165780635a84c5eb1461072b5780635d098b381461074a575f80fd5b80633f407b841461065857806340ffdd801461066d57806349bd5a5e1461068c5780634ada218b146106ab575f80fd5b80631fa70531116103a35780632c1f5216116103735780632c1f5216146105cc57806330bb4cff146105eb578063313ce567146105ff5780633599bb171461061a5780633950935114610639575f80fd5b80631fa70531146105655780632307b4411461057a57806323b872dd1461059957806325cd3598146105b8575f80fd5b806308dfe8a5116103e957806308dfe8a5146104c5578063095ea7b3146104e45780631694505e1461051357806318160ddd146105325780631f53ac0214610546575f80fd5b806303fd2a45146104245780630445b6671461046057806305ca5f081461048357806306fdde03146104a4575f80fd5b3661042057005b5f80fd5b34801561042f575f80fd5b50600854610443906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561046b575f80fd5b5061047560115481565b604051908152602001610457565b34801561048e575f80fd5b506104a261049d366004613234565b610cc7565b005b3480156104af575f80fd5b506104b8610d95565b604051610457919061324b565b3480156104d0575f80fd5b506104a26104df3660046132b7565b610e25565b3480156104ef575f80fd5b506105036104fe3660046132ee565b610ead565b6040519015158152602001610457565b34801561051e575f80fd5b50600654610443906001600160a01b031681565b34801561053d575f80fd5b50600254610475565b348015610551575f80fd5b506104a2610560366004613318565b610ec3565b348015610570575f80fd5b50610475600a5481565b348015610585575f80fd5b506104a2610594366004613403565b610f59565b3480156105a4575f80fd5b506105036105b33660046134bf565b611122565b3480156105c3575f80fd5b50610443611189565b3480156105d7575f80fd5b50600d54610443906001600160a01b031681565b3480156105f6575f80fd5b506104756111f9565b34801561060a575f80fd5b5060405160128152602001610457565b348015610625575f80fd5b506104a26106343660046134fd565b611264565b348015610644575f80fd5b506105036106533660046132ee565b6112ec565b348015610663575f80fd5b5061047560095481565b348015610678575f80fd5b506104a26106873660046134fd565b611321565b348015610697575f80fd5b50600754610443906001600160a01b031681565b3480156106b6575f80fd5b5060085461050390600160a81b900460ff1681565b3480156106d6575f80fd5b506104a261137c565b3480156106ea575f80fd5b506105036106f9366004613318565b6001600160a01b03165f908152601a602052604090205460ff1690565b348015610721575f80fd5b5061047560155481565b348015610736575f80fd5b506104a2610745366004613234565b6113f0565b348015610755575f80fd5b506104a2610764366004613318565b61144b565b348015610774575f80fd5b506104a2610783366004613234565b6114da565b348015610793575f80fd5b506104a26107a2366004613234565b611535565b3480156107b2575f80fd5b50610475611577565b3480156107c6575f80fd5b506104756107d5366004613318565b6115be565b3480156107e5575f80fd5b506105036107f4366004613318565b61162b565b348015610804575f80fd5b506104a2610813366004613234565b611698565b348015610823575f80fd5b50610475610832366004613318565b611765565b348015610842575f80fd5b506104a261177f565b348015610856575f80fd5b506104a2610865366004613318565b6117f2565b348015610875575f80fd5b506104a2610884366004613318565b61184e565b348015610894575f80fd5b50600e54610443906001600160a01b031681565b3480156108b3575f80fd5b5061047560165481565b3480156108c8575f80fd5b506104a26108d73660046132b7565b6118fd565b3480156108e7575f80fd5b506104a26108f63660046134fd565b611951565b348015610906575f80fd5b506104a2610915366004613234565b611989565b348015610925575f80fd5b506104a2611a03565b348015610939575f80fd5b506005546001600160a01b0316610443565b348015610956575f80fd5b5061047560145481565b34801561096b575f80fd5b506104b8611a80565b34801561097f575f80fd5b506104a261098e366004613518565b611a8f565b34801561099e575f80fd5b506104a26109ad3660046132b7565b611be9565b3480156109bd575f80fd5b506104a26109cc366004613234565b611c21565b3480156109dc575f80fd5b5061047560195481565b3480156109f1575f80fd5b506104a2610a003660046134fd565b611cf6565b348015610a10575f80fd5b5061047560175481565b348015610a25575f80fd5b506104a2610a34366004613318565b611d52565b348015610a44575f80fd5b5061047560185481565b348015610a59575f80fd5b50610503610a683660046132ee565b611e0e565b348015610a78575f80fd5b50610475610a87366004613318565b611e5b565b348015610a97575f80fd5b50610503610aa63660046132ee565b611e8d565b348015610ab6575f80fd5b50610aca610ac5366004613318565b611e99565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610457565b348015610b0c575f80fd5b50600f54610443906001600160a01b031681565b348015610b2b575f80fd5b50610503610b3a366004613318565b601b6020525f908152604090205460ff1681565b348015610b59575f80fd5b50610503610b68366004613318565b611f26565b348015610b78575f80fd5b5061047560135481565b348015610b8d575f80fd5b50610475611f58565b348015610ba1575f80fd5b506104a2610bb0366004613318565b611f9f565b348015610bc0575f80fd5b50610475610bcf366004613557565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610c04575f80fd5b5061047560125481565b348015610c19575f80fd5b5061047561205d565b348015610c2d575f80fd5b506104756120a4565b348015610c41575f80fd5b50610aca610c50366004613234565b6120eb565b348015610c60575f80fd5b506104a2610c6f366004613318565b612128565b348015610c7f575f80fd5b506104a2610c8e3660046134fd565b612212565b348015610c9e575f80fd5b5061047560105481565b348015610cb3575f80fd5b506104a2610cc2366004613234565b61224a565b6005546001600160a01b03163314610cfa5760405162461bcd60e51b8152600401610cf190613583565b60405180910390fd5b610d0c81670de0b6b3a76400006135cc565b90505f610d26600954600a546122f290919063ffffffff16565b90505f610d4882610d42600a548661235790919063ffffffff16565b906123d5565b90505f610d6483610d426009548761235790919063ffffffff16565b9050610d6f84612416565b600a54610d7c9083612706565b600a55600954610d8c9082612706565b60095550505050565b606060038054610da4906135e3565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd0906135e3565b8015610e1b5780601f10610df257610100808354040283529160200191610e1b565b820191905f5260205f20905b815481529060010190602001808311610dfe57829003601f168201915b5050505050905090565b6005546001600160a01b03163314610e4f5760405162461bcd60e51b8152600401610cf190613583565b6001600160a01b0382165f818152601a6020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b5f610eb9338484612747565b5060015b92915050565b6005546001600160a01b03163314610eed5760405162461bcd60e51b8152600401610cf190613583565b6001600160a01b0381165f818152601a6020908152604091829020805460ff19166001179055600f80546001600160a01b0319168417905590519182527f1816467f4e41d8dd27500ca11dc471852ca93f9b624c4d8d4430b8c4fa6424fa91015b60405180910390a150565b6005546001600160a01b03163314610f835760405162461bcd60e51b8152600401610cf190613583565b8051825114610fd45760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401610cf1565b60c8825111156110315760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401610cf1565b5f5b825181101561111d575f83828151811061104f5761104f61361b565b602002602001015190505f83838151811061106c5761106c61361b565b6020026020010151670de0b6b3a764000061108791906135cc565b905061109433838361286b565b600d546001600160a01b031663e30443bc836110af81611765565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b1580156110f2575f80fd5b505af1158015611104573d5f803e3d5ffd5b50505050505080806111159061362f565b915050611033565b505050565b5f61112e848484612971565b61117f843361117a85604051806060016040528060288152602001613893602891396001600160a01b038a165f9081526001602090815260408083203384529091529020549190612e9c565b612747565b5060019392505050565b600d54604080516304b9a6b360e31b815290515f926001600160a01b0316916325cd35989160048083019260209291908290030181865afa1580156111d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f49190613647565b905090565b600d54604080516342d359d760e11b815290515f926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611240573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111f49190613662565b6005546001600160a01b0316331461128e5760405162461bcd60e51b8152600401610cf190613583565b600d54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b5f604051808303815f87803b1580156112d3575f80fd5b505af11580156112e5573d5f803e3d5ffd5b5050505050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610eb991859061117a90866122f2565b6005546001600160a01b0316331461134b5760405162461bcd60e51b8152600401610cf190613583565b600d546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd80906024016112bc565b600d5460405163bc4c4b3760e01b81523360048201525f60248201526001600160a01b039091169063bc4c4b37906044016020604051808303815f875af11580156113c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ed9190613679565b50565b6005546001600160a01b0316331461141a5760405162461bcd60e51b8152600401610cf190613583565b600d54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb906024016112bc565b6005546001600160a01b031633146114755760405162461bcd60e51b8152600401610cf190613583565b6001600160a01b0381165f818152601a6020908152604091829020805460ff19166001179055600e80546001600160a01b0319168417905590519182527faacebbe32c0dbd14817cfb53e3cc8be68c7e133928317145be50a0d86c2244339101610f4e565b6005546001600160a01b031633146115045760405162461bcd60e51b8152600401610cf190613583565b600d54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db9906024016112bc565b6005546001600160a01b0316331461155f5760405162461bcd60e51b8152600401610cf190613583565b61157181670de0b6b3a76400006135cc565b60125550565b600d54604080516304ddf6ef60e11b815290515f926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611240573d5f803e3d5ffd5b600d546040516370a0823160e01b81526001600160a01b0383811660048301525f9216906370a08231906024015b602060405180830381865afa158015611607573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebd9190613662565b600d54604051636d48467b60e01b81526001600160a01b0383811660048301525f921690636d48467b906024015b602060405180830381865afa158015611674573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ebd9190613679565b600d546040516001624d3b8760e01b03198152600481018390525f91829182916001600160a01b03169063ffb2c479906024016060604051808303815f875af11580156116e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170b9190613694565b604080518481526020810184905290810182905260608101889052929550909350915032905f907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b03165f9081526020819052604090205490565b6005546001600160a01b031633146117a95760405162461bcd60e51b8152600401610cf190613583565b6005546040515f916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b0316331461181c5760405162461bcd60e51b8152600401610cf190613583565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024016112bc565b6005546001600160a01b031633146118785760405162461bcd60e51b8152600401610cf190613583565b600d5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015f604051808303815f87803b1580156118bc575f80fd5b505af11580156118ce573d5f803e3d5ffd5b5050506001600160a01b0382165f908152601a60205260409020805460ff19166001179055506113ed81612128565b6005546001600160a01b031633146119275760405162461bcd60e51b8152600401610cf190613583565b6001600160a01b03919091165f908152601c60205260409020805460ff1916911515919091179055565b600d54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d639906044016112bc565b6005546001600160a01b031633146119b35760405162461bcd60e51b8152600401610cf190613583565b62030d4081101580156119c95750620f42408111155b6119d1575f80fd5b60195460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db7905f90a3601955565b6005546001600160a01b03163314611a2d5760405162461bcd60e51b8152600401610cf190613583565b600854600160a81b900460ff1615611a43575f80fd5b6008805460ff60a81b1916600160a81b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c7905f90a1565b606060048054610da4906135e3565b6005546001600160a01b03163314611ab95760405162461bcd60e51b8152600401610cf190613583565b601586905560168490556014859055601383905560178290556018819055611aeb81611ae585886122f2565b906122f2565b600b55601754601554601654611b069291611ae591906122f2565b600c55600b546101f410801590611b2157506101f4600c5411155b611b7d5760405162461bcd60e51b815260206004820152602760248201527f746f74616c20666565732063616e6e6f74206578636565642038252073656c6c604482015266206f722062757960c81b6064820152608401610cf1565b601454601354601554601654601754601854604080519687526020870195909552938501929092526060840152608083015260a08201527ffb0d6f48717e74b9ad8ae84d152197402ac50bd6431ea28437926861021948ff9060c00160405180910390a1505050505050565b6005546001600160a01b03163314611c135760405162461bcd60e51b8152600401610cf190613583565b611c1d8282612ed4565b5050565b6005546001600160a01b03163314611c4b5760405162461bcd60e51b8152600401610cf190613583565b5f81118015611c5d5750622dc6c18111155b611cde5760405162461bcd60e51b815260206004820152604660248201527f53776170207468726573686f6c64206d7573742062652067726561746572207460448201527f68616e203020616e64206c657373207468616e203325206f6620746f74616c20606482015265737570706c7960d01b608482015260a401610cf1565b611cf081670de0b6b3a76400006135cc565b60115550565b6005546001600160a01b03163314611d205760405162461bcd60e51b8152600401610cf190613583565b600d54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea906024016112bc565b6005546001600160a01b03163314611d7c5760405162461bcd60e51b8152600401610cf190613583565b600d54604051630928847160e01b81526001600160a01b038381166004830152909116906309288471906024015f604051808303815f87803b158015611dc0575f80fd5b505af1158015611dd2573d5f803e3d5ffd5b5050600d546040516338c110ef60e21b81526001600160a01b0385811660048301525f6024830152909116925063e30443bc91506044016112bc565b5f610eb9338461117a856040518060600160405280602581526020016138bb60259139335f9081526001602090815260408083206001600160a01b038d1684529091529020549190612e9c565b600d546040516302a2e74960e61b81526001600160a01b0383811660048301525f92169063a8b9d240906024016115ec565b5f610eb9338484612971565b600d5460405163fbcbc0f160e01b81526001600160a01b0383811660048301525f92839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015611eee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1291906136bf565b949c939b5091995097509550909350915050565b600d5460405163ba079d4960e01b81526001600160a01b0383811660048301525f92169063ba079d4990602401611659565b600d546040805163bdd4f29f60e01b815290515f926001600160a01b03169163bdd4f29f9160048083019260209291908290030181865afa158015611240573d5f803e3d5ffd5b6005546001600160a01b03163314611fc95760405162461bcd60e51b8152600401610cf190613583565b600d5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed3906024015f604051808303815f87803b15801561200d575f80fd5b505af115801561201f573d5f803e3d5ffd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050610f4e565b600d546040805163039e107b60e61b815290515f926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611240573d5f803e3d5ffd5b600d546040805163e7cb7f8760e01b815290515f926001600160a01b03169163e7cb7f879160048083019260209291908290030181865afa158015611240573d5f803e3d5ffd5b600d54604051635183d6fd60e01b8152600481018390525f91829182918291829182916001600160a01b0390911690635183d6fd90602401611ed3565b6005546001600160a01b031633146121525760405162461bcd60e51b8152600401610cf190613583565b6001600160a01b0381166121b75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cf1565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600d54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a04906044016112bc565b6005546001600160a01b031633146122745760405162461bcd60e51b8152600401610cf190613583565b61c3508110156122da5760405162461bcd60e51b815260206004820152602b60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c65737360448201526a207468616e20302e30352560a81b6064820152608401610cf1565b6122ec81670de0b6b3a76400006135cc565b60105550565b5f806122fe838561370e565b9050838110156123505760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610cf1565b9392505050565b5f825f0361236657505f610ebd565b5f61237183856135cc565b90508261237e8583613721565b146123505760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610cf1565b5f61235083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f96565b805f036124205750565b61242981612fc2565b5f612441600954600a546122f290919063ffffffff16565b601654909150600190819081905f9081908190156124a15761249e60175460155460165461246f919061370e565b612479919061370e565b610d426016546124988b610d42600a544761235790919063ffffffff16565b90612357565b91505b601354156124eb576124e86018546014546013546124bf919061370e565b6124c9919061370e565b610d426013546124988b610d426009544761235790919063ffffffff16565b90505b6124f582826122f2565b9250821561255257600d546040516001600160a01b039091169084905f81818185875af1925050503d805f8114612547576040519150601f19603f3d011682016040523d82523d5f602084013e61254c565b606091505b50909650505b5f61256a6017546015546122f290919063ffffffff16565b601854601454612579916122f2565b612583919061370e565b90505f81156125995761259647836123d5565b90505b5f816125b26014546015546122f290919063ffffffff16565b6125bc91906135cc565b90505f826125d76018546017546122f290919063ffffffff16565b6125e191906135cc565b9050811561263e57600e546040516001600160a01b039091169083905f81818185875af1925050503d805f8114612633576040519150601f19603f3d011682016040523d82523d5f602084013e612638565b606091505b50909950505b801561269957600f546040516001600160a01b039091169082905f81818185875af1925050503d805f811461268e576040519150601f19603f3d011682016040523d82523d5f602084013e612693565b606091505b50909850505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd0876126c5838561370e565b8c80156126cf57508b5b80156126d857508a5b60408051938452602084019290925215159082015260600160405180910390a1505050505050505050505050565b5f61235083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e9c565b6001600160a01b0383166127a95760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610cf1565b6001600160a01b03821661280a5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610cf1565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166128915760405162461bcd60e51b8152600401610cf190613740565b6001600160a01b0382166128b75760405162461bcd60e51b8152600401610cf190613785565b6128f38160405180606001604052806026815260200161386d602691396001600160a01b0386165f908152602081905260409020549190612e9c565b6001600160a01b038085165f90815260208190526040808220939093559084168152205461292190826122f2565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910161285e565b6001600160a01b0383166129975760405162461bcd60e51b8152600401610cf190613740565b6001600160a01b0382166129bd5760405162461bcd60e51b8152600401610cf190613785565b6001600160a01b0383165f908152601c60205260408120548190819060ff16612a3957600854600160a81b900460ff16612a395760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401610cf1565b835f03612a5357612a4b86865f61286b565b505050505050565b6008546001600160a01b0390811690861603612a7357612a4b868561312c565b600854600160a01b900460ff16158015612aa557506001600160a01b0386165f908152601a602052604090205460ff16155b8015612ac957506001600160a01b0385165f908152601a602052604090205460ff16155b15612d9f576001600160a01b038086165f908152601b602052604080822054928916825290205460ff918216911680158015612b03575081155b15612c0757612b1388888861286b565b600d546001600160a01b031663e30443bc89612b2e81611765565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612b71575f80fd5b505af1158015612b83573d5f803e3d5ffd5b5050600d546001600160a01b0316915063e30443bc905088612ba481611765565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612be7575f80fd5b505af1158015612bf9573d5f803e3d5ffd5b505050505050505050505050565b8115612c2157601354945060145493506018549250612cac565b8015612cac576016549450601554935060175492505f612c4088611765565b601054909150612c50888361370e565b1115612caa5760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401610cf1565b505b5f612cc1612cba858761370e565b87906122f2565b90505f612ccd30611765565b60125490915081108015908190612cfc57506001600160a01b038b165f908152601b602052604090205460ff16155b15612d42576008805460ff60a01b1916600160a01b1790555f612d1e30611765565b9050612d2981612416565b506001600a8190556009556008805460ff60a01b191690555b5f612d53612710610d428c87612357565b9050612d5f8a82612706565b99508515612d7c57600954612d7490826122f2565b600955612d8d565b600a54612d8990826122f2565b600a555b612d988c308361286b565b5050505050505b612daa86868661286b565b600d546001600160a01b031663e30443bc87612dc581611765565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612e08575f80fd5b505af1158015612e1a573d5f803e3d5ffd5b5050600d546001600160a01b0316915063e30443bc905086612e3b81611765565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015f604051808303815f87803b158015612e7e575f80fd5b505af1158015612e90573d5f803e3d5ffd5b50505050505050505050565b5f8184841115612ebf5760405162461bcd60e51b8152600401610cf1919061324b565b505f612ecb84866137c8565b95945050505050565b6001600160a01b0382165f908152601b60205260409020805460ff19168215801591909117909155612f5b57600d5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db0906024015f604051808303815f87803b158015612f44575f80fd5b505af1158015612f56573d5f803e3d5ffd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab905f90a35050565b5f8183612fb65760405162461bcd60e51b8152600401610cf1919061324b565b505f612ecb8486613721565b5f6011548211612fd25781612fd6565b6011545b6040805160028082526060820183529293505f92909160208301908036833701905050905030815f8151811061300e5761300e61361b565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613065573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130899190613647565b8160018151811061309c5761309c61361b565b6001600160a01b0392831660209182029290920101526006546130c29130911684612747565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906130fa9085905f908690309042906004016137db565b5f604051808303815f87803b158015613111575f80fd5b505af1158015613123573d5f803e3d5ffd5b50505050505050565b6001600160a01b03821661318c5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610cf1565b6131c88160405180606001604052806022815260200161384b602291396001600160a01b0385165f908152602081905260409020549190612e9c565b6001600160a01b0383165f908152602081905260409020556002546131ed9082612706565b6002556040518181525f906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b5f60208284031215613244575f80fd5b5035919050565b5f6020808352835180828501525f5b818110156132765785810183015185820160400152820161325a565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146113ed575f80fd5b80151581146113ed575f80fd5b5f80604083850312156132c8575f80fd5b82356132d381613296565b915060208301356132e3816132aa565b809150509250929050565b5f80604083850312156132ff575f80fd5b823561330a81613296565b946020939093013593505050565b5f60208284031215613328575f80fd5b813561235081613296565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561337057613370613333565b604052919050565b5f67ffffffffffffffff82111561339157613391613333565b5060051b60200190565b5f82601f8301126133aa575f80fd5b813560206133bf6133ba83613378565b613347565b82815260059290921b840181019181810190868411156133dd575f80fd5b8286015b848110156133f857803583529183019183016133e1565b509695505050505050565b5f8060408385031215613414575f80fd5b823567ffffffffffffffff8082111561342b575f80fd5b818501915085601f83011261343e575f80fd5b8135602061344e6133ba83613378565b82815260059290921b8401810191818101908984111561346c575f80fd5b948201945b8386101561349357853561348481613296565b82529482019490820190613471565b965050860135925050808211156134a8575f80fd5b506134b58582860161339b565b9150509250929050565b5f805f606084860312156134d1575f80fd5b83356134dc81613296565b925060208401356134ec81613296565b929592945050506040919091013590565b5f6020828403121561350d575f80fd5b8135612350816132aa565b5f805f805f8060c0878903121561352d575f80fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b5f8060408385031215613568575f80fd5b823561357381613296565b915060208301356132e381613296565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082028115828204841417610ebd57610ebd6135b8565b600181811c908216806135f757607f821691505b60208210810361361557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f60018201613640576136406135b8565b5060010190565b5f60208284031215613657575f80fd5b815161235081613296565b5f60208284031215613672575f80fd5b5051919050565b5f60208284031215613689575f80fd5b8151612350816132aa565b5f805f606084860312156136a6575f80fd5b8351925060208401519150604084015190509250925092565b5f805f805f8060c087890312156136d4575f80fd5b86516136df81613296565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b80820180821115610ebd57610ebd6135b8565b5f8261373b57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610ebd57610ebd6135b8565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156138295784516001600160a01b031683529383019391830191600101613804565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e608907cd1163410bcf4c91977786d6fa7efc0e88e61e308114b309643cf449b64736f6c63430008140033

Deployed Bytecode Sourcemap

25531:20084:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25694:64;;;;;;;;;;-1:-1:-1;25694:64:0;;;;-1:-1:-1;;;;;25694:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;25694:64:0;;;;;;;;26207:28;;;;;;;;;;;;;;;;;;;368:25:1;;;356:2;341:18;26207:28:0;222:177:1;42521:443:0;;;;;;;;;;-1:-1:-1;42521:443:0;;;;;:::i;:::-;;:::i;:::-;;5801:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31532:181::-;;;;;;;;;;-1:-1:-1;31532:181:0;;;;;:::i;:::-;;:::i;6856:210::-;;;;;;;;;;-1:-1:-1;6856:210:0;;;;;:::i;:::-;;:::i;:::-;;;2273:14:1;;2266:22;2248:41;;2236:2;2221:18;6856:210:0;2108:187:1;25609:41:0;;;;;;;;;;-1:-1:-1;25609:41:0;;;;-1:-1:-1;;;;;25609:41:0;;;6122:108;;;;;;;;;;-1:-1:-1;6210:12:0;;6122:108;;31293:187;;;;;;;;;;-1:-1:-1;31293:187:0;;;;;:::i;:::-;;:::i;25872:28::-;;;;;;;;;;;;;;;;44975:637;;;;;;;;;;-1:-1:-1;44975:637:0;;;;;:::i;:::-;;:::i;7074:454::-;;;;;;;;;;-1:-1:-1;7074:454:0;;;;;:::i;:::-;;:::i;41685:114::-;;;;;;;;;;;;;:::i;25982:46::-;;;;;;;;;;-1:-1:-1;25982:46:0;;;;-1:-1:-1;;;;;25982:46:0;;;35216:141;;;;;;;;;;;;;:::i;30720:93::-;;;;;;;;;;-1:-1:-1;30720:93:0;;30803:2;6125:36:1;;6113:2;6098:18;30720:93:0;5983:184:1;37559:119:0;;;;;;;;;;-1:-1:-1;37559:119:0;;;;;:::i;:::-;;:::i;7536:300::-;;;;;;;;;;-1:-1:-1;7536:300:0;;;;;:::i;:::-;;:::i;25836:29::-;;;;;;;;;;;;;;;;33347:121;;;;;;;;;;-1:-1:-1;33347:121:0;;;;;:::i;:::-;;:::i;25659:28::-;;;;;;;;;;-1:-1:-1;25659:28:0;;;;-1:-1:-1;;;;;25659:28:0;;;25793:34;;;;;;;;;;-1:-1:-1;25793:34:0;;;;-1:-1:-1;;;25793:34:0;;;;;;36928:103;;;;;;;;;;;;;:::i;35365:126::-;;;;;;;;;;-1:-1:-1;35365:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;35455:28:0;35431:4;35455:28;;;:19;:28;;;;;;;;;35365:126;26357:31;;;;;;;;;;;;;;;;42147:183;;;;;;;;;;-1:-1:-1;42147:183:0;;;;;:::i;:::-;;:::i;31054:205::-;;;;;;;;;;-1:-1:-1;31054:205:0;;;;;:::i;:::-;;:::i;42338:175::-;;;;;;;;;;-1:-1:-1;42338:175:0;;;;;:::i;:::-;;:::i;32636:122::-;;;;;;;;;;-1:-1:-1;32636:122:0;;;;;:::i;:::-;;:::i;37177:142::-;;;;;;;;;;;;;:::i;35691:171::-;;;;;;;;;;-1:-1:-1;35691:171:0;;;;;:::i;:::-;;:::i;37686:185::-;;;;;;;;;;-1:-1:-1;37686:185:0;;;;;:::i;:::-;;:::i;36510:410::-;;;;;;;;;;-1:-1:-1;36510:410:0;;;;;:::i;:::-;;:::i;6238:177::-;;;;;;;;;;-1:-1:-1;6238:177:0;;;;;:::i;:::-;;:::i;13215:148::-;;;;;;;;;;;;;:::i;31762:127::-;;;;;;;;;;-1:-1:-1;31762:127:0;;;;;:::i;:::-;;:::i;34013:208::-;;;;;;;;;;-1:-1:-1;34013:208:0;;;;;:::i;:::-;;:::i;26037:38::-;;;;;;;;;;-1:-1:-1;26037:38:0;;;;-1:-1:-1;;;;;26037:38:0;;;26395:28;;;;;;;;;;;;;;;;32165:170;;;;;;;;;;-1:-1:-1;32165:170:0;;;;;:::i;:::-;;:::i;37327:109::-;;;;;;;;;;-1:-1:-1;37327:109:0;;;;;:::i;:::-;;:::i;33764:241::-;;;;;;;;;;-1:-1:-1;33764:241:0;;;;;:::i;:::-;;:::i;30858:151::-;;;;;;;;;;;;;:::i;13001:79::-;;;;;;;;;;-1:-1:-1;13066:6:0;;-1:-1:-1;;;;;13066:6:0;13001:79;;26318:32;;;;;;;;;;;;;;;;5909:104;;;;;;;;;;;;;:::i;34229:979::-;;;;;;;;;;-1:-1:-1;34229:979:0;;;;;:::i;:::-;;:::i;33047:163::-;;;;;;;;;;-1:-1:-1;33047:163:0;;;;;:::i;:::-;;:::i;32766:273::-;;;;;;;;;;-1:-1:-1;32766:273:0;;;;;:::i;:::-;;:::i;26544:40::-;;;;;;;;;;;;;;;;33218:121;;;;;;;;;;-1:-1:-1;33218:121:0;;;;;:::i;:::-;;:::i;26430:24::-;;;;;;;;;;;;;;;;31927:176;;;;;;;;;;-1:-1:-1;31927:176:0;;;;;:::i;:::-;;:::i;26461:25::-;;;;;;;;;;;;;;;;7844:400;;;;;;;;;;-1:-1:-1;7844:400:0;;;;;:::i;:::-;;:::i;35499:184::-;;;;;;;;;;-1:-1:-1;35499:184:0;;;;;:::i;:::-;;:::i;6423:216::-;;;;;;;;;;-1:-1:-1;6423:216:0;;;;;:::i;:::-;;:::i;35870:307::-;;;;;;;;;;-1:-1:-1;35870:307:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;7471:32:1;;;7453:51;;7535:2;7520:18;;7513:34;;;;7563:18;;;7556:34;;;;7621:2;7606:18;;7599:34;7664:3;7649:19;;7642:35;7491:3;7693:19;;7686:35;7440:3;7425:19;35870:307:0;7170:557:1;26082:32:0;;;;;;;;;;-1:-1:-1;26082:32:0;;;;-1:-1:-1;;;;;26082:32:0;;;26707:57;;;;;;;;;;-1:-1:-1;26707:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37879:127;;;;;;;;;;-1:-1:-1;37879:127:0;;;;;:::i;:::-;;:::i;26282:29::-;;;;;;;;;;;;;;;;41977:154;;;;;;;;;;;;;:::i;41519:158::-;;;;;;;;;;-1:-1:-1;41519:158:0;;;;;:::i;:::-;;:::i;6647:201::-;;;;;;;;;;-1:-1:-1;6647:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;6813:18:0;;;6781:7;6813:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6647:201;26242:33;;;;;;;;;;;;;;;;37039:130;;;;;;;;;;;;;:::i;41807:162::-;;;;;;;;;;;;;:::i;36185:317::-;;;;;;;;;;-1:-1:-1;36185:317:0;;;;;:::i;:::-;;:::i;13371:281::-;;;;;;;;;;-1:-1:-1;13371:281:0;;;;;:::i;:::-;;:::i;37444:107::-;;;;;;;;;;-1:-1:-1;37444:107:0;;;;;:::i;:::-;;:::i;26176:24::-;;;;;;;;;;;;;;;;32405:201;;;;;;;;;;-1:-1:-1;32405:201:0;;;;;:::i;:::-;;:::i;42521:443::-;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;;;;;;;;;42609:17:::1;:6:::0;42619::::1;42609:17;:::i;:::-;42600:26;;42637:19;42659:25;42673:10;;42659:9;;:13;;:25;;;;:::i;:::-;42637:47;;42695:15;42713:38;42739:11;42713:21;42724:9;;42713:6;:10;;:21;;;;:::i;:::-;:25:::0;::::1;:38::i;:::-;42695:56;;42762:16;42781:39;42808:11;42781:22;42792:10;;42781:6;:10;;:22;;;;:::i;:39::-;42762:58;;42833:28;42854:6;42833:20;:28::i;:::-;42886:9;::::0;:22:::1;::::0;42900:7;42886:13:::1;:22::i;:::-;42874:9;:34:::0;42932:10:::1;::::0;:24:::1;::::0;42947:8;42932:14:::1;:24::i;:::-;42919:10;:37:::0;-1:-1:-1;;;;42521:443:0:o;5801:100::-;5855:13;5888:5;5881:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5801:100;:::o;31532:181::-;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31616:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;31616:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;31671:34;;2248:41:1;;;31671:34:0::1;::::0;2221:18:1;31671:34:0::1;;;;;;;31532:181:::0;;:::o;6856:210::-;6975:4;6997:39;387:10;7020:7;7029:6;6997:8;:39::i;:::-;-1:-1:-1;7054:4:0;6856:210;;;;;:::o;31293:187::-;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31361:27:0;::::1;;::::0;;;:19:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;31361:34:0::1;31391:4;31361:34;::::0;;31406:9:::1;:27:::0;;-1:-1:-1;;;;;;31406:27:0::1;::::0;::::1;::::0;;31449:23;;160:51:1;;;31449:23:0::1;::::0;133:18:1;31449:23:0::1;;;;;;;;31293:187:::0;:::o;44975:637::-;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;45147:6:::1;:13;45122:14;:21;:38;45114:80;;;::::0;-1:-1:-1;;;45114:80:0;;9378:2:1;45114:80:0::1;::::0;::::1;9360:21:1::0;9417:2;9397:18;;;9390:30;9456:32;9436:18;;;9429:60;9506:18;;45114:80:0::1;9176:354:1::0;45114:80:0::1;45238:3;45213:14;:21;:28;;45205:75;;;::::0;-1:-1:-1;;;45205:75:0;;9737:2:1;45205:75:0::1;::::0;::::1;9719:21:1::0;9776:2;9756:18;;;9749:30;9815:34;9795:18;;;9788:62;-1:-1:-1;;;9866:18:1;;;9859:32;9908:19;;45205:75:0::1;9535:398:1::0;45205:75:0::1;45296:9;45291:314;45315:14;:21;45311:1;:25;45291:314;;;45358:14;45375;45390:1;45375:17;;;;;;;;:::i;:::-;;;;;;;45358:34;;45407:21;45431:6;45438:1;45431:9;;;;;;;;:::i;:::-;;;;;;;45444:6;45431:20;;;;:::i;:::-;45407:44;;45466:50;45482:10;45494:6;45502:13;45466:15;:50::i;:::-;45531:15;::::0;-1:-1:-1;;;;;45531:15:0::1;:26;45566:6:::0;45575:17:::1;45566:6:::0;45575:9:::1;:17::i;:::-;45531:62;::::0;-1:-1:-1;;;;;;45531:62:0::1;::::0;;;;;;-1:-1:-1;;;;;10270:32:1;;;45531:62:0::1;::::0;::::1;10252:51:1::0;10319:18;;;10312:34;10225:18;;45531:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;45343:262;;45338:3;;;;;:::i;:::-;;;;45291:314;;;;44975:637:::0;;:::o;7074:454::-;7214:4;7231:36;7241:6;7249:9;7260:6;7231:9;:36::i;:::-;7278:220;7301:6;387:10;7349:138;7405:6;7349:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7349:19:0;;;;;;:11;:19;;;;;;;;387:10;7349:33;;;;;;;;;;:37;:138::i;:::-;7278:8;:220::i;:::-;-1:-1:-1;7516:4:0;7074:454;;;;;:::o;41685:114::-;41759:15;;:32;;;-1:-1:-1;;;41759:32:0;;;;41732:7;;-1:-1:-1;;;;;41759:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41752:39;;41685:114;:::o;35216:141::-;35306:15;;:43;;;-1:-1:-1;;;35306:43:0;;;;35279:7;;-1:-1:-1;;;;;35306:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37559:119::-;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;37629:15:::1;::::0;:41:::1;::::0;-1:-1:-1;;;37629:41:0;;2273:14:1;;2266:22;37629:41:0::1;::::0;::::1;2248::1::0;-1:-1:-1;;;;;37629:15:0;;::::1;::::0;:34:::1;::::0;2221:18:1;;37629:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37559:119:::0;:::o;7536:300::-;387:10;7651:4;7745:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7745:34:0;;;;;;;;;;7651:4;;7673:133;;7723:7;;7745:50;;7784:10;7745:38;:50::i;33347:121::-;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;33417:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;33417:43:0;;2273:14:1;;2266:22;33417:43:0::1;::::0;::::1;2248:41:1::0;-1:-1:-1;;;;;33417:15:0;;::::1;::::0;:36:::1;::::0;2221:18:1;;33417:43:0::1;2108:187:1::0;36928:103:0;36965:15;;:58;;-1:-1:-1;;;36965:58:0;;37004:10;36965:58;;;11126:51:1;36965:15:0;11193:18:1;;;11186:50;-1:-1:-1;;;;;36965:15:0;;;;:30;;11099:18:1;;36965:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36928:103::o;42147:183::-;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;42261:15:::1;::::0;:61:::1;::::0;-1:-1:-1;;;42261:61:0;;::::1;::::0;::::1;368:25:1::0;;;-1:-1:-1;;;;;42261:15:0;;::::1;::::0;:54:::1;::::0;341:18:1;;42261:61:0::1;222:177:1::0;31054:205:0;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31128:27:0;::::1;;::::0;;;:19:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;31128:34:0::1;31158:4;31128:34;::::0;;31173:15:::1;:33:::0;;-1:-1:-1;;;;;;31173:33:0::1;::::0;::::1;::::0;;31222:29;;160:51:1;;;31222:29:0::1;::::0;133:18:1;31222:29:0::1;14:203:1::0;42338:175:0;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;42448:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;42448:57:0;;::::1;::::0;::::1;368:25:1::0;;;-1:-1:-1;;;;;42448:15:0;;::::1;::::0;:50:::1;::::0;341:18:1;;42448:57:0::1;222:177:1::0;32636:122:0;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;32731:19:::1;:6:::0;32741:8:::1;32731:19;:::i;:::-;32710:18;:40:::0;-1:-1:-1;32636:122:0:o;37177:142::-;37270:15;;:41;;;-1:-1:-1;;;37270:41:0;;;;37243:7;;-1:-1:-1;;;;;37270:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;35691:171;35820:15;;:34;;-1:-1:-1;;;35820:34:0;;-1:-1:-1;;;;;178:32:1;;;35820:34:0;;;160:51:1;35788:7:0;;35820:15;;:25;;133:18:1;;35820:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37686:185::-;37815:15;;:48;;-1:-1:-1;;;37815:48:0;;-1:-1:-1;;;;;178:32:1;;;37815:48:0;;;160:51:1;37786:4:0;;37815:15;;:39;;133:18:1;;37815:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;36510:410::-;36692:15;;:28;;-1:-1:-1;;;;;;36692:28:0;;;;;368:25:1;;;36590:18:0;;;;;;-1:-1:-1;;;;;36692:15:0;;:23;;341:18:1;;36692:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36736:176;;;12039:25:1;;;12095:2;12080:18;;12073:34;;;12123:18;;;12116:34;;;12181:2;12166:18;;12159:34;;;36575:145:0;;-1:-1:-1;36575:145:0;;-1:-1:-1;36575:145:0;-1:-1:-1;36892:9:0;;36854:5;;36736:176;;12026:3:1;12011:19;36736:176:0;;;;;;;36564:356;;;36510:410;:::o;6238:177::-;-1:-1:-1;;;;;6389:18:0;6357:7;6389:18;;;;;;;;;;;;6238:177::o;13215:148::-;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;13306:6:::1;::::0;13285:40:::1;::::0;13322:1:::1;::::0;-1:-1:-1;;;;;13306:6:0::1;::::0;13285:40:::1;::::0;13322:1;;13285:40:::1;13336:6;:19:::0;;-1:-1:-1;;;;;;13336:19:0::1;::::0;;13215:148::o;31762:127::-;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;31836:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;31836:45:0;;-1:-1:-1;;;;;178:32:1;;;31836:45:0::1;::::0;::::1;160:51:1::0;31836:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;31836:45:0::1;14:203:1::0;34013:208:0;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;34082:15:::1;::::0;:46:::1;::::0;-1:-1:-1;;;34082:46:0;;-1:-1:-1;;;;;178:32:1;;;34082:46:0::1;::::0;::::1;160:51:1::0;34082:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;34082:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;34139:29:0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;34139:36:0::1;34171:4;34139:36;::::0;;-1:-1:-1;34186:27:0::1;34159:8:::0;34186:17:::1;:27::i;32165:170::-:0;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32277:41:0;;;::::1;;::::0;;;:33:::1;:41;::::0;;;;:50;;-1:-1:-1;;32277:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32165:170::o;37327:109::-;37381:15;;:47;;-1:-1:-1;;;37381:47:0;;37410:10;37381:47;;;11126:51:1;11220:14;;11213:22;11193:18;;;11186:50;-1:-1:-1;;;;;37381:15:0;;;;:28;;11099:18:1;;37381:47:0;10942:300:1;33764:241:0;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;33862:6:::1;33850:8;:18;;:41;;;;;33884:7;33872:8;:19;;33850:41;33842:50;;;::::0;::::1;;33942:16;::::0;33908:51:::1;::::0;33932:8;;33908:51:::1;::::0;;;::::1;33970:16;:27:::0;33764:241::o;30858:151::-;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;30922:14:::1;::::0;-1:-1:-1;;;30922:14:0;::::1;;;30921:15;30913:24;;;::::0;::::1;;30948:14;:21:::0;;-1:-1:-1;;;;30948:21:0::1;-1:-1:-1::0;;;30948:21:0::1;::::0;;30985:16:::1;::::0;::::1;::::0;30948:21;;30985:16:::1;30858:151::o:0;5909:104::-;5965:13;5998:7;5991:14;;;;;:::i;34229:979::-;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;34457:16:::1;:31:::0;;;34499:13:::1;:26:::0;;;34536:17:::1;:33:::0;;;34580:14:::1;:28:::0;;;34619:9:::1;:18:::0;;;34648:10:::1;:20:::0;;;34697:81:::1;34661:7:::0;34697:51:::1;34597:11:::0;34556:13;34697:32:::1;:51::i;:::-;:69:::0;::::1;:81::i;:::-;34681:13;:97:::0;34874:9:::1;::::0;34838:16:::1;::::0;34806:13:::1;::::0;:78:::1;::::0;34874:9;34806:49:::1;::::0;:13;:31:::1;:49::i;:78::-;34791:12;:93:::0;34905:13:::1;::::0;34922:3:::1;-1:-1:-1::0;34905:20:0;::::1;::::0;:43:::1;;;34945:3;34929:12;;:19;;34905:43;34897:95;;;::::0;-1:-1:-1;;;34897:95:0;;12695:2:1;34897:95:0::1;::::0;::::1;12677:21:1::0;12734:2;12714:18;;;12707:30;12773:34;12753:18;;;12746:62;-1:-1:-1;;;12824:18:1;;;12817:37;12871:19;;34897:95:0::1;12493:403:1::0;34897:95:0::1;35035:17;::::0;35067:14:::1;::::0;35096:16:::1;::::0;35127:13:::1;::::0;35155:9:::1;::::0;35179:10:::1;::::0;35010:190:::1;::::0;;13188:25:1;;;13244:2;13229:18;;13222:34;;;;13272:18;;;13265:34;;;;13330:2;13315:18;;13308:34;13373:3;13358:19;;13351:35;13417:3;13402:19;;13395:35;35010:190:0::1;::::0;13175:3:1;13160:19;35010:190:0::1;;;;;;;34229:979:::0;;;;;;:::o;33047:163::-;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;33161:41:::1;33190:4;33196:5;33161:28;:41::i;:::-;33047:163:::0;;:::o;32766:273::-;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;32872:1:::1;32855:14;:18;:47;;;;;32895:7;32877:14;:25;;32855:47;32847:130;;;::::0;-1:-1:-1;;;32847:130:0;;13643:2:1;32847:130:0::1;::::0;::::1;13625:21:1::0;13682:2;13662:18;;;13655:30;13721:34;13701:18;;;13694:62;13792:34;13772:18;;;13765:62;-1:-1:-1;;;13843:19:1;;;13836:37;13890:19;;32847:130:0::1;13441:474:1::0;32847:130:0::1;33004:27;:14:::0;33022:8:::1;33004:27;:::i;:::-;32988:13;:43:::0;-1:-1:-1;32766:273:0:o;33218:121::-;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;33288:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;33288:43:0;;2273:14:1;;2266:22;33288:43:0::1;::::0;::::1;2248:41:1::0;-1:-1:-1;;;;;33288:15:0;;::::1;::::0;:36:::1;::::0;2221:18:1;;33288:43:0::1;2108:187:1::0;31927:176:0;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;32001:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;32001:45:0;;-1:-1:-1;;;;;178:32:1;;;32001:45:0::1;::::0;::::1;160:51:1::0;32001:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;32001:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;32057:15:0::1;::::0;:38:::1;::::0;-1:-1:-1;;;32057:38:0;;-1:-1:-1;;;;;10270:32:1;;;32057:38:0::1;::::0;::::1;10252:51:1::0;32057:15:0::1;10319:18:1::0;;;10312:34;32057:15:0;;::::1;::::0;-1:-1:-1;32057:26:0::1;::::0;-1:-1:-1;10225:18:1;;32057:38:0::1;10070:282:1::0;7844:400:0;7964:4;7986:228;387:10;8036:7;8058:145;8115:15;8058:145;;;;;;;;;;;;;;;;;387:10;8058:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;8058:34:0;;;;;;;;;;;;:38;:145::i;35499:184::-;35628:15;;:47;;-1:-1:-1;;;35628:47:0;;-1:-1:-1;;;;;178:32:1;;;35628:47:0;;;160:51:1;35596:7:0;;35628:15;;:38;;133:18:1;;35628:47:0;14:203:1;6423:216:0;6545:4;6567:42;387:10;6591:9;6602:6;6567:9;:42::i;35870:307::-;36134:15;;:35;;-1:-1:-1;;;36134:35:0;;-1:-1:-1;;;;;178:32:1;;;36134:35:0;;;160:51:1;35984:7:0;;;;;;;;;;;;36134:15;;;;:26;;133:18:1;;36134:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36127:42;;;;-1:-1:-1;36127:42:0;;-1:-1:-1;36127:42:0;-1:-1:-1;36127:42:0;-1:-1:-1;36127:42:0;;-1:-1:-1;35870:307:0;-1:-1:-1;;35870:307:0:o;37879:127::-;37963:15;;:35;;-1:-1:-1;;;37963:35:0;;-1:-1:-1;;;;;178:32:1;;;37963:35:0;;;160:51:1;37939:4:0;;37963:15;;:26;;133:18:1;;37963:35:0;14:203:1;41977:154:0;42071:15;;:52;;;-1:-1:-1;;;42071:52:0;;;;42044:7;;-1:-1:-1;;;;;42071:15:0;;:50;;:52;;;;;;;;;;;;;;:15;:52;;;;;;;;;;;;;;41519:158;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;41589:15:::1;::::0;:40:::1;::::0;-1:-1:-1;;;41589:40:0;;-1:-1:-1;;;;;178:32:1;;;41589:40:0::1;::::0;::::1;160:51:1::0;41589:15:0;;::::1;::::0;:33:::1;::::0;133:18:1;;41589:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;41645:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;41645:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;41645:24:0::1;14:203:1::0;37039:130:0;37122:15;;:39;;;-1:-1:-1;;;37122:39:0;;;;37095:7;;-1:-1:-1;;;;;37122:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;41807:162;41905:15;;:56;;;-1:-1:-1;;;41905:56:0;;;;41878:7;;-1:-1:-1;;;;;41905:15:0;;:54;;:56;;;;;;;;;;;;;;:15;:56;;;;;;;;;;;;;;36185:317;36454:15;;:40;;-1:-1:-1;;;36454:40:0;;;;;368:25:1;;;36304:7:0;;;;;;;;;;;;-1:-1:-1;;;;;36454:15:0;;;;:33;;341:18:1;;36454:40:0;222:177:1;13371:281:0;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13474:22:0;::::1;13452:110;;;::::0;-1:-1:-1;;;13452:110:0;;14971:2:1;13452:110:0::1;::::0;::::1;14953:21:1::0;15010:2;14990:18;;;14983:30;15049:34;15029:18;;;15022:62;-1:-1:-1;;;15100:18:1;;;15093:36;15146:19;;13452:110:0::1;14769:402:1::0;13452:110:0::1;13599:6;::::0;13578:38:::1;::::0;-1:-1:-1;;;;;13578:38:0;;::::1;::::0;13599:6:::1;::::0;13578:38:::1;::::0;13599:6:::1;::::0;13578:38:::1;13627:6;:17:::0;;-1:-1:-1;;;;;;13627:17:0::1;-1:-1:-1::0;;;;;13627:17:0;;;::::1;::::0;;;::::1;::::0;;13371:281::o;37444:107::-;37497:15;;:46;;-1:-1:-1;;;37497:46:0;;37525:10;37497:46;;;11126:51:1;11220:14;;11213:22;11193:18;;;11186:50;-1:-1:-1;;;;;37497:15:0;;;;:27;;11099:18:1;;37497:46:0;10942:300:1;32405:201:0;13128:6;;-1:-1:-1;;;;;13128:6:0;387:10;13128:22;13120:67;;;;-1:-1:-1;;;13120:67:0;;;;;;;:::i;:::-;32499:5:::1;32485:10;:19;;32477:75;;;::::0;-1:-1:-1;;;32477:75:0;;15378:2:1;32477:75:0::1;::::0;::::1;15360:21:1::0;15417:2;15397:18;;;15390:30;15456:34;15436:18;;;15429:62;-1:-1:-1;;;15507:18:1;;;15500:41;15558:19;;32477:75:0::1;15176:407:1::0;32477:75:0::1;32575:23;:10:::0;32589:8:::1;32575:23;:::i;:::-;32563:9;:35:::0;-1:-1:-1;32405:201:0:o;11027:181::-;11085:7;;11117:5;11121:1;11117;:5;:::i;:::-;11105:17;;11146:1;11141;:6;;11133:46;;;;-1:-1:-1;;;11133:46:0;;15920:2:1;11133:46:0;;;15902:21:1;15959:2;15939:18;;;15932:30;15998:29;15978:18;;;15971:57;16045:18;;11133:46:0;15718:351:1;11133:46:0;11199:1;11027:181;-1:-1:-1;;;11027:181:0:o;11594:250::-;11652:7;11676:1;11681;11676:6;11672:47;;-1:-1:-1;11706:1:0;11699:8;;11672:47;11731:9;11743:5;11747:1;11743;:5;:::i;:::-;11731:17;-1:-1:-1;11776:1:0;11767:5;11771:1;11731:17;11767:5;:::i;:::-;:10;11759:56;;;;-1:-1:-1;;;11759:56:0;;16498:2:1;11759:56:0;;;16480:21:1;16537:2;16517:18;;;16510:30;16576:34;16556:18;;;16549:62;-1:-1:-1;;;16627:18:1;;;16620:31;16668:19;;11759:56:0;16296:397:1;11852:132:0;11910:7;11937:39;11941:1;11944;11937:39;;;;;;;;;;;;;;;;;:3;:39::i;42972:1995::-;43041:6;43051:1;43041:11;43037:50;;42972:1995;:::o;43037:50::-;43097:24;43114:6;43097:16;:24::i;:::-;43132:19;43154:25;43168:10;;43154:9;;:13;;:25;;;;:::i;:::-;43395:13;;43132:47;;-1:-1:-1;43207:4:0;;;;;;43192:12;;;;;;43395:17;43391:261;;43448:192;43630:9;;43611:16;;43595:13;;:32;;;;:::i;:::-;:44;;;;:::i;:::-;43448:128;43562:13;;43448:95;43531:11;43448:64;43502:9;;43448:35;:53;;:64;;;;:::i;:95::-;:113;;:128::i;:192::-;43429:211;;43391:261;43666:14;;:18;43662:268;;43721:197;43907:10;;43887:17;;43870:14;;:34;;;;:::i;:::-;:47;;;;:::i;:::-;43721:130;43836:14;;43721:96;43805:11;43721:65;43775:10;;43721:35;:53;;:65;;;;:::i;:197::-;43701:217;;43662:268;43952:39;:16;43973:17;43952:20;:39::i;:::-;43940:51;-1:-1:-1;44008:13:0;;44004:111;;44060:15;;44052:51;;-1:-1:-1;;;;;44060:15:0;;;;44089:9;;44052:51;;;;44089:9;44060:15;44052:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44038:65:0;;-1:-1:-1;;44004:111:0;44135:21;44208:31;44229:9;;44208:16;;:20;;:31;;;;:::i;:::-;44181:10;;44159:17;;:33;;:21;:33::i;:::-;:80;;;;:::i;:::-;44135:104;-1:-1:-1;44252:19:0;44286:17;;44282:104;;44334:40;:21;44360:13;44334:25;:40::i;:::-;44320:54;;44282:104;44396:23;44464:11;44422:39;44443:17;;44422:16;;:20;;:39;;;;:::i;:::-;:53;;;;:::i;:::-;44396:79;;44486:17;44534:11;44506:25;44520:10;;44506:9;;:13;;:25;;;;:::i;:::-;:39;;;;:::i;:::-;44486:59;-1:-1:-1;44562:19:0;;44558:126;;44623:15;;44615:57;;-1:-1:-1;;;;;44623:15:0;;;;44652;;44615:57;;;;44652:15;44623;44615:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44598:74:0;;-1:-1:-1;;44558:126:0;44698:13;;44694:108;;44753:9;;44745:45;;-1:-1:-1;;;;;44753:9:0;;;;44776;;44745:45;;;;44776:9;44753;44745:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44728:62:0;;-1:-1:-1;;44694:108:0;44819:140;44847:9;44871:27;44889:9;44871:15;:27;:::i;:::-;44913:7;:21;;;;;44924:10;44913:21;:35;;;;;44938:10;44913:35;44819:140;;;17104:25:1;;;17160:2;17145:18;;17138:34;;;;17215:14;17208:22;17188:18;;;17181:50;17092:2;17077:18;44819:140:0;;;;;;;43026:1941;;;;;;;;;;;42972:1995;:::o;11216:136::-;11274:7;11301:43;11305:1;11308;11301:43;;;;;;;;;;;;;;;;;:3;:43::i;9719:380::-;-1:-1:-1;;;;;9855:19:0;;9847:68;;;;-1:-1:-1;;;9847:68:0;;17444:2:1;9847:68:0;;;17426:21:1;17483:2;17463:18;;;17456:30;17522:34;17502:18;;;17495:62;-1:-1:-1;;;17573:18:1;;;17566:34;17617:19;;9847:68:0;17242:400:1;9847:68:0;-1:-1:-1;;;;;9934:21:0;;9926:68;;;;-1:-1:-1;;;9926:68:0;;17849:2:1;9926:68:0;;;17831:21:1;17888:2;17868:18;;;17861:30;17927:34;17907:18;;;17900:62;-1:-1:-1;;;17978:18:1;;;17971:32;18020:19;;9926:68:0;17647:398:1;9926:68:0;-1:-1:-1;;;;;10007:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10059:32;;368:25:1;;;10059:32:0;;341:18:1;10059:32:0;;;;;;;;9719:380;;;:::o;8252:610::-;-1:-1:-1;;;;;8392:20:0;;8384:70;;;;-1:-1:-1;;;8384:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8473:23:0;;8465:71;;;;-1:-1:-1;;;8465:71:0;;;;;;;:::i;:::-;8629:108;8665:6;8629:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8629:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;8609:17:0;;;:9;:17;;;;;;;;;;;:128;;;;8771:20;;;;;;;:32;;8796:6;8771:24;:32::i;:::-;-1:-1:-1;;;;;8748:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;8819:35;368:25:1;;;8748:20:0;;8819:35;;;;;;341:18:1;8819:35:0;222:177:1;38014:2894:0;-1:-1:-1;;;;;38146:18:0;;38138:68;;;;-1:-1:-1;;;38138:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38225:16:0;;38217:64;;;;-1:-1:-1;;;38217:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38385:39:0;;38292:18;38385:39;;;:33;:39;;;;;;38292:18;;;;38385:39;;38380:132;;38449:14;;-1:-1:-1;;;38449:14:0;;;;38441:59;;;;-1:-1:-1;;;38441:59:0;;19062:2:1;38441:59:0;;;19044:21:1;;;19081:18;;;19074:30;19140:34;19120:18;;;19113:62;19192:18;;38441:59:0;18860:356:1;38441:59:0;38544:6;38554:1;38544:11;38540:93;;38572:28;38588:4;38594:2;38598:1;38572:15;:28::i;:::-;38615:7;;;38014:2894;;;:::o;38540:93::-;38664:4;;-1:-1:-1;;;;;38664:4:0;;;38658:10;;;;38654:2075;;38685:19;38691:4;38697:6;38685:5;:19::i;38654:2075::-;38773:8;;-1:-1:-1;;;38773:8:0;;;;38772:9;:39;;;;-1:-1:-1;;;;;;38786:25:0;;;;;;:19;:25;;;;;;;;38785:26;38772:39;:67;;;;-1:-1:-1;;;;;;38816:23:0;;;;;;:19;:23;;;;;;;;38815:24;38772:67;38754:1975;;;-1:-1:-1;;;;;38883:29:0;;;38866:14;38883:29;;;:25;:29;;;;;;;38943:31;;;;;;;;38883:29;;;;;38943:31;39007:9;;:23;;;;;39021:9;39020:10;39007:23;39003:796;;;39051:33;39067:4;39073:2;39077:6;39051:15;:33::i;:::-;39103:15;;-1:-1:-1;;;;;39103:15:0;:26;39130:4;39136:15;39130:4;39136:9;:15::i;:::-;39103:49;;-1:-1:-1;;;;;;39103:49:0;;;;;;;-1:-1:-1;;;;;10270:32:1;;;39103:49:0;;;10252:51:1;10319:18;;;10312:34;10225:18;;39103:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39171:15:0;;-1:-1:-1;;;;;39171:15:0;;-1:-1:-1;39171:26:0;;-1:-1:-1;39198:2:0;39202:13;39198:2;39202:9;:13::i;:::-;39171:45;;-1:-1:-1;;;;;;39171:45:0;;;;;;;-1:-1:-1;;;;;10270:32:1;;;39171:45:0;;;10252:51:1;10319:18;;;10312:34;10225:18;;39171:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39235:7;;;;;38014:2894;;;:::o;39003:796::-;39282:9;39278:521;;;39325:14;;39312:27;;39374:17;;39358:33;;39419:10;;39410:19;;39278:521;;;39457:8;39453:346;;;39499:13;;39486:26;;39547:16;;39531:32;;39591:9;;39582:18;;39621:32;39656:13;39666:2;39656:9;:13::i;:::-;39733:9;;39621:48;;-1:-1:-1;39696:33:0;39723:6;39621:48;39696:33;:::i;:::-;:46;;39688:95;;;;-1:-1:-1;;;39688:95:0;;19702:2:1;39688:95:0;;;19684:21:1;19741:2;19721:18;;;19714:30;19780:34;19760:18;;;19753:62;-1:-1:-1;;;19831:18:1;;;19824:34;19875:19;;39688:95:0;19500:400:1;39688:95:0;39467:332;39453:346;39813:17;39833:56;39866:22;39882:6;39866:13;:22;:::i;:::-;39833:10;;:32;:56::i;:::-;39813:76;;39906:28;39937:24;39955:4;39937:9;:24::i;:::-;40017:18;;39906:55;;-1:-1:-1;39993:42:0;;;;;;;40056:43;;-1:-1:-1;;;;;;40068:31:0;;;;;;:25;:31;;;;;;;;40067:32;40056:43;40052:328;;;40120:8;:15;;-1:-1:-1;;;;40120:15:0;-1:-1:-1;;;40120:15:0;;;;40183:24;40201:4;40183:9;:24::i;:::-;40156:51;;40226:38;40247:16;40226:20;:38::i;:::-;-1:-1:-1;40295:1:0;40283:9;:13;;;40315:10;:14;40348:8;:16;;-1:-1:-1;;;;40348:16:0;;;40052:328;40396:12;40411:32;40437:5;40411:21;:6;40422:9;40411:10;:21::i;:32::-;40396:47;-1:-1:-1;40469:16:0;:6;40396:47;40469:10;:16::i;:::-;40460:25;;40506:9;40502:155;;;40549:10;;:20;;40564:4;40549:14;:20::i;:::-;40536:10;:33;40502:155;;;40622:9;;:19;;40636:4;40622:13;:19::i;:::-;40610:9;:31;40502:155;40673:42;40689:4;40703;40710;40673:15;:42::i;:::-;38851:1878;;;;;;38754:1975;40741:33;40757:4;40763:2;40767:6;40741:15;:33::i;:::-;40785:15;;-1:-1:-1;;;;;40785:15:0;:26;40812:4;40818:15;40812:4;40818:9;:15::i;:::-;40785:49;;-1:-1:-1;;;;;;40785:49:0;;;;;;;-1:-1:-1;;;;;10270:32:1;;;40785:49:0;;;10252:51:1;10319:18;;;10312:34;10225:18;;40785:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40845:15:0;;-1:-1:-1;;;;;40845:15:0;;-1:-1:-1;40845:26:0;;-1:-1:-1;40872:2:0;40876:13;40872:2;40876:9;:13::i;:::-;40845:45;;-1:-1:-1;;;;;;40845:45:0;;;;;;;-1:-1:-1;;;;;10270:32:1;;;40845:45:0;;;10252:51:1;10319:18;;;10312:34;10225:18;;40845:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38127:2781;;;38014:2894;;;:::o;11360:226::-;11480:7;11516:12;11508:6;;;;11500:29;;;;-1:-1:-1;;;11500:29:0;;;;;;;;:::i;:::-;-1:-1:-1;11540:9:0;11552:5;11556:1;11552;:5;:::i;:::-;11540:17;11360:226;-1:-1:-1;;;;;11360:226:0:o;33476:280::-;-1:-1:-1;;;;;33559:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;33559:39:0;;;;;;;;;;;;33611:80;;33637:15;;:42;;-1:-1:-1;;;33637:42:0;;-1:-1:-1;;;;;178:32:1;;;33637:42:0;;;160:51:1;33637:15:0;;;;:36;;133:18:1;;33637:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33611:80;33708:40;;;;;;-1:-1:-1;;;;;33708:40:0;;;;;;;;33476:280;;:::o;11992:312::-;12112:7;12147:12;12140:5;12132:28;;;;-1:-1:-1;;;12132:28:0;;;;;;;;:::i;:::-;-1:-1:-1;12171:9:0;12183:5;12187:1;12183;:5;:::i;40916:595::-;40982:20;41020:13;;41006:11;:27;41005:59;;41053:11;41005:59;;;41037:13;;41005:59;41099:16;;;41113:1;41099:16;;;;;;;;40982:82;;-1:-1:-1;41075:21:0;;41099:16;;;;;;;;;;;;-1:-1:-1;41099:16:0;41075:40;;41144:4;41126;41131:1;41126:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41126:23:0;;;:7;;;;;;;;;;:23;;;;41170:15;;:22;;;-1:-1:-1;;;41170:22:0;;;;:15;;;;;:20;;:22;;;;;41126:7;;41170:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41160:4;41165:1;41160:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;41160:32:0;;;:7;;;;;;;;;:32;41235:15;;41203:64;;41220:4;;41235:15;41253:12;41203:8;:64::i;:::-;41278:15;;:225;;-1:-1:-1;;;41278:225:0;;-1:-1:-1;;;;;41278:15:0;;;;:66;;:225;;41359:12;;41278:15;;41430:4;;41457;;41477:15;;41278:225;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40971:540;;40916:595;:::o;9256:455::-;-1:-1:-1;;;;;9340:21:0;;9332:67;;;;-1:-1:-1;;;9332:67:0;;21225:2:1;9332:67:0;;;21207:21:1;21264:2;21244:18;;;21237:30;21303:34;21283:18;;;21276:62;-1:-1:-1;;;21354:18:1;;;21347:31;21395:19;;9332:67:0;21023:397:1;9332:67:0;9495:105;9532:6;9495:105;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9495:18:0;;:9;:18;;;;;;;;;;;;:105;:22;:105::i;:::-;-1:-1:-1;;;;;9474:18:0;;:9;:18;;;;;;;;;;:126;9626:12;;:24;;9643:6;9626:16;:24::i;:::-;9611:12;:39;9666:37;;368:25:1;;;9692:1:0;;-1:-1:-1;;;;;9666:37:0;;;;;356:2:1;341:18;9666:37:0;;;;;;;9256:455;;:::o;404:180:1:-;463:6;516:2;504:9;495:7;491:23;487:32;484:52;;;532:1;529;522:12;484:52;-1:-1:-1;555:23:1;;404:180;-1:-1:-1;404:180:1:o;589:548::-;701:4;730:2;759;748:9;741:21;791:6;785:13;834:6;829:2;818:9;814:18;807:34;859:1;869:140;883:6;880:1;877:13;869:140;;;978:14;;;974:23;;968:30;944:17;;;963:2;940:26;933:66;898:10;;869:140;;;873:3;1058:1;1053:2;1044:6;1033:9;1029:22;1025:31;1018:42;1128:2;1121;1117:7;1112:2;1104:6;1100:15;1096:29;1085:9;1081:45;1077:54;1069:62;;;;589:548;;;;:::o;1142:131::-;-1:-1:-1;;;;;1217:31:1;;1207:42;;1197:70;;1263:1;1260;1253:12;1278:118;1364:5;1357:13;1350:21;1343:5;1340:32;1330:60;;1386:1;1383;1376:12;1401:382;1466:6;1474;1527:2;1515:9;1506:7;1502:23;1498:32;1495:52;;;1543:1;1540;1533:12;1495:52;1582:9;1569:23;1601:31;1626:5;1601:31;:::i;:::-;1651:5;-1:-1:-1;1708:2:1;1693:18;;1680:32;1721:30;1680:32;1721:30;:::i;:::-;1770:7;1760:17;;;1401:382;;;;;:::o;1788:315::-;1856:6;1864;1917:2;1905:9;1896:7;1892:23;1888:32;1885:52;;;1933:1;1930;1923:12;1885:52;1972:9;1959:23;1991:31;2016:5;1991:31;:::i;:::-;2041:5;2093:2;2078:18;;;;2065:32;;-1:-1:-1;;;1788:315:1:o;2535:247::-;2594:6;2647:2;2635:9;2626:7;2622:23;2618:32;2615:52;;;2663:1;2660;2653:12;2615:52;2702:9;2689:23;2721:31;2746:5;2721:31;:::i;2787:127::-;2848:10;2843:3;2839:20;2836:1;2829:31;2879:4;2876:1;2869:15;2903:4;2900:1;2893:15;2919:275;2990:2;2984:9;3055:2;3036:13;;-1:-1:-1;;3032:27:1;3020:40;;3090:18;3075:34;;3111:22;;;3072:62;3069:88;;;3137:18;;:::i;:::-;3173:2;3166:22;2919:275;;-1:-1:-1;2919:275:1:o;3199:183::-;3259:4;3292:18;3284:6;3281:30;3278:56;;;3314:18;;:::i;:::-;-1:-1:-1;3359:1:1;3355:14;3371:4;3351:25;;3199:183::o;3387:662::-;3441:5;3494:3;3487:4;3479:6;3475:17;3471:27;3461:55;;3512:1;3509;3502:12;3461:55;3548:6;3535:20;3574:4;3598:60;3614:43;3654:2;3614:43;:::i;:::-;3598:60;:::i;:::-;3692:15;;;3778:1;3774:10;;;;3762:23;;3758:32;;;3723:12;;;;3802:15;;;3799:35;;;3830:1;3827;3820:12;3799:35;3866:2;3858:6;3854:15;3878:142;3894:6;3889:3;3886:15;3878:142;;;3960:17;;3948:30;;3998:12;;;;3911;;3878:142;;;-1:-1:-1;4038:5:1;3387:662;-1:-1:-1;;;;;;3387:662:1:o;4054:1215::-;4172:6;4180;4233:2;4221:9;4212:7;4208:23;4204:32;4201:52;;;4249:1;4246;4239:12;4201:52;4289:9;4276:23;4318:18;4359:2;4351:6;4348:14;4345:34;;;4375:1;4372;4365:12;4345:34;4413:6;4402:9;4398:22;4388:32;;4458:7;4451:4;4447:2;4443:13;4439:27;4429:55;;4480:1;4477;4470:12;4429:55;4516:2;4503:16;4538:4;4562:60;4578:43;4618:2;4578:43;:::i;4562:60::-;4656:15;;;4738:1;4734:10;;;;4726:19;;4722:28;;;4687:12;;;;4762:19;;;4759:39;;;4794:1;4791;4784:12;4759:39;4818:11;;;;4838:217;4854:6;4849:3;4846:15;4838:217;;;4934:3;4921:17;4951:31;4976:5;4951:31;:::i;:::-;4995:18;;4871:12;;;;5033;;;;4838:217;;;5074:5;-1:-1:-1;;5117:18:1;;5104:32;;-1:-1:-1;;5148:16:1;;;5145:36;;;5177:1;5174;5167:12;5145:36;;5200:63;5255:7;5244:8;5233:9;5229:24;5200:63;:::i;:::-;5190:73;;;4054:1215;;;;;:::o;5274:456::-;5351:6;5359;5367;5420:2;5408:9;5399:7;5395:23;5391:32;5388:52;;;5436:1;5433;5426:12;5388:52;5475:9;5462:23;5494:31;5519:5;5494:31;:::i;:::-;5544:5;-1:-1:-1;5601:2:1;5586:18;;5573:32;5614:33;5573:32;5614:33;:::i;:::-;5274:456;;5666:7;;-1:-1:-1;;;5720:2:1;5705:18;;;;5692:32;;5274:456::o;6172:241::-;6228:6;6281:2;6269:9;6260:7;6256:23;6252:32;6249:52;;;6297:1;6294;6287:12;6249:52;6336:9;6323:23;6355:28;6377:5;6355:28;:::i;6642:523::-;6746:6;6754;6762;6770;6778;6786;6839:3;6827:9;6818:7;6814:23;6810:33;6807:53;;;6856:1;6853;6846:12;6807:53;-1:-1:-1;;6879:23:1;;;6949:2;6934:18;;6921:32;;-1:-1:-1;7000:2:1;6985:18;;6972:32;;7051:2;7036:18;;7023:32;;-1:-1:-1;7102:3:1;7087:19;;7074:33;;-1:-1:-1;7154:3:1;7139:19;7126:33;;-1:-1:-1;6642:523:1;-1:-1:-1;6642:523:1:o;7732:388::-;7800:6;7808;7861:2;7849:9;7840:7;7836:23;7832:32;7829:52;;;7877:1;7874;7867:12;7829:52;7916:9;7903:23;7935:31;7960:5;7935:31;:::i;:::-;7985:5;-1:-1:-1;8042:2:1;8027:18;;8014:32;8055:33;8014:32;8055:33;:::i;8125:356::-;8327:2;8309:21;;;8346:18;;;8339:30;8405:34;8400:2;8385:18;;8378:62;8472:2;8457:18;;8125:356::o;8486:127::-;8547:10;8542:3;8538:20;8535:1;8528:31;8578:4;8575:1;8568:15;8602:4;8599:1;8592:15;8618:168;8691:9;;;8722;;8739:15;;;8733:22;;8719:37;8709:71;;8760:18;;:::i;8791:380::-;8870:1;8866:12;;;;8913;;;8934:61;;8988:4;8980:6;8976:17;8966:27;;8934:61;9041:2;9033:6;9030:14;9010:18;9007:38;9004:161;;9087:10;9082:3;9078:20;9075:1;9068:31;9122:4;9119:1;9112:15;9150:4;9147:1;9140:15;9004:161;;8791:380;;;:::o;9938:127::-;9999:10;9994:3;9990:20;9987:1;9980:31;10030:4;10027:1;10020:15;10054:4;10051:1;10044:15;10357:135;10396:3;10417:17;;;10414:43;;10437:18;;:::i;:::-;-1:-1:-1;10484:1:1;10473:13;;10357:135::o;10497:251::-;10567:6;10620:2;10608:9;10599:7;10595:23;10591:32;10588:52;;;10636:1;10633;10626:12;10588:52;10668:9;10662:16;10687:31;10712:5;10687:31;:::i;10753:184::-;10823:6;10876:2;10864:9;10855:7;10851:23;10847:32;10844:52;;;10892:1;10889;10882:12;10844:52;-1:-1:-1;10915:16:1;;10753:184;-1:-1:-1;10753:184:1:o;11247:245::-;11314:6;11367:2;11355:9;11346:7;11342:23;11338:32;11335:52;;;11383:1;11380;11373:12;11335:52;11415:9;11409:16;11434:28;11456:5;11434:28;:::i;11497:306::-;11585:6;11593;11601;11654:2;11642:9;11633:7;11629:23;11625:32;11622:52;;;11670:1;11667;11660:12;11622:52;11699:9;11693:16;11683:26;;11749:2;11738:9;11734:18;11728:25;11718:35;;11793:2;11782:9;11778:18;11772:25;11762:35;;11497:306;;;;;:::o;14207:557::-;14320:6;14328;14336;14344;14352;14360;14413:3;14401:9;14392:7;14388:23;14384:33;14381:53;;;14430:1;14427;14420:12;14381:53;14462:9;14456:16;14481:31;14506:5;14481:31;:::i;:::-;14576:2;14561:18;;14555:25;14620:2;14605:18;;14599:25;14664:2;14649:18;;14643:25;14708:3;14693:19;;14687:26;14753:3;14738:19;;;14732:26;14531:5;;14555:25;;-1:-1:-1;14599:25:1;;14643;;-1:-1:-1;14687:26:1;-1:-1:-1;14732:26:1;;-1:-1:-1;14207:557:1;-1:-1:-1;;;14207:557:1:o;15588:125::-;15653:9;;;15674:10;;;15671:36;;;15687:18;;:::i;16074:217::-;16114:1;16140;16130:132;;16184:10;16179:3;16175:20;16172:1;16165:31;16219:4;16216:1;16209:15;16247:4;16244:1;16237:15;16130:132;-1:-1:-1;16276:9:1;;16074:217::o;18050:401::-;18252:2;18234:21;;;18291:2;18271:18;;;18264:30;18330:34;18325:2;18310:18;;18303:62;-1:-1:-1;;;18396:2:1;18381:18;;18374:35;18441:3;18426:19;;18050:401::o;18456:399::-;18658:2;18640:21;;;18697:2;18677:18;;;18670:30;18736:34;18731:2;18716:18;;18709:62;-1:-1:-1;;;18802:2:1;18787:18;;18780:33;18845:3;18830:19;;18456:399::o;19905:128::-;19972:9;;;19993:11;;;19990:37;;;20007:18;;:::i;20038:980::-;20300:4;20348:3;20337:9;20333:19;20379:6;20368:9;20361:25;20405:2;20443:6;20438:2;20427:9;20423:18;20416:34;20486:3;20481:2;20470:9;20466:18;20459:31;20510:6;20545;20539:13;20576:6;20568;20561:22;20614:3;20603:9;20599:19;20592:26;;20653:2;20645:6;20641:15;20627:29;;20674:1;20684:195;20698:6;20695:1;20692:13;20684:195;;;20763:13;;-1:-1:-1;;;;;20759:39:1;20747:52;;20854:15;;;;20819:12;;;;20795:1;20713:9;20684:195;;;-1:-1:-1;;;;;;;20935:32:1;;;;20930:2;20915:18;;20908:60;-1:-1:-1;;;20999:3:1;20984:19;20977:35;20896:3;20038:980;-1:-1:-1;;;20038:980:1:o

Swarm Source

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