ETH Price: $2,818.09 (+7.37%)
 

Overview

Max Total Supply

2,230,000 AM

Holders

42

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Uniswap V2: AM 6
Balance
0.000000000000620419 AM

Value
$0.00
0x9f1b42a311469ee71dc7de3f9d4906d536727dba
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:
Americium

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-24
*/

// 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) public _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);
        }
    }
}

interface ITrueDefiSwap {
    function triggeredTokenSent(uint256, address) external;
}

contract Americium is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;

    uint256 _maxSupply = 10_000_000 * (10**18);   
  
    address public uniswapV2Pair;
    address public DEAD = 0x000000000000000000000000000000000000dEaD;
    bool private swapping;
    bool private stakingEnabled = false;
    bool public tradingEnabled = false;

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

    uint256 private totalSellFees;
    uint256 private totalBuyFees;

    AmericiumDividendTracker public dividendTracker;

    address payable public marketingWallet;
    address payable public whaleWallet;
    address payable public buybackWallet;
    address public bridge;

    // Max tx, dividend threshold and tax variables
    uint256 public maxWallet;
    uint256 public swapTokensAtAmount;
    uint256 public sellRewardsFee;
    uint256 public sellMarketingFees;
    uint256 public sellLiquidityFee;
    uint256 public sellBuyBackFee;
    uint256 public buyBuyBackFee;
    uint256 public buyMarketingFees;
    uint256 public buyLiquidityFee;
    uint256 public buyRewardsFee;
    uint256 public buyWhaleFee;
    uint256 public sellWhaleFee;
    uint256 public transferFee;

    bool public swapAndLiquifyEnabled = true;

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

    // staking variables
    mapping(address => uint256) public stakingBonus;
    mapping(address => uint256) public stakingUntilDate;
    mapping(uint256 => uint256) public stakingAmounts;

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

    // Limit variables for bot protection
    bool public limitsInEffect = true; //boolean used to turn limits on and off
    uint256 private gasPriceLimit = 50 * 1 gwei; 
    mapping(address => uint256) private _holderLastTransferBlock; // for 1 tx per block
    mapping(address => uint256) private _holderLastTransferTimestamp; // for sell cooldown timer
    uint256 public launchblock;
    uint256 public cooldowntimer = 60; //default cooldown 60s

    bool public enabledPublicTrading;
    address tefiRouter;
    mapping(address => bool) public whitelistForPublicTrade;    
    
    event EnableAccountStaking(address indexed account, uint256 duration);
    event UpdateStakingAmounts(uint256 duration, uint256 amount);

    event EnableSwapAndLiquify(bool enabled);
    event EnableStaking(bool enabled);

    event SetPreSaleWallet(address wallet);
    event updateMarketingWallet(address wallet);
    event updateBuyBackWallet(address wallet);
    event updateWhaleWallet(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 sellLiquidityFee,
        uint256 sellRewardsFee,
        uint256 sellBuyBackFee,
        uint256 buyBuyBackFee,
        uint256 buyMarketingFees,
        uint256 buyLiquidityFee,
        uint256 buyRewardsFee,
        uint256 buyWhaleFee,
        uint256 sellWhaleFee
    );

    event UpdateTransferFee(uint256 transferFee);

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

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

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiqudity
    );

    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);
    event UpdateBridge(address wallet);


    modifier onlyBridge {
      require(msg.sender == bridge, "only bridge has access to this function");
      _;
    }   
    
    constructor(address _bridge) ERC20("Americium", "AM") {
        marketingWallet = payable(0x8aaEb8E7BEeedf624b8FE36b97EF98B18F9D7398);
        whaleWallet = payable(0xFC57084C7D07878Cd0D6778988d79de23463aA46);
        buybackWallet = payable(0x5fcefa20d328B17849F695cedF0b108D7e0a89b9);
        address router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        bridge = _bridge;
        
        buyMarketingFees = 2;
        sellMarketingFees = 2;
        buyBuyBackFee = 2;
        sellBuyBackFee =2;
        buyLiquidityFee = 0;
        sellLiquidityFee = 0;
        buyRewardsFee = 2;
        sellRewardsFee = 2;
        buyWhaleFee = 1;
        sellWhaleFee = 1;
        transferFee = 5;

        totalBuyFees = buyRewardsFee
            .add(buyLiquidityFee)
            .add(buyMarketingFees)
            .add(buyWhaleFee)
            .add(buyBuyBackFee);
        totalSellFees = sellRewardsFee
            .add(sellLiquidityFee)
            .add(sellMarketingFees)
            .add(sellWhaleFee)
            .add(sellBuyBackFee);

        dividendTracker = new AmericiumDividendTracker(
            payable(this),
            router,
            0x0000000000000000000000000000000000000000,
            "AmericiumTRACKER",
            "AMTRACKER"
        );

        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());
        dividendTracker.excludeFromDividends(bridge);

        // exclude from paying fees
        _isExcludedFromFees[address(this)] = true;
        _isExcludedFromFees[address(dividendTracker)] = true;
        _isExcludedFromFees[address(marketingWallet)] = true;
        _isExcludedFromFees[address(whaleWallet)] = true;
        _isExcludedFromFees[address(buybackWallet)] = true;
        _isExcludedFromFees[msg.sender] = true;
        _isExcludedFromFees[address(bridge)] = true;


        maxWallet = 1_000_000 * (10**18);
        swapTokensAtAmount = 100_000 * (10**18);
        canTransferBeforeTradingIsEnabled[owner()] = true;
        canTransferBeforeTradingIsEnabled[address(this)] = true;
        whitelistForPublicTrade[msg.sender] = true;   
    }

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

    receive() external payable {}

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal override virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        require(_maxSupply >= _totalSupply + amount, "Mint error! Amount can't be more than the total supply on BSC!");

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

    function mint(address recipient, uint256 amount) public virtual onlyBridge {
        _mint(recipient, amount);
    }

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

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

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

    function burn(uint256 amount) public virtual onlyBridge {
        _burn(_msgSender(), amount);
    }    
    
    function updateMaxSupply(uint256 amount) public onlyOwner {
        require(_maxSupply <= 10_000_000 * (10**18));
        _maxSupply = amount;
    }
    
    function updateBridge(address wallet) public onlyOwner {
        bridge = wallet;
        emit UpdateBridge(wallet);
    }    
    
    function updateStakingAmounts(uint256 duration, uint256 bonus)
        public
        onlyOwner
    {
        require(stakingAmounts[duration] != bonus);
        require(bonus <= 100, "Staking bonus can't exceed 100");
        stakingAmounts[duration] = bonus;
        emit UpdateStakingAmounts(duration, bonus);
    }

    function isTrading(address _sender, address _recipient)
        internal view
        returns (uint)
    {
        if (automatedMarketMakerPairs[_sender] && _recipient != address(uniswapV2Router)) return 1; // Buy Case

        if (automatedMarketMakerPairs[_recipient]) return 2; // Sell Case

        return 0;
    }    
    
    function setWhitelistForPublicTrade(address _addr, bool _flag) external onlyOwner {
        whitelistForPublicTrade[_addr] = _flag;    
    }    
    
    function setPublicTrading() external onlyOwner {
        require(!enabledPublicTrading);        
        enabledPublicTrading = true;    
    }    
    
    function setTrueDefiRouter(address _router) external onlyOwner {
        tefiRouter = _router;
        if (_router != address(0)) {
            whitelistForPublicTrade[_router] = true;
            _isExcludedFromFees[_router] = true;
            dividendTracker.excludeFromDividends(_router);
        }
        launchblock = block.number;
        tradingEnabled = true;
        emit TradingEnabled();    
    }
    
    function updateTrueDefiRouter(address _router) external onlyOwner {
        tefiRouter = _router;
        if (_router != address(0)) {
            whitelistForPublicTrade[_router] = true;
            _isExcludedFromFees[_router] = true;
            dividendTracker.excludeFromDividends(_router);
        }
    }
    
    // use for pre sale wallet, adds all exclusions to it
    function setPresaleWallet(address wallet) external onlyOwner {
        canTransferBeforeTradingIsEnabled[wallet] = true;
        _isExcludedFromFees[wallet] = true;
        dividendTracker.excludeFromDividends(wallet);
        emit SetPreSaleWallet(wallet);
    }
    
    // set new marketing wallet
    function setMarketingWallet(address wallet) external onlyOwner {
        _isExcludedFromFees[wallet] = true;
        marketingWallet = payable(wallet);
        emit updateMarketingWallet(wallet);
    }    
    
    //set new buyback wallet
    function setBuyBackWallet(address wallet) external onlyOwner {
        _isExcludedFromFees[wallet] = true;
        buybackWallet = payable(wallet);
        emit updateBuyBackWallet(wallet);
    }            
    
    // set new whale wallet
    function setWhaleWallet(address wallet) external onlyOwner {
        _isExcludedFromFees[wallet] = true;
        whaleWallet = payable(wallet);
        emit updateWhaleWallet(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, getStakingBalance(account));
    }

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

    // turn limits on and off
    function setLimitsInEffect(bool value) external onlyOwner {
        limitsInEffect = value;
    }

    // set max GWEI
    function setGasPriceLimit(uint256 GWEI) external onlyOwner {
        require(GWEI >= 5, "can never be set below 5");
        gasPriceLimit = GWEI * 1 gwei;
    }

    // set cooldown timer, can only be between 0 and 300 seconds (5 mins max)
    function setcooldowntimer(uint256 value) external onlyOwner {
        require(value <= 300, "cooldown timer cannot exceed 5 minutes");
        cooldowntimer = value;
    }

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

    function enableStaking(bool enable) public onlyOwner {
        require(stakingEnabled != enable);
        stakingEnabled = enable;
        emit EnableStaking(enable);
    }

    function stake(uint256 duration) public {
        require(stakingEnabled, "Staking is not enabled");
        require(stakingAmounts[duration] != 0, "Invalid staking duration");
        require(
            stakingUntilDate[_msgSender()] < block.timestamp.add(duration),
            "already staked for a longer duration"
        );
        stakingBonus[_msgSender()] = stakingAmounts[duration];
        stakingUntilDate[_msgSender()] = block.timestamp.add(duration);
        dividendTracker.setBalance(
            _msgSender(),
            getStakingBalance(_msgSender())
        );
        emit EnableAccountStaking(_msgSender(), duration);
    }

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

    function enableSwapAndLiquify(bool enabled) public onlyOwner {
        require(swapAndLiquifyEnabled != enabled);
        swapAndLiquifyEnabled = enabled;
        emit EnableSwapAndLiquify(enabled);
    }

    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 updateTransferFee(uint256 newTransferFee) public onlyOwner {
        require (newTransferFee <= 5, "transfer fee cannot exceed 5%");
        transferFee = newTransferFee;
        emit UpdateTransferFee(transferFee);
    }

    function updateFees(
        uint256 marketingBuy,
        uint256 marketingSell,
        uint256 buybackBuy,
        uint256 buybackSell,
        uint256 liquidityBuy,
        uint256 liquiditySell,
        uint256 RewardsBuy,
        uint256 RewardsSell,
        uint256 whaleBuy,
        uint256 whaleSell
    ) public onlyOwner {
        buyMarketingFees = marketingBuy;
        buyLiquidityFee = liquidityBuy;
        buyRewardsFee = RewardsBuy;
        buyBuyBackFee = buybackBuy;
        sellBuyBackFee = buybackSell;
        sellMarketingFees = marketingSell;
        sellLiquidityFee = liquiditySell;
        sellRewardsFee = RewardsSell;
        buyWhaleFee = whaleBuy;
        sellWhaleFee = whaleSell;

        totalSellFees = sellRewardsFee
            .add(sellLiquidityFee)
            .add(sellMarketingFees)
            .add(sellWhaleFee)
            .add(sellBuyBackFee);

        totalBuyFees = buyRewardsFee
            .add(buyLiquidityFee)
            .add(buyMarketingFees)
            .add(buyWhaleFee)
            .add(buyBuyBackFee);

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

        emit UpdateFees(
            sellMarketingFees,
            sellLiquidityFee,
            sellRewardsFee,
            sellBuyBackFee,
            buyBuyBackFee,
            buyMarketingFees,
            buyLiquidityFee,
            buyRewardsFee,
            buyWhaleFee,
            sellWhaleFee
        );
    }

    function getStakingInfo(address account)
        external
        view
        returns (uint256, uint256)
    {
        return (stakingUntilDate[account], stakingBonus[account]);
    }

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

    function getMaxSupply() external view returns (uint256) {
        return _maxSupply;
    }    

    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");
        require(to != address(DEAD), "Sorry Ser NO Burning!");
        uint256 RewardsFee;
        uint256 buybackFee;
        uint256 marketingFees;
        uint256 liquidityFee;
        uint256 whaleFees;

        if (!canTransferBeforeTradingIsEnabled[from]) {
            require(tradingEnabled, "Trading has not yet been enabled");
        }
        
        if (enabledPublicTrading == false && tefiRouter != address(0)) {
            require(isTrading(from, to) == 0 || whitelistForPublicTrade[from] || whitelistForPublicTrade[to], "!available trading");
        }        
        
        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }            
        
        else if (
            !swapping && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]
        ) {
            bool isSelling = automatedMarketMakerPairs[to];
            bool isBuying = automatedMarketMakerPairs[from];

            if (!isBuying && !isSelling) {
                uint256 tFees = amount.mul(transferFee).div(100);
                amount = amount.sub(tFees);
                super._transfer(from, address(this), tFees);
                super._transfer(from, to, amount);
                dividendTracker.setBalance(from, getStakingBalance(from));
                dividendTracker.setBalance(to, getStakingBalance(to));
                return;
            }
            
            else if (!isBuying && stakingEnabled) {
                require(
                    stakingUntilDate[from] <= block.timestamp,
                    "Tokens are staked and locked!"
                );
                if (stakingUntilDate[from] != 0) {
                    stakingUntilDate[from] = 0;
                    stakingBonus[from] = 0;
                }
            }

            else if (isSelling) {
                RewardsFee = sellRewardsFee;
                buybackFee = sellBuyBackFee;
                marketingFees = sellMarketingFees;
                liquidityFee = sellLiquidityFee;
                whaleFees = sellWhaleFee;

                if (limitsInEffect) {
                require(block.timestamp >= _holderLastTransferTimestamp[tx.origin] + cooldowntimer,
                        "cooldown period active");
                _holderLastTransferTimestamp[tx.origin] = block.timestamp;

                }

            } else if (isBuying) {
                RewardsFee = buyRewardsFee;
                buybackFee = buyBuyBackFee;
                marketingFees = buyMarketingFees;
                liquidityFee = buyLiquidityFee;
                whaleFees = buyWhaleFee;

                if (limitsInEffect) {
                require(block.number > launchblock + 2,"you shall not pass");
                require(tx.gasprice <= gasPriceLimit,"Gas price exceeds limit.");
                require(_holderLastTransferBlock[tx.origin] != block.number,"Too many TX in block");
                _holderLastTransferBlock[tx.origin] = block.number;
            }
            
            uint256 contractBalanceRecipient = balanceOf(to);
            require(contractBalanceRecipient + amount <= maxWallet,
                    "Exceeds maximum wallet token amount." );
            }

            uint256 totalFees = RewardsFee
                .add(liquidityFee + marketingFees + whaleFees + buybackFee);

            uint256 contractTokenBalance = balanceOf(address(this));

            bool canSwap = contractTokenBalance >= swapTokensAtAmount;

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

                if (swapAndLiquifyEnabled && liquidityFee > 0 && totalBuyFees > 0) {
                    uint256 totalBuySell = buyAmount.add(sellAmount);
                    uint256 swapAmountBought = contractTokenBalance
                        .mul(buyAmount)
                        .div(totalBuySell);
                    uint256 swapAmountSold = contractTokenBalance
                        .mul(sellAmount)
                        .div(totalBuySell);

                    uint256 swapBuyTokens = swapAmountBought
                        .mul(liquidityFee)
                        .div(totalBuyFees);

                    uint256 swapSellTokens = swapAmountSold
                        .mul(liquidityFee)
                        .div(totalSellFees);

                    uint256 swapTokens = swapSellTokens.add(swapBuyTokens);

                    swapAndLiquify(swapTokens);
                }

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

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

            amount = amount.sub(fees);

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

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

            uint256 gas = gasForProcessing;

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

        super._transfer(from, to, amount);
        dividendTracker.setBalance(from, getStakingBalance(from));
        dividendTracker.setBalance(to, getStakingBalance(to));
    
        if (from != address(uniswapV2Router) && !automatedMarketMakerPairs[from] && to == tefiRouter) {
            ITrueDefiSwap(tefiRouter).triggeredTokenSent(amount, from);
        }    
    }

    function getStakingBalance(address account) private view returns (uint256) {
        return
            stakingEnabled
                ? balanceOf(account).mul(stakingBonus[account].add(100)).div(
                    100
                )
                : balanceOf(account);
    }

    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens.div(2);
        uint256 otherHalf = tokens.sub(half);
        uint256 initialBalance = address(this).balance;
        swapTokensForEth(half); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered
        uint256 newBalance = address(this).balance.sub(initialBalance);
        addLiquidity(otherHalf, newBalance);
        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForEth(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            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 setMinimumTokenBalanceForAutoDividends(uint256 value)
        public
        onlyOwner
    {
        dividendTracker.setMinimumTokenBalanceForAutoDividends(value);
    }

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

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }

    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;
        bool successOp3 = true;

        uint256 dividends;
        uint256 dividendsFromBuy;
        uint256 dividendsFromSell;

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

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

        uint256 feePortions;
        if (_completeFees > 0) {
            feePortions = address(this).balance.div(_completeFees);
        }
        uint256 marketingPayout = buyMarketingFees.add(sellMarketingFees) * feePortions;
        uint256 whalePayout = buyWhaleFee.add(sellWhaleFee) * feePortions;
        uint256 buybackPayout = buyBuyBackFee.add(sellBuyBackFee) * feePortions;
        
        if (marketingPayout > 0) {
            (successOp1, ) = address(marketingWallet).call{value: marketingPayout}("");
        }
        if (whalePayout > 0) {
            (successOp2, ) = address(whaleWallet).call{value: whalePayout}("");
        }
        if (buybackPayout > 0) {
            (successOp3, ) = address(buybackWallet).call{value: buybackPayout}("");
        }
        
        emit SendDividends(
            dividends,
            marketingPayout + whalePayout + buybackPayout,
            success && successOp1 && successOp2 && successOp3
        );
    }

    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 AmericiumDividendTracker 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; // BUSD
    bool public allowCustomTokens;
    bool public allowAutoReinvest;
    bool public dividendsPaused = false;

    string private trackerName;
    string private trackerTicker;

    IUniswapV2Router02 public uniswapV2Router;

    Americium public AmericiumContract;

    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;
        AmericiumContract = Americium(mainContract);
        minimumTokenBalanceForAutoDividends = 100_000000000000000000; // 100 tokens
        minimumTokenBalanceForDividends = minimumTokenBalanceForAutoDividends;

        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, "Americium_Dividend_Tracker: No transfers allowed");
    }

    function withdrawDividend() public pure override {
        require(
            false,
            "Americium_Dividend_Tracker: withdrawDividend disabled. Use the 'claim' function on the main Americium 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 updateUniswapV2Router(address newAddress) public onlyOwner {
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

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

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

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

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

            // make the swap
            try
                uniswapV2Router
                    .swapExactETHForTokensSupportingFeeOnTransferTokens{
                    value: _withdrawableDividend
                }(
                    0, // accept any amount of Tokens
                    path,
                    address(this),
                    block.timestamp
                )
            {
                uint256 received = AmericiumContract
                    .balanceOf(address(this))
                    .sub(prevBalance);
                if (received > 0) {
                    success = true;
                    AmericiumContract.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":[{"internalType":"address","name":"_bridge","type":"address"}],"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":"uint256","name":"duration","type":"uint256"}],"name":"EnableAccountStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableSwapAndLiquify","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":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"SetPreSaleWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","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":false,"internalType":"address","name":"wallet","type":"address"}],"name":"UpdateBridge","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":"sellLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellBuyBackFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyBuyBackFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyMarketingFees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyLiquidityFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyRewardsFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyWhaleFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sellWhaleFee","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":false,"internalType":"uint256","name":"duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UpdateStakingAmounts","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"transferFee","type":"uint256"}],"name":"UpdateTransferFee","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":"updateBuyBackWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"updateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"updateWhaleWallet","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"bridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBuyBackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","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":[],"name":"buyWhaleFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldowntimer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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 AmericiumDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"enableStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableSwapAndLiquify","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enabledPublicTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"getMaxSupply","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":[{"internalType":"address","name":"account","type":"address"}],"name":"getStakingInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"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":"launchblock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","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":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"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":"sellBuyBackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","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":[],"name":"sellWhaleFee","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"}],"name":"setBuyBackWallet","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":"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":"uint256","name":"GWEI","type":"uint256"}],"name":"setGasPriceLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"setIncludeDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setLimitsInEffect","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":"address","name":"wallet","type":"address"}],"name":"setPresaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicTrading","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":"address","name":"_router","type":"address"}],"name":"setTrueDefiRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"setWhaleWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_flag","type":"bool"}],"name":"setWhitelistForPublicTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setcooldowntimer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setmaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingUntilDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":[],"name":"transferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"address","name":"wallet","type":"address"}],"name":"updateBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"marketingBuy","type":"uint256"},{"internalType":"uint256","name":"marketingSell","type":"uint256"},{"internalType":"uint256","name":"buybackBuy","type":"uint256"},{"internalType":"uint256","name":"buybackSell","type":"uint256"},{"internalType":"uint256","name":"liquidityBuy","type":"uint256"},{"internalType":"uint256","name":"liquiditySell","type":"uint256"},{"internalType":"uint256","name":"RewardsBuy","type":"uint256"},{"internalType":"uint256","name":"RewardsSell","type":"uint256"},{"internalType":"uint256","name":"whaleBuy","type":"uint256"},{"internalType":"uint256","name":"whaleSell","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":"uint256","name":"amount","type":"uint256"}],"name":"updateMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"updatePayoutToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"bonus","type":"uint256"}],"name":"updateStakingAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTransferFee","type":"uint256"}],"name":"updateTransferFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"updateTrueDefiRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whaleWallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistForPublicTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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"}]

60806040526a084595161401484a00000060075560098054600162ffff0160a01b03191661dead1790556001600a819055600b8190556020805460ff199081168317909155620493e0602155602880549091169091179055640ba43b7400602955603c602d553480156200007257600080fd5b50604051620092e8380380620092e8833981016040819052620000959162000a98565b60405180604001604052806009815260200168416d6572696369756d60b81b81525060405180604001604052806002815260200161414d60f01b8152508160039081620000e3919062000b68565b506004620000f2828262000b68565b5050506000620001076200094b60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600f8054738aaeb8e7beeedf624b8fe36b97ef98b18f9d73986001600160a01b0319918216179091556010805473fc57084c7d07878cd0d6778988d79de23463aa4690831617905560118054735fcefa20d328b17849f695cedf0b108d7e0a89b9908316179055601280549091166001600160a01b0383161790556002601a8190556016819055601981905560188190556000601b8190556017819055601c82905560158290556001601d819055601e8190556005601f55737a250d5630b4cf539739df2c5dacb4c659f2488d926200025d929091620002499182908490829082906200094f602090811b620033c417901c565b6200094f60201b620033c41790919060201c565b600d819055506200029660185462000249601e5462000249601654620002496017546015546200094f60201b620033c41790919060201c565b600c8190555030816000604051620002ae9062000a8a565b6001600160a01b0393841681529183166020830152909116604082015260a0606082018190526010908201526f20b6b2b934b1b4bab6aa2920a1a5a2a960811b60c082015260e0608082018190526009908201526820a6aa2920a1a5a2a960b91b61010082015261012001604051809103906000f08015801562000336573d6000803e3d6000fd5b50600e80546001600160a01b039283166001600160a01b0319918216179091556006805492841692909116821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620003a1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c7919062000a98565b6001600160a01b031663c9c6539630600660009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200042a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000450919062000a98565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200049e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004c4919062000a98565b600880546001600160a01b0319166001600160a01b03929092169182179055620004f0906001620009be565b600e5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b1580156200053757600080fd5b505af11580156200054c573d6000803e3d6000fd5b5050600e5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200059657600080fd5b505af1158015620005ab573d6000803e3d6000fd5b5050600e5460095460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b158015620005f957600080fd5b505af11580156200060e573d6000803e3d6000fd5b5050600e54604051634e7b827f60e01b8152600060048201526001600160a01b039091169250634e7b827f9150602401602060405180830381865afa1580156200065c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000682919062000c34565b50600e5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b158015620006cb57600080fd5b505af1158015620006e0573d6000803e3d6000fd5b5050600e54600f5460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200072e57600080fd5b505af115801562000743573d6000803e3d6000fd5b5050600e546001600160a01b031691506331e79db090506200076d6005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620007af57600080fd5b505af1158015620007c4573d6000803e3d6000fd5b5050600e5460125460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b1580156200081257600080fd5b505af115801562000827573d6000803e3d6000fd5b5050306000908152602260205260408082208054600160ff199182168117909255600e546001600160a01b0390811685528385208054831684179055600f5481168552838520805483168417905560105481168552838520805483168417905560115481168552838520805483168417905533855283852080548316841790556012541684529183208054909216811790915569d3c21bcecceda100000060135569152d02c7e14af6800000601455925060279150620008ef6005546001600160a01b031690565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff1995861617905530815260278352818120805485166001908117909155338252602f9093522080549092161790555062000c7a9050565b3390565b6000806200095e838562000c58565b905083811015620009b55760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640160405180910390fd5b90505b92915050565b6001600160a01b0382166000908152602360205260409020805460ff1916821580159190911790915562000a4e57600e5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801562000a3457600080fd5b505af115801562000a49573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6130e7806200620183390190565b60006020828403121562000aab57600080fd5b81516001600160a01b0381168114620009b557600080fd5b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000aee57607f821691505b60208210810362000b0f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000b6357600081815260208120601f850160051c8101602086101562000b3e5750805b601f850160051c820191505b8181101562000b5f5782815560010162000b4a565b5050505b505050565b81516001600160401b0381111562000b845762000b8462000ac3565b62000b9c8162000b95845462000ad9565b8462000b15565b602080601f83116001811462000bd4576000841562000bbb5750858301515b600019600386901b1c1916600185901b17855562000b5f565b600085815260208120601f198616915b8281101562000c055788860151825594840194600190910190840162000be4565b508582101562000c245787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000c4757600080fd5b81518015158114620009b557600080fd5b80820180821115620009b857634e487b7160e01b600052601160045260246000fd5b6155778062000c8a6000396000f3fe60806040526004361061061a5760003560e01c806377a3b60911610329578063b62496f5116101b6578063e7841ec011610102578063f2fde38b116100a0578063f63743421161007a578063f6374342146112e8578063f8b45b05146112fe578063fc6b151c14611314578063fe66962e1461133457600080fd5b8063f2fde38b14611288578063f39409e9146112a8578063f5d3c79a146112c857600080fd5b8063f11a24d3116100dc578063f11a24d31461120f578063f1c0ddff14611225578063f26ce61614611252578063f27fd2541461126857600080fd5b8063e7841ec0146111ba578063e78cea92146111cf578063f103b433146111ef57600080fd5b8063d7b837dd1161016f578063dd62ed3e11610149578063dd62ed3e1461111e578063deab8aea14611164578063e2f4560514611184578063e6d7dc371461119a57600080fd5b8063d7b837dd146110c9578063d8032ed3146110de578063d90d7186146110fe57600080fd5b8063b62496f514611003578063b74e3b1114611033578063ba079d4914611053578063bb8d513114611073578063d07a091c14611089578063d5e37251146110a957600080fd5b80639c3372ea11610275578063a8b9d2401161022e578063aa4704f311610208578063aa4704f314610f28578063acb2ad6f14610f80578063ad56c13c14610f96578063b494298814610fed57600080fd5b8063a8b9d24014610ec8578063a9059cbb14610ee8578063a9885de514610f0857600080fd5b80639c3372ea14610e085780639cefc1da14610e285780639ec1037e14610e48578063a457c2d714610e68578063a4640b8214610e88578063a694fc3a14610ea857600080fd5b8063868730c7116102e257806395451c29116102bc57806395451c2914610da757806395d89b4114610dbd5780639a7a23d614610dd25780639c1b8af514610df257600080fd5b8063868730c714610d49578063871c128d14610d695780638da5cb5b14610d8957600080fd5b806377a3b60914610c8c5780637928dd1d14610ca25780637d32f34214610cbc5780637fdde05c14610ce9578063837ae2d014610d095780638577a6d514610d2957600080fd5b806342966c68116104a75780635eee4bae116103f35780636ebcf607116103ac578063715018a611610386578063715018a614610c1757806372d8edf414610c2c57806375829def14610c4c57806375f0a87414610c6c57600080fd5b80636ebcf60714610baa578063700bb19114610bd757806370a0823114610bf757600080fd5b80635eee4bae14610af557806364b0f65314610b15578063679ca6e914610b2a5780636843cd8414610b4a5780636d48467b14610b6a5780636eb3821214610b8a57600080fd5b80634c0f38c2116104605780635124f8741161043a5780635124f87414610a7f5780635a84c5eb14610a955780635d098b3814610ab55780635ebf4db914610ad557600080fd5b80634c0f38c214610a1c5780634e71d92d14610a315780634fbee19314610a4657600080fd5b806342966c681461095a578063435c89e41461097a57806349bd5a5e146109a75780634a62bb65146109c75780634a74bb02146109e15780634ada218b146109fb57600080fd5b806321cbb02411610566578063313ce5671161051f5780633f407b84116104f95780633f407b84146108e457806340c10f19146108fa57806340ffdd801461091a57806341088e2b1461093a57600080fd5b8063313ce567146108885780633599bb17146108a457806339509351146108c457600080fd5b806321cbb024146107ce5780632307b441146107fe57806323b872dd1461081e57806325cd35981461083e5780632c1f52161461085357806330bb4cff1461087357600080fd5b80630ef35b7e116105d35780631a221dbb116105ad5780631a221dbb146107765780631d7b1fb41461078c5780631fa70531146107a25780631fe70a98146107b857600080fd5b80630ef35b7e146107175780631694505e1461073757806318160ddd1461075757600080fd5b806303fd2a451461062657806305ca5f081461066357806306fdde031461068557806308dfe8a5146106a757806309231602146106c7578063095ea7b3146106e757600080fd5b3661062157005b600080fd5b34801561063257600080fd5b50600954610646906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561066f57600080fd5b5061068361067e366004614ded565b61134a565b005b34801561069157600080fd5b5061069a61141b565b60405161065a9190614e06565b3480156106b357600080fd5b506106836106c2366004614e77565b6114ad565b3480156106d357600080fd5b506106836106e2366004614ded565b611536565b3480156106f357600080fd5b50610707610702366004614eb0565b6115c5565b604051901515815260200161065a565b34801561072357600080fd5b50610683610732366004614edc565b6115dc565b34801561074357600080fd5b50600654610646906001600160a01b031681565b34801561076357600080fd5b506002545b60405190815260200161065a565b34801561078257600080fd5b5061076860185481565b34801561079857600080fd5b50610768602d5481565b3480156107ae57600080fd5b50610768600b5481565b3480156107c457600080fd5b5061076860195481565b3480156107da57600080fd5b506107076107e9366004614efe565b602f6020526000908152604090205460ff1681565b34801561080a57600080fd5b50610683610819366004614ff1565b6116c1565b34801561082a57600080fd5b506107076108393660046150b3565b611892565b34801561084a57600080fd5b506106466118fb565b34801561085f57600080fd5b50600e54610646906001600160a01b031681565b34801561087f57600080fd5b5061076861196e565b34801561089457600080fd5b506040516012815260200161065a565b3480156108b057600080fd5b506106836108bf3660046150f4565b6119dc565b3480156108d057600080fd5b506107076108df366004614eb0565b611a69565b3480156108f057600080fd5b50610768600a5481565b34801561090657600080fd5b50610683610915366004614eb0565b611a9f565b34801561092657600080fd5b506106836109353660046150f4565b611ad7565b34801561094657600080fd5b50610683610955366004614efe565b611b32565b34801561096657600080fd5b50610683610975366004614ded565b611bf1565b34801561098657600080fd5b50610768610995366004614ded565b60266020526000908152604090205481565b3480156109b357600080fd5b50600854610646906001600160a01b031681565b3480156109d357600080fd5b506028546107079060ff1681565b3480156109ed57600080fd5b506020546107079060ff1681565b348015610a0757600080fd5b5060095461070790600160b01b900460ff1681565b348015610a2857600080fd5b50600754610768565b348015610a3d57600080fd5b50610683611c25565b348015610a5257600080fd5b50610707610a61366004614efe565b6001600160a01b031660009081526022602052604090205460ff1690565b348015610a8b57600080fd5b50610768601a5481565b348015610aa157600080fd5b50610683610ab0366004614ded565b611c9a565b348015610ac157600080fd5b50610683610ad0366004614efe565b611cf5565b348015610ae157600080fd5b50610683610af0366004614ded565b611d8c565b348015610b0157600080fd5b50610683610b10366004614ded565b611de7565b348015610b2157600080fd5b50610768611e29565b348015610b3657600080fd5b50610683610b453660046150f4565b611e73565b348015610b5657600080fd5b50610768610b65366004614efe565b611eb0565b348015610b7657600080fd5b50610707610b85366004614efe565b611f20565b348015610b9657600080fd5b50610683610ba5366004614efe565b611f90565b348015610bb657600080fd5b50610768610bc5366004614efe565b60006020819052908152604090205481565b348015610be357600080fd5b50610683610bf2366004614ded565b612008565b348015610c0357600080fd5b50610768610c12366004614efe565b6120da565b348015610c2357600080fd5b506106836120f5565b348015610c3857600080fd5b50610683610c47366004614efe565b612169565b348015610c5857600080fd5b50610683610c67366004614efe565b6121c5565b348015610c7857600080fd5b50600f54610646906001600160a01b031681565b348015610c9857600080fd5b50610768601c5481565b348015610cae57600080fd5b50602e546107079060ff1681565b348015610cc857600080fd5b50610768610cd7366004614efe565b60256020526000908152604090205481565b348015610cf557600080fd5b50610683610d04366004614e77565b61227a565b348015610d1557600080fd5b50610683610d24366004615111565b6122cf565b348015610d3557600080fd5b50610683610d44366004614ded565b612481565b348015610d5557600080fd5b50610683610d643660046150f4565b612531565b348015610d7557600080fd5b50610683610d84366004614ded565b612569565b348015610d9557600080fd5b506005546001600160a01b0316610646565b348015610db357600080fd5b5061076860165481565b348015610dc957600080fd5b5061069a6125e5565b348015610dde57600080fd5b50610683610ded366004614e77565b6125f4565b348015610dfe57600080fd5b5061076860215481565b348015610e1457600080fd5b50610683610e233660046150f4565b612628565b348015610e3457600080fd5b50610683610e433660046150f4565b612684565b348015610e5457600080fd5b50610683610e63366004614efe565b61271a565b348015610e7457600080fd5b50610707610e83366004614eb0565b6127f1565b348015610e9457600080fd5b50610683610ea3366004614efe565b612840565b348015610eb457600080fd5b50610683610ec3366004614ded565b6128d0565b348015610ed457600080fd5b50610768610ee3366004614efe565b612af3565b348015610ef457600080fd5b50610707610f03366004614eb0565b612b26565b348015610f1457600080fd5b50610683610f23366004614e77565b612b33565b348015610f3457600080fd5b50610f6b610f43366004614efe565b6001600160a01b03166000908152602560209081526040808320546024909252909120549091565b6040805192835260208301919091520161065a565b348015610f8c57600080fd5b50610768601f5481565b348015610fa257600080fd5b50610fb6610fb1366004614efe565b612b88565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161065a565b348015610ff957600080fd5b50610768602c5481565b34801561100f57600080fd5b5061070761101e366004614efe565b60236020526000908152604090205460ff1681565b34801561103f57600080fd5b5061068361104e366004614ded565b612c18565b34801561105f57600080fd5b5061070761106e366004614efe565b612ca8565b34801561107f57600080fd5b5061076860155481565b34801561109557600080fd5b506106836110a4366004614efe565b612cdb565b3480156110b557600080fd5b506106836110c43660046150f4565b612dd3565b3480156110d557600080fd5b50610683612e52565b3480156110ea57600080fd5b506106836110f9366004614efe565b612e9b565b34801561110a57600080fd5b50601054610646906001600160a01b031681565b34801561112a57600080fd5b50610768611139366004615179565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561117057600080fd5b50601154610646906001600160a01b031681565b34801561119057600080fd5b5061076860145481565b3480156111a657600080fd5b506106836111b5366004614efe565b612f5e565b3480156111c657600080fd5b50610768612fee565b3480156111db57600080fd5b50601254610646906001600160a01b031681565b3480156111fb57600080fd5b5061068361120a366004614ded565b613038565b34801561121b57600080fd5b50610768601b5481565b34801561123157600080fd5b50610768611240366004614efe565b60246020526000908152604090205481565b34801561125e57600080fd5b50610768601d5481565b34801561127457600080fd5b50610fb6611283366004614ded565b613081565b34801561129457600080fd5b506106836112a3366004614efe565b6130bf565b3480156112b457600080fd5b506106836112c3366004614efe565b6131aa565b3480156112d457600080fd5b506106836112e33660046150f4565b6132d7565b3480156112f457600080fd5b5061076860175481565b34801561130a57600080fd5b5061076860135481565b34801561132057600080fd5b5061068361132f366004614ded565b61330f565b34801561134057600080fd5b50610768601e5481565b6005546001600160a01b0316331461137d5760405162461bcd60e51b8152600401611374906151a7565b60405180910390fd5b61138f81670de0b6b3a76400006151f2565b905060006113aa600a54600b546133c490919063ffffffff16565b905060006113cd826113c7600b548661342a90919063ffffffff16565b906134ac565b905060006113ea836113c7600a548761342a90919063ffffffff16565b90506113f5846134ee565b600b5461140290836138b8565b600b55600a5461141290826138b8565b600a5550505050565b60606003805461142a90615209565b80601f016020809104026020016040519081016040528092919081815260200182805461145690615209565b80156114a35780601f10611478576101008083540402835291602001916114a3565b820191906000526020600020905b81548152906001019060200180831161148657829003601f168201915b5050505050905090565b6005546001600160a01b031633146114d75760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146115605760405162461bcd60e51b8152600401611374906151a7565b60058110156115b15760405162461bcd60e51b815260206004820152601860248201527f63616e206e65766572206265207365742062656c6f77203500000000000000006044820152606401611374565b6115bf81633b9aca006151f2565b60295550565b60006115d23384846138fa565b5060015b92915050565b6005546001600160a01b031633146116065760405162461bcd60e51b8152600401611374906151a7565b60008281526026602052604090205481900361162157600080fd5b60648111156116725760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720626f6e75732063616e2774206578636565642031303000006044820152606401611374565b60008281526026602090815260409182902083905581518481529081018390527f065c0eec5c5d031ee25323575d53db5536226ab058b74d8bdb03c517dd4f605d910160405180910390a15050565b6005546001600160a01b031633146116eb5760405162461bcd60e51b8152600401611374906151a7565b805182511461173c5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401611374565b60c8825111156117995760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401611374565b60005b825181101561188d5760008382815181106117b9576117b9615243565b6020026020010151905060008383815181106117d7576117d7615243565b6020026020010151670de0b6b3a76400006117f291906151f2565b90506117ff338383613a1f565b600e546001600160a01b031663e30443bc8361181a816120da565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561186057600080fd5b505af1158015611874573d6000803e3d6000fd5b505050505050808061188590615259565b91505061179c565b505050565b600061189f848484613b28565b6118f184336118ec856040518060600160405280602881526020016154f5602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190614695565b6138fa565b5060019392505050565b600e54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa158015611945573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119699190615272565b905090565b600e54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa1580156119b8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611969919061528f565b6005546001600160a01b03163314611a065760405162461bcd60e51b8152600401611374906151a7565b600e54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b158015611a4e57600080fd5b505af1158015611a62573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916115d29185906118ec90866133c4565b6012546001600160a01b03163314611ac95760405162461bcd60e51b8152600401611374906152a8565b611ad382826146cf565b5050565b6005546001600160a01b03163314611b015760405162461bcd60e51b8152600401611374906151a7565b600e546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd8090602401611a34565b6005546001600160a01b03163314611b5c5760405162461bcd60e51b8152600401611374906151a7565b602e8054610100600160a81b0319166101006001600160a01b0384169081029190911790915515611bee576001600160a01b038181166000818152602f602090815260408083208054600160ff19918216811790925560229093529281902080549092169092179055600e54905163031e79db60e41b81526004810192909252909116906331e79db090602401611a34565b50565b6012546001600160a01b03163314611c1b5760405162461bcd60e51b8152600401611374906152a8565b611bee3382614833565b600e5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bee91906152ef565b6005546001600160a01b03163314611cc45760405162461bcd60e51b8152600401611374906151a7565b600e54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb90602401611a34565b6005546001600160a01b03163314611d1f5760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b038116600081815260226020908152604091829020805460ff19166001179055600f80546001600160a01b0319168417905590519182527faacebbe32c0dbd14817cfb53e3cc8be68c7e133928317145be50a0d86c22443391015b60405180910390a150565b6005546001600160a01b03163314611db65760405162461bcd60e51b8152600401611374906151a7565b600e54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db990602401611a34565b6005546001600160a01b03163314611e115760405162461bcd60e51b8152600401611374906151a7565b611e2381670de0b6b3a76400006151f2565b60145550565b600e54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa1580156119b8573d6000803e3d6000fd5b6005546001600160a01b03163314611e9d5760405162461bcd60e51b8152600401611374906151a7565b6028805460ff1916911515919091179055565b600e546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611efc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d6919061528f565b600e54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa158015611f6c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d691906152ef565b6005546001600160a01b03163314611fba5760405162461bcd60e51b8152600401611374906151a7565b601280546001600160a01b0319166001600160a01b0383169081179091556040519081527ff7e059f82bd20d2e2af76029a2174fc736dbbdb71beefa4f382ae40dea52a96d90602001611d81565b600e546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af115801561205b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207f919061530c565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461211f5760405162461bcd60e51b8152600401611374906151a7565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146121935760405162461bcd60e51b8152600401611374906151a7565b600e5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401611a34565b6005546001600160a01b031633146121ef5760405162461bcd60e51b8152600401611374906151a7565b600e5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b15801561223657600080fd5b505af115801561224a573d6000803e3d6000fd5b5050506001600160a01b0382166000908152602260205260409020805460ff1916600117905550611bee816130bf565b6005546001600160a01b031633146122a45760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b03919091166000908152602760205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146122f95760405162461bcd60e51b8152600401611374906151a7565b601a8a9055601b869055601c84905560198890556018879055601689905560178590556015839055601d829055601e8190556123438761233d83818d81898c6133c4565b906133c4565b600c8190555061237260195461233d601d5461233d601a5461233d601b54601c546133c490919063ffffffff16565b600d55600c54600a1080159061238b5750600a600d5411155b6123e85760405162461bcd60e51b815260206004820152602860248201527f746f74616c20666565732063616e6e6f7420657863656564203130252073656c6044820152676c206f722062757960c01b6064820152608401611374565b601654601754601554601854601954601a54601b54601c54601d54601e54604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201527f07cec4532bdb36ce729ae72905c09f7bfbf8682c2cc2f1999f745188d9975122906101400160405180910390a150505050505050505050565b6005546001600160a01b031633146124ab5760405162461bcd60e51b8152600401611374906151a7565b60058111156124fc5760405162461bcd60e51b815260206004820152601d60248201527f7472616e73666572206665652063616e6e6f74206578636565642035250000006044820152606401611374565b601f8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c884472034390602001611d81565b600e54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d63990604401611a34565b6005546001600160a01b031633146125935760405162461bcd60e51b8152600401611374906151a7565b62030d4081101580156125a95750620f42408111155b6125b257600080fd5b60215460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3602155565b60606004805461142a90615209565b6005546001600160a01b0316331461261e5760405162461bcd60e51b8152600401611374906151a7565b611ad38282614979565b6005546001600160a01b031633146126525760405162461bcd60e51b8152600401611374906151a7565b600e54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea90602401611a34565b6005546001600160a01b031633146126ae5760405162461bcd60e51b8152600401611374906151a7565b801515600960159054906101000a900460ff161515036126cd57600080fd5b60098054821515600160a81b0260ff60a81b199091161790556040517f0d240c24014ec8c204fc1bdcc286f7d01fd2ab6a07c558a9b2d3f12904323a8790611d8190831515815260200190565b6005546001600160a01b031633146127445760405162461bcd60e51b8152600401611374906151a7565b600e54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b15801561278b57600080fd5b505af115801561279f573d6000803e3d6000fd5b5050600e546001600160a01b0316915063e30443bc9050826127c081614a42565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611a34565b60006115d233846118ec8560405180606001604052806025815260200161551d602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190614695565b6005546001600160a01b0316331461286a5760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b038116600081815260226020908152604091829020805460ff19166001179055601180546001600160a01b0319168417905590519182527f06e7b14d4e52e36121e7de8c30e9f25ac28e251b168255f629fe15b7a44e9d909101611d81565b600954600160a81b900460ff166129225760405162461bcd60e51b815260206004820152601660248201527514dd185ada5b99c81a5cc81b9bdd08195b98589b195960521b6044820152606401611374565b600081815260266020526040812054900361297f5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207374616b696e67206475726174696f6e00000000000000006044820152606401611374565b61298942826133c4565b33600090815260256020526040902054106129f25760405162461bcd60e51b8152602060048201526024808201527f616c7265616479207374616b656420666f722061206c6f6e67657220647572616044820152633a34b7b760e11b6064820152608401611374565b600081815260266020908152604080832054338452602490925290912055612a1a42826133c4565b33600081815260256020526040902091909155600e546001600160a01b03169063e30443bc90612a4981614a42565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612a8f57600080fd5b505af1158015612aa3573d6000803e3d6000fd5b50505050612aae3390565b6001600160a01b03167f13dd201d7da4f9b31a9064a09abc1a6ce420dacd837a77abafaec5bd9d28d2c882604051612ae891815260200190565b60405180910390a250565b600e546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611edf565b60006115d2338484613b28565b6005546001600160a01b03163314612b5d5760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b03919091166000908152602f60205260409020805460ff1916911515919091179055565b600e5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015612be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c04919061533a565b949c939b5091995097509550909350915050565b6005546001600160a01b03163314612c425760405162461bcd60e51b8152600401611374906151a7565b61012c811115612ca35760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d604482015265696e7574657360d01b6064820152608401611374565b602d55565b600e5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d4990602401611f4f565b6005546001600160a01b03163314612d055760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b0381811660008181526027602090815260408083208054600160ff19918216811790925560229093529281902080549092169092179055600e54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b158015612d8157600080fd5b505af1158015612d95573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050611d81565b6005546001600160a01b03163314612dfd5760405162461bcd60e51b8152600401611374906151a7565b60205481151560ff909116151503612e1457600080fd5b6020805460ff191682151590811782556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef9101611d81565b6005546001600160a01b03163314612e7c5760405162461bcd60e51b8152600401611374906151a7565b602e5460ff1615612e8c57600080fd5b602e805460ff19166001179055565b6005546001600160a01b03163314612ec55760405162461bcd60e51b8152600401611374906151a7565b600e5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b158015612f0c57600080fd5b505af1158015612f20573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050611d81565b6005546001600160a01b03163314612f885760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b038116600081815260226020908152604091829020805460ff19166001179055601080546001600160a01b0319168417905590519182527f53d9cb67443c6a2c0526b12e1c2419b7ca317c61a49da6b787ab91118f47762b9101611d81565b600e546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa1580156119b8573d6000803e3d6000fd5b6005546001600160a01b031633146130625760405162461bcd60e51b8152600401611374906151a7565b6a084595161401484a000000600754111561307c57600080fd5b600755565b600e54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401612bc3565b6005546001600160a01b031633146130e95760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b03811661314e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611374565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146131d45760405162461bcd60e51b8152600401611374906151a7565b602e8054610100600160a81b0319166101006001600160a01b0384169081029190911790915515613294576001600160a01b038181166000818152602f602090815260408083208054600160ff19918216811790925560229093529281902080549092169092179055600e54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b15801561327b57600080fd5b505af115801561328f573d6000803e3d6000fd5b505050505b43602c556009805460ff60b01b1916600160b01b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b600e54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a0490604401611a34565b6005546001600160a01b031633146133395760405162461bcd60e51b8152600401611374906151a7565b61334b81670de0b6b3a76400006151f2565b90506103e860025461335d919061538d565b8110156133bf5760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b6064820152608401611374565b601355565b6000806133d183856153af565b9050838110156134235760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611374565b9392505050565b60008260000361343c575060006115d6565b600061344883856151f2565b905082613455858361538d565b146134235760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611374565b600061342383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614a9b565b806000036134f95750565b61350281614ac9565b600061351b600a54600b546133c490919063ffffffff16565b601c54909150600190819081908190600090819081901561358b57613588601954601d54601a54601c5461354f91906153af565b61355991906153af565b61356391906153af565b6113c7601c546135828c6113c7600b544761342a90919063ffffffff16565b9061342a565b91505b601554156135e2576135df601854601e546016546015546135ac91906153af565b6135b691906153af565b6135c091906153af565b6113c76015546135828c6113c7600a544761342a90919063ffffffff16565b90505b6135ec82826133c4565b9250821561364c57600e546040516001600160a01b03909116908490600081818185875af1925050503d8060008114613641576040519150601f19603f3d011682016040523d82523d6000602084013e613646565b606091505b50909750505b600061366b60195461233d601d54601a546133c490919063ffffffff16565b61368860185461233d601e546016546133c490919063ffffffff16565b61369291906153af565b9050600081156136a9576136a647836134ac565b90505b6000816136c3601654601a546133c490919063ffffffff16565b6136cd91906151f2565b90506000826136e9601e54601d546133c490919063ffffffff16565b6136f391906151f2565b905060008361370f6018546019546133c490919063ffffffff16565b61371991906151f2565b9050821561377957600f546040516001600160a01b03909116908490600081818185875af1925050503d806000811461376e576040519150601f19603f3d011682016040523d82523d6000602084013e613773565b606091505b50909b50505b81156137d7576010546040516001600160a01b03909116908390600081818185875af1925050503d80600081146137cc576040519150601f19603f3d011682016040523d82523d6000602084013e6137d1565b606091505b50909a50505b8015613835576011546040516001600160a01b03909116908290600081818185875af1925050503d806000811461382a576040519150601f19603f3d011682016040523d82523d6000602084013e61382f565b606091505b50909950505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd0888261386285876153af565b61386c91906153af565b8e801561387657508d5b801561387f57508c5b801561388857508b5b60408051938452602084019290925215159082015260600160405180910390a15050505050505050505050505050565b600061342383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614695565b6001600160a01b03831661395c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611374565b6001600160a01b0382166139bd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611374565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316613a455760405162461bcd60e51b8152600401611374906153c2565b6001600160a01b038216613a6b5760405162461bcd60e51b815260040161137490615407565b613aa8816040518060600160405280602681526020016154cf602691396001600160a01b0386166000908152602081905260409020549190614695565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613ad790826133c4565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613a12565b6001600160a01b038316613b4e5760405162461bcd60e51b8152600401611374906153c2565b6001600160a01b038216613b745760405162461bcd60e51b815260040161137490615407565b6009546001600160a01b0390811690831603613bca5760405162461bcd60e51b8152602060048201526015602482015274536f72727920536572204e4f204275726e696e672160581b6044820152606401611374565b6001600160a01b038316600090815260276020526040812054819081908190819060ff16613c4b57600954600160b01b900460ff16613c4b5760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401611374565b602e5460ff16158015613c6d5750602e5461010090046001600160a01b031615155b15613d0457613c7c8888614c23565b1580613ca057506001600160a01b0388166000908152602f602052604090205460ff165b80613cc357506001600160a01b0387166000908152602f602052604090205460ff165b613d045760405162461bcd60e51b815260206004820152601260248201527121617661696c61626c652074726164696e6760701b6044820152606401611374565b85600003613d2257613d1888886000613a1f565b5050505050505050565b600954600160a01b900460ff16158015613d5557506001600160a01b03881660009081526022602052604090205460ff16155b8015613d7a57506001600160a01b03871660009081526022602052604090205460ff16155b156144c5576001600160a01b0380881660009081526023602052604080822054928b16825290205460ff918216911680158015613db5575081155b15613efb576000613dd660646113c7601f548c61342a90919063ffffffff16565b9050613de289826138b8565b9850613def8b3083613a1f565b613dfa8b8b8b613a1f565b600e546001600160a01b031663e30443bc8c613e1581614a42565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613e5b57600080fd5b505af1158015613e6f573d6000803e3d6000fd5b5050600e546001600160a01b0316915063e30443bc90508b613e9081614a42565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613ed657600080fd5b505af1158015613eea573d6000803e3d6000fd5b505050505050505050505050505050565b80158015613f125750600954600160a81b900460ff165b15613fc9576001600160a01b038a16600090815260256020526040902054421015613f7f5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320617265207374616b656420616e64206c6f636b6564210000006044820152606401611374565b6001600160a01b038a1660009081526025602052604090205415613fc4576001600160a01b038a16600090815260256020908152604080832083905560249091528120555b614222565b811561407257601554601854601654601754601e54602854949b509299509097509550935060ff1615613fc457602d54326000908152602b602052604090205461401391906153af565b42101561405b5760405162461bcd60e51b8152602060048201526016602482015275636f6f6c646f776e20706572696f642061637469766560501b6044820152606401611374565b326000908152602b60205260409020429055614222565b801561422257601c54601954601a54601b54601d54602854949b509299509097509550935060ff16156141ab57602c546140ad9060026153af565b43116140f05760405162461bcd60e51b8152602060048201526012602482015271796f75207368616c6c206e6f74207061737360701b6044820152606401611374565b6029543a11156141425760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e00000000000000006044820152606401611374565b326000908152602a60205260409020544390036141985760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e7920545820696e20626c6f636b60601b6044820152606401611374565b326000908152602a602052604090204390555b60006141b68a6120da565b6013549091506141c68a836153af565b11156142205760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401611374565b505b600061424e878561423389896153af565b61423d91906153af565b61424791906153af565b89906133c4565b9050600061425b306120da565b6014549091508110801590819061428b57506001600160a01b038d1660009081526023602052604090205460ff16155b156143a4576009805460ff60a01b1916600160a01b17905560205460ff1680156142b55750600087115b80156142c357506000600d54115b156143755760006142e1600a54600b546133c490919063ffffffff16565b905060006142fe826113c7600b548761342a90919063ffffffff16565b9050600061431b836113c7600a548861342a90919063ffffffff16565b90506000614338600d546113c78d8661342a90919063ffffffff16565b90506000614355600c546113c78e8661342a90919063ffffffff16565b9050600061436382846133c4565b905061436e81614c98565b5050505050505b6000614380306120da565b905061438b816134ee565b506001600b819055600a556009805460ff60a01b191690555b60006143b560646113c78e8761342a565b90506143c18c826138b8565b9b5085156143de57600a546143d690826133c4565b600a556143ef565b600b546143eb90826133c4565b600b555b6143fa8e3083613a1f565b602154600e546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015614467575060408051601f3d908101601f191682019092526144649181019061530c565b60015b156144bd5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505050505050505b6144d0888888613a1f565b600e546001600160a01b031663e30443bc896144eb81614a42565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561453157600080fd5b505af1158015614545573d6000803e3d6000fd5b5050600e546001600160a01b0316915063e30443bc90508861456681614a42565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156145ac57600080fd5b505af11580156145c0573d6000803e3d6000fd5b50506006546001600160a01b038b81169116148015925090506145fc57506001600160a01b03881660009081526023602052604090205460ff16155b801561461a5750602e546001600160a01b0388811661010090920416145b15613d1857602e54604051633fb6b04560e11b8152600481018890526001600160a01b038a8116602483015261010090920490911690637f6d608a90604401600060405180830381600087803b15801561467357600080fd5b505af1158015614687573d6000803e3d6000fd5b505050505050505050505050565b600081848411156146b95760405162461bcd60e51b81526004016113749190614e06565b5060006146c6848661544a565b95945050505050565b6001600160a01b0382166147255760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401611374565b8060025461473391906153af565b60075410156147aa5760405162461bcd60e51b815260206004820152603e60248201527f4d696e74206572726f722120416d6f756e742063616e2774206265206d6f726560448201527f207468616e2074686520746f74616c20737570706c79206f6e204253432100006064820152608401611374565b80600260008282546147bc91906153af565b90915550506001600160a01b038216600090815260208190526040812080548392906147e99084906153af565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166148935760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401611374565b6001600160a01b038216600090815260208190526040902054818110156149075760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401611374565b6001600160a01b038316600090815260208190526040812083830390556002805484929061493690849061544a565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001613a12565b6001600160a01b0382166000908152602360205260409020805460ff19168215801591909117909155614a0657600e5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156149ed57600080fd5b505af1158015614a01573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600954600090600160a81b900460ff16614a6457614a5f826120da565b6115d6565b6001600160a01b0382166000908152602460205260409020546115d6906064906113c790614a9290836133c4565b613582866120da565b60008183614abc5760405162461bcd60e51b81526004016113749190614e06565b5060006146c6848661538d565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110614afe57614afe615243565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614b57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b7b9190615272565b81600181518110614b8e57614b8e615243565b6001600160a01b039283166020918202929092010152600654614bb491309116846138fa565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790614bed90859060009086903090429060040161545d565b600060405180830381600087803b158015614c0757600080fd5b505af1158015614c1b573d6000803e3d6000fd5b505050505050565b6001600160a01b03821660009081526023602052604081205460ff168015614c5957506006546001600160a01b03838116911614155b15614c66575060016115d6565b6001600160a01b03821660009081526023602052604090205460ff1615614c8f575060026115d6565b50600092915050565b6000614ca58260026134ac565b90506000614cb383836138b8565b905047614cbf83614ac9565b6000614ccb47836138b8565b9050614cd78382614d1f565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b600654614d379030906001600160a01b0316846138fa565b6006546001600160a01b031663f305d719823085600080614d606005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015614dc8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a62919061530c565b600060208284031215614dff57600080fd5b5035919050565b600060208083528351808285015260005b81811015614e3357858101830151858201604001528201614e17565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611bee57600080fd5b8015158114611bee57600080fd5b60008060408385031215614e8a57600080fd5b8235614e9581614e54565b91506020830135614ea581614e69565b809150509250929050565b60008060408385031215614ec357600080fd5b8235614ece81614e54565b946020939093013593505050565b60008060408385031215614eef57600080fd5b50508035926020909101359150565b600060208284031215614f1057600080fd5b813561342381614e54565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614f5a57614f5a614f1b565b604052919050565b600067ffffffffffffffff821115614f7c57614f7c614f1b565b5060051b60200190565b600082601f830112614f9757600080fd5b81356020614fac614fa783614f62565b614f31565b82815260059290921b84018101918181019086841115614fcb57600080fd5b8286015b84811015614fe65780358352918301918301614fcf565b509695505050505050565b6000806040838503121561500457600080fd5b823567ffffffffffffffff8082111561501c57600080fd5b818501915085601f83011261503057600080fd5b81356020615040614fa783614f62565b82815260059290921b8401810191818101908984111561505f57600080fd5b948201945b8386101561508657853561507781614e54565b82529482019490820190615064565b9650508601359250508082111561509c57600080fd5b506150a985828601614f86565b9150509250929050565b6000806000606084860312156150c857600080fd5b83356150d381614e54565b925060208401356150e381614e54565b929592945050506040919091013590565b60006020828403121561510657600080fd5b813561342381614e69565b6000806000806000806000806000806101408b8d03121561513157600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b6000806040838503121561518c57600080fd5b823561519781614e54565b91506020830135614ea581614e54565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176115d6576115d66151dc565b600181811c9082168061521d57607f821691505b60208210810361523d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161526b5761526b6151dc565b5060010190565b60006020828403121561528457600080fd5b815161342381614e54565b6000602082840312156152a157600080fd5b5051919050565b60208082526027908201527f6f6e6c7920627269646765206861732061636365737320746f207468697320666040820152663ab731ba34b7b760c91b606082015260800190565b60006020828403121561530157600080fd5b815161342381614e69565b60008060006060848603121561532157600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c0878903121561535357600080fd5b865161535e81614e54565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b6000826153aa57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156115d6576115d66151dc565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156115d6576115d66151dc565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156154ad5784516001600160a01b031683529383019391830191600101615488565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d7c77e9bf639fded488899cea11091b7f4f55283939794bd85e0ba408f6421a964736f6c6343000811003360806040526012805460ff60b01b191690553480156200001e57600080fd5b50604051620030e7380380620030e7833981016040819052620000419162000239565b81818181600362000053838262000373565b50600462000062828262000373565b50505050506000620000796200015760201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506013620000d5838262000373565b506014620000e4828262000373565b505060128054601680546001600160a01b03199081166001600160a01b039889161790915568056bc75e2d6310000060188190556019556015805490911695871695909517909455600160a01b929094166001600160a81b0319909316929092171760ff60a81b1916909155506200043f565b3390565b6001600160a01b03811681146200017157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200019c57600080fd5b81516001600160401b0380821115620001b957620001b962000174565b604051601f8301601f19908116603f01168101908282118183101715620001e457620001e462000174565b816040528381526020925086838588010111156200020157600080fd5b600091505b8382101562000225578582018301518183018401529082019062000206565b600093810190920192909252949350505050565b600080600080600060a086880312156200025257600080fd5b85516200025f816200015b565b602087015190955062000272816200015b565b604087015190945062000285816200015b565b60608701519093506001600160401b0380821115620002a357600080fd5b620002b189838a016200018a565b93506080880151915080821115620002c857600080fd5b50620002d7888289016200018a565b9150509295509295909350565b600181811c90821680620002f957607f821691505b6020821081036200031a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200036e57600081815260208120601f850160051c81016020861015620003495750805b601f850160051c820191505b818110156200036a5782815560010162000355565b5050505b505050565b81516001600160401b038111156200038f576200038f62000174565b620003a781620003a08454620002e4565b8462000320565b602080601f831160018114620003df5760008415620003c65750858301515b600019600386901b1c1916600185901b1785556200036a565b600085815260208120601f198616915b828110156200041057888601518255948401946001909101908401620003ef565b50858210156200042f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612c98806200044f6000396000f3fe6080604052600436106103395760003560e01c80636ebcf607116101ab578063a457c2d7116100f7578063d8032ed311610095578063e7841ec01161006f578063e7841ec014610a35578063f2fde38b14610a4a578063fbcbc0f114610a6a578063ffb2c47914610a8a57600080fd5b8063d8032ed3146109af578063dd62ed3e146109cf578063e30443bc14610a1557600080fd5b8063aafd847a116100d1578063aafd847a14610919578063b22f8a041461094f578063ba079d491461096f578063bc4c4b371461098f57600080fd5b8063a457c2d7146108b9578063a8b9d240146108d9578063a9059cbb146108f957600080fd5b80638cbb0f681161016457806395d89b411161013e57806395d89b41146108425780639c3372ea146108575780639eec101e14610877578063a42340691461089857600080fd5b80638cbb0f68146107e45780638da5cb5b1461080457806391b89fba1461082257600080fd5b80636ebcf6071461071657806370a0823114610743578063715018a61461077957806374c13fda1461078e57806385a6b3ae146107ae5780638bc1d639146107c457600080fd5b8063313ce567116102855780635183d6fd1161022357806365b8dbc0116101fd57806365b8dbc0146106915780636a474002146106b15780636b69163b146106c65780636d48467b146106f657600080fd5b80635183d6fd146105fa5780635a84c5eb146106515780635ebf4db91461067157600080fd5b8063395093511161025f578063395093511461056957806340ffdd801461058957806341808904146105a95780634e7b827f146105ca57600080fd5b8063313ce5671461050d57806331e79db0146105295780633599bb171461054957600080fd5b806318160ddd116102f257806323b872dd116102cc57806323b872dd1461049957806325cd3598146104b957806327ce0147146104d75780633009a609146104f757600080fd5b806318160ddd146104275780631d4ff89a1461043c578063226cfa3d1461046c57600080fd5b806303c833021461034d57806306fdde03146103555780630928847114610380578063095ea7b3146103a057806309bbedde146103d05780631694505e146103ef57600080fd5b3661034857610346610ac5565b005b600080fd5b610346610ac5565b34801561036157600080fd5b5061036a610b58565b6040516103779190612814565b60405180910390f35b34801561038c57600080fd5b5061034661039b36600461287a565b610bea565b3480156103ac57600080fd5b506103c06103bb366004612897565b610c3e565b6040519015158152602001610377565b3480156103dc57600080fd5b50600a545b604051908152602001610377565b3480156103fb57600080fd5b5060155461040f906001600160a01b031681565b6040516001600160a01b039091168152602001610377565b34801561043357600080fd5b506002546103e1565b34801561044857600080fd5b506103c061045736600461287a565b60116020526000908152604090205460ff1681565b34801561047857600080fd5b506103e161048736600461287a565b60176020526000908152604090205481565b3480156104a557600080fd5b506103c06104b43660046128c3565b610c55565b3480156104c557600080fd5b506012546001600160a01b031661040f565b3480156104e357600080fd5b506103e16104f236600461287a565b610cbe565b34801561050357600080fd5b506103e1600e5481565b34801561051957600080fd5b5060405160128152602001610377565b34801561053557600080fd5b5061034661054436600461287a565b610d1a565b34801561055557600080fd5b50610346610564366004612912565b610db4565b34801561057557600080fd5b506103c0610584366004612897565b610e55565b34801561059557600080fd5b506103466105a4366004612912565b610e8b565b3480156105b557600080fd5b506012546103c090600160a81b900460ff1681565b3480156105d657600080fd5b506103c06105e536600461287a565b600f6020526000908152604090205460ff1681565b34801561060657600080fd5b5061061a61061536600461292f565b610f21565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c001610377565b34801561065d57600080fd5b5061034661066c36600461292f565b610f81565b34801561067d57600080fd5b5061034661068c36600461292f565b610fc3565b34801561069d57600080fd5b506103466106ac36600461287a565b611005565b3480156106bd57600080fd5b50610346611051565b3480156106d257600080fd5b506103c06106e136600461287a565b60106020526000908152604090205460ff1681565b34801561070257600080fd5b506103c061071136600461287a565b6110fd565b34801561072257600080fd5b506103e161073136600461287a565b60006020819052908152604090205481565b34801561074f57600080fd5b506103e161075e36600461287a565b6001600160a01b031660009081526020819052604090205490565b34801561078557600080fd5b50610346611149565b34801561079a57600080fd5b5060125461040f906001600160a01b031681565b3480156107ba57600080fd5b506103e160085481565b3480156107d057600080fd5b506103466107df366004612948565b6111bd565b3480156107f057600080fd5b5060165461040f906001600160a01b031681565b34801561081057600080fd5b506009546001600160a01b031661040f565b34801561082e57600080fd5b506103e161083d36600461287a565b611212565b34801561084e57600080fd5b5061036a61121d565b34801561086357600080fd5b50610346610872366004612912565b61122c565b34801561088357600080fd5b506012546103c090600160a01b900460ff1681565b3480156108a457600080fd5b506012546103c090600160b01b900460ff1681565b3480156108c557600080fd5b506103c06108d4366004612897565b6112c2565b3480156108e557600080fd5b506103e16108f436600461287a565b611311565b34801561090557600080fd5b506103c0610914366004612897565b61133d565b34801561092557600080fd5b506103e161093436600461287a565b6001600160a01b031660009081526007602052604090205490565b34801561095b57600080fd5b5061034661096a366004612948565b61134a565b34801561097b57600080fd5b506103c061098a36600461287a565b61139f565b34801561099b57600080fd5b506103c06109aa366004612948565b6113eb565b3480156109bb57600080fd5b506103466109ca36600461287a565b61156c565b3480156109db57600080fd5b506103e16109ea366004612981565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a2157600080fd5b50610346610a30366004612897565b6115b8565b348015610a4157600080fd5b50600e546103e1565b348015610a5657600080fd5b50610346610a6536600461287a565b611650565b348015610a7657600080fd5b5061061a610a8536600461287a565b61173b565b348015610a9657600080fd5b50610aaa610aa536600461292f565b6117ea565b60408051938452602084019290925290820152606001610377565b6000610ad060025490565b11610ada57600080fd5b3415610b5657610b0d610aec60025490565b610afa34600160801b611910565b610b0491906129c5565b60055490611999565b60055560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600854610b529034611999565b6008555b565b606060138054610b67906129e7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b93906129e7565b8015610be05780601f10610bb557610100808354040283529160200191610be0565b820191906000526020600020905b815481529060010190602001808311610bc357829003601f168201915b5050505050905090565b6009546001600160a01b03163314610c1d5760405162461bcd60e51b8152600401610c1490612a21565b60405180910390fd5b6001600160a01b03166000908152600f60205260409020805460ff19169055565b6000610c4b3384846119f8565b5060015b92915050565b6000610c62848484611b1c565b610cb48433610caf85604051806060016040528060288152602001612c16602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611b82565b6119f8565b5060019392505050565b6001600160a01b03811660009081526006602090815260408083205491839052822054600554600160801b92610d1092610d0b92610d0591610d009190611910565b611bbc565b90611bcc565b611c0a565b610c4f91906129c5565b6009546001600160a01b03163314610d445760405162461bcd60e51b8152600401610c1490612a21565b6001600160a01b0381166000908152600f60205260408120805460ff19166001179055610d72908290611c1d565b610d7d600a82611c7c565b6040516001600160a01b038216907fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b2590600090a250565b6009546001600160a01b03163314610dde5760405162461bcd60e51b8152600401610c1490612a21565b801515601260169054906101000a900460ff16151503610dfd57600080fd5b60128054821515600160b01b0260ff60b01b199091161790556040517f3da2593f2c4724acfbd754045321e852cad26f3974834b1890045530f89c21b390610e4a90831515815260200190565b60405180910390a150565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610c4b918590610caf9086611999565b6009546001600160a01b03163314610eb55760405162461bcd60e51b8152600401610c1490612a21565b801515601260159054906101000a900460ff16151503610ed457600080fd5b60128054821515600160a81b0260ff60a81b199091161790556040517fc138a28750b971696f46ea59731c471ef1e08e4015404afdb139fd2e87dca1bb90610e4a90831515815260200190565b600080600080600080610f33600a5490565b8710610f52575060009450600019935083925084915081905080610f78565b6000610f5f600a89611db7565b9050610f6a8161173b565b965096509650965096509650505b91939550919395565b6009546001600160a01b03163314610fab5760405162461bcd60e51b8152600401610c1490612a21565b610fbd81670de0b6b3a7640000612a56565b60185550565b6009546001600160a01b03163314610fed5760405162461bcd60e51b8152600401610c1490612a21565b610fff81670de0b6b3a7640000612a56565b60195550565b6009546001600160a01b0316331461102f5760405162461bcd60e51b8152600401610c1490612a21565b601580546001600160a01b0319166001600160a01b0392909216919091179055565b60405162461bcd60e51b815260206004820152606f60248201527f416d6572696369756d5f4469766964656e645f547261636b65723a207769746860448201527f647261774469766964656e642064697361626c65642e2055736520746865202760648201527f636c61696d272066756e6374696f6e206f6e20746865206d61696e20416d657260848201526e34b1b4bab69031b7b73a3930b1ba1760891b60a482015260c401610c14565b6009546000906001600160a01b0316331461112a5760405162461bcd60e51b8152600401610c1490612a21565b506001600160a01b031660009081526010602052604090205460ff1690565b6009546001600160a01b031633146111735760405162461bcd60e51b8152600401610c1490612a21565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6009546001600160a01b031633146111e75760405162461bcd60e51b8152600401610c1490612a21565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6000610c4f82611311565b606060148054610b67906129e7565b6009546001600160a01b031633146112565760405162461bcd60e51b8152600401610c1490612a21565b801515601260149054906101000a900460ff1615150361127557600080fd5b60128054821515600160a01b0260ff60a01b199091161790556040517f8d34c313963017194ed726d050e868657d0e2d2c6748d13e358cd4b89d4ee7c890610e4a90831515815260200190565b6000610c4b3384610caf85604051806060016040528060258152602001612c3e602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611b82565b6001600160a01b038116600090815260076020526040812054610c4f9061133784610cbe565b90611dea565b6000610c4b338484611b1c565b6009546001600160a01b031633146113745760405162461bcd60e51b8152600401610c1490612a21565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6009546000906001600160a01b031633146113cc5760405162461bcd60e51b8152600401610c1490612a21565b506001600160a01b031660009081526011602052604090205460ff1690565b6009546000906001600160a01b031633146114185760405162461bcd60e51b8152600401610c1490612a21565b601254600160b01b900460ff161561143257506000610c4f565b6001600160a01b03831660009081526011602052604090205460ff168280156114585750805b801561146e5750601254600160a81b900460ff16155b1561147d576000915050610c4f565b6000816114925761148d85611e2c565b61149b565b61149b856120e5565b90508015611561576001600160a01b0385166000908152601760205260409020429055811561150f57831515856001600160a01b03167ffbd928dd3806a2bdf802f3a28a2cc55205f95dbcd2c3ed313abfca278366f80c8360405161150291815260200190565b60405180910390a3611556565b831515856001600160a01b03167fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf0928360405161154d91815260200190565b60405180910390a35b600192505050610c4f565b506000949350505050565b6009546001600160a01b031633146115965760405162461bcd60e51b8152600401610c1490612a21565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6009546001600160a01b031633146115e25760405162461bcd60e51b8152600401610c1490612a21565b6001600160a01b0382166000908152600f602052604090205460ff166116225760195481101561162657611617600a83611c7c565b611622826000611c1d565b5050565b6116308282611c1d565b601854811061164557611622600a8383612458565b611622600a83611c7c565b6009546001600160a01b0316331461167a5760405162461bcd60e51b8152600401610c1490612a21565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c14565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b8060008080808061174d600a87612501565b94506000199350600085126117af57600e5485111561177b57600e5461177490869061254c565b93506117af565b600e54600a546000911061179057600061179f565b600e54600a5461179f91611dea565b90506117ab8682611bcc565b9450505b6117b886611311565b92506117c386610cbe565b6001600160a01b038716600090815260176020526040902054969895975093959294915050565b600a546000908190819080158061180a5750601254600160b01b900460ff165b15611820575050600e5460009250829150611909565b600e546000805a90506000805b898410801561183b57508582105b156118f8578461184a81612a6d565b95505085851061185957600094505b6000600a600001868154811061187157611871612a86565b60009182526020808320909101546001600160a01b0316808352601090915260409091205490915060ff166118be576118ab8160016113eb565b156118be57816118ba81612a6d565b9250505b826118c881612a6d565b93505060005a9050808511156118ef576118ec6118e58683611dea565b8790611999565b95505b935061182d9050565b600e85905590975095509193505050505b9193909250565b60008260000361192257506000610c4f565b600061192e8385612a56565b90508261193b85836129c5565b146119925760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c14565b9392505050565b6000806119a68385612a9c565b9050838110156119925760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c14565b6001600160a01b038316611a5a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c14565b6001600160a01b038216611abb5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c14565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152603060248201527f416d6572696369756d5f4469766964656e645f547261636b65723a204e6f207460448201526f1c985b9cd9995c9cc8185b1b1bddd95960821b6064820152608401610c14565b505050565b60008184841115611ba65760405162461bcd60e51b8152600401610c149190612814565b506000611bb38486612aaf565b95945050505050565b60008181811215610c4f57600080fd5b600080611bd98385612ac2565b905060008312158015611bec5750838112155b80611c015750600083128015611c0157508381125b61199257600080fd5b600080821215611c1957600080fd5b5090565b6001600160a01b03821660009081526020819052604090205480821115611c5c576000611c4a8383611dea565b9050611c568482612589565b50505050565b80821015611b7d576000611c708284611dea565b9050611c5684826125ed565b6001600160a01b038116600090815260038301602052604090205460ff16611ca2575050565b6001600160a01b03811660009081526003830160209081526040808320805460ff1916905560018086018352818420849055600286019092528220548454909291611cec91612aaf565b90506000846000018281548110611d0557611d05612a86565b60009182526020808320909101546001600160a01b03908116808452600289019092526040808420879055908716835282209190915585549091508190869085908110611d5457611d54612a86565b600091825260209091200180546001600160a01b0319166001600160a01b03929092169190911790558454859080611d8e57611d8e612aea565b600082815260209020810160001990810180546001600160a01b03191690550190555050505050565b6000826000018281548110611dce57611dce612a86565b6000918252602090912001546001600160a01b03169392505050565b600061199283836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b82565b600080611e3883611311565b905080156120dc576001600160a01b038316600090815260076020526040902054611e639082611999565b6001600160a01b03808516600090815260076020526040812092909255601254169081611ee8576040516001600160a01b03861690610bb89085906000818181858888f193505050503d8060008114611ed8576040519150601f19603f3d011682016040523d82523d6000602084013e611edd565b606091505b505080915050612042565b6040805160028082526060820183526000926020830190803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611f52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f769190612b00565b81600081518110611f8957611f89612a86565b60200260200101906001600160a01b031690816001600160a01b0316815250508281600181518110611fbd57611fbd612a86565b6001600160a01b03928316602091820292909201015260155460405163b6f9de9560e01b815291169063b6f9de959086906120039060009086908c904290600401612b61565b6000604051808303818588803b15801561201c57600080fd5b505af19350505050801561202e575060015b61203b5760009150612040565b600191505b505b80612090576001600160a01b03851660009081526007602052604090205461206a9084611dea565b6001600160a01b0390951660009081526007602052604081209590955550929392505050565b846001600160a01b03167fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d846040516120cb91815260200190565b60405180910390a250909392505050565b50600092915050565b6000806120f183611311565b905080156120dc576001600160a01b03831660009081526007602052604081205461211c9083611999565b6001600160a01b03851660009081526007602052604080822092909255815160028082526060820190935290918160200160208202803683375050601554604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa1580156121a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c89190612b00565b816000815181106121db576121db612a86565b6001600160a01b03928316602091820292909201015260165482519116908290600190811061220c5761220c612a86565b6001600160a01b0392831660209182029290920101526016546040516370a0823160e01b815230600482015260009291909116906370a0823190602401602060405180830381865afa158015612266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228a9190612b96565b60155460405163b6f9de9560e01b81529192506001600160a01b03169063b6f9de959086906122c490600090879030904290600401612b61565b6000604051808303818588803b1580156122dd57600080fd5b505af1935050505080156122ef575060015b6122fc57600092506123ff565b6016546040516370a0823160e01b815230600482015260009161236f9184916001600160a01b0316906370a0823190602401602060405180830381865afa15801561234b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113379190612b96565b905080156123f85760165460405163a9059cbb60e01b81526001600160a01b03898116600483015260248201849052600196509091169063a9059cbb906044016020604051808303816000875af11580156123ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123f29190612baf565b506123fd565b600093505b505b8261244e576001600160a01b0386166000908152600760205260409020546124279085611dea565b6001600160a01b039096166000908152600760205260408120969096555093949350505050565b5091949350505050565b6001600160a01b038216600090815260038401602052604090205460ff161561249d576001600160a01b03821660009081526001840160205260409020819055505050565b6001600160a01b03821660008181526003850160209081526040808320805460ff19166001908117909155878101835281842086905587546002890184529184208290558101875586835291200180546001600160a01b0319169091179055505050565b6001600160a01b038116600090815260038301602052604081205460ff1661252c5750600019610c4f565b506001600160a01b03166000908152600291909101602052604090205490565b6000806125598385612bcc565b90506000831215801561256c5750838113155b80611c015750600083128015611c01575083811361199257600080fd5b6125938282612631565b6125cd6125ae610d008360055461191090919063ffffffff16565b6001600160a01b0384166000908152600660205260409020549061254c565b6001600160a01b0390921660009081526006602052604090209190915550565b6125f78282612710565b6125cd612612610d008360055461191090919063ffffffff16565b6001600160a01b03841660009081526006602052604090205490611bcc565b6001600160a01b0382166126875760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610c14565b6002546126949082611999565b6002556001600160a01b0382166000908152602081905260409020546126ba9082611999565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6001600160a01b0382166127705760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610c14565b6127ad81604051806060016040528060228152602001612bf4602291396001600160a01b0385166000908152602081905260409020549190611b82565b6001600160a01b0383166000908152602081905260409020556002546127d39082611dea565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612704565b600060208083528351808285015260005b8181101561284157858101830151858201604001528201612825565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461287757600080fd5b50565b60006020828403121561288c57600080fd5b813561199281612862565b600080604083850312156128aa57600080fd5b82356128b581612862565b946020939093013593505050565b6000806000606084860312156128d857600080fd5b83356128e381612862565b925060208401356128f381612862565b929592945050506040919091013590565b801515811461287757600080fd5b60006020828403121561292457600080fd5b813561199281612904565b60006020828403121561294157600080fd5b5035919050565b6000806040838503121561295b57600080fd5b823561296681612862565b9150602083013561297681612904565b809150509250929050565b6000806040838503121561299457600080fd5b823561299f81612862565b9150602083013561297681612862565b634e487b7160e01b600052601160045260246000fd5b6000826129e257634e487b7160e01b600052601260045260246000fd5b500490565b600181811c908216806129fb57607f821691505b602082108103612a1b57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8082028115828204841417610c4f57610c4f6129af565b600060018201612a7f57612a7f6129af565b5060010190565b634e487b7160e01b600052603260045260246000fd5b80820180821115610c4f57610c4f6129af565b81810381811115610c4f57610c4f6129af565b8082018281126000831280158216821582161715612ae257612ae26129af565b505092915050565b634e487b7160e01b600052603160045260246000fd5b600060208284031215612b1257600080fd5b815161199281612862565b600081518084526020808501945080840160005b83811015612b565781516001600160a01b031687529582019590820190600101612b31565b509495945050505050565b848152608060208201526000612b7a6080830186612b1d565b6001600160a01b03949094166040830152506060015292915050565b600060208284031215612ba857600080fd5b5051919050565b600060208284031215612bc157600080fd5b815161199281612904565b8181036000831280158383131683831282161715612bec57612bec6129af565b509291505056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212207e51ae575aa1ddc664ad54d692a5b5b84c2ff3bb05585450874e3b78c675e16064736f6c634300081100330000000000000000000000007299336e094dd0f5a74f6bdcbfe7fecc401b81c4

Deployed Bytecode

0x60806040526004361061061a5760003560e01c806377a3b60911610329578063b62496f5116101b6578063e7841ec011610102578063f2fde38b116100a0578063f63743421161007a578063f6374342146112e8578063f8b45b05146112fe578063fc6b151c14611314578063fe66962e1461133457600080fd5b8063f2fde38b14611288578063f39409e9146112a8578063f5d3c79a146112c857600080fd5b8063f11a24d3116100dc578063f11a24d31461120f578063f1c0ddff14611225578063f26ce61614611252578063f27fd2541461126857600080fd5b8063e7841ec0146111ba578063e78cea92146111cf578063f103b433146111ef57600080fd5b8063d7b837dd1161016f578063dd62ed3e11610149578063dd62ed3e1461111e578063deab8aea14611164578063e2f4560514611184578063e6d7dc371461119a57600080fd5b8063d7b837dd146110c9578063d8032ed3146110de578063d90d7186146110fe57600080fd5b8063b62496f514611003578063b74e3b1114611033578063ba079d4914611053578063bb8d513114611073578063d07a091c14611089578063d5e37251146110a957600080fd5b80639c3372ea11610275578063a8b9d2401161022e578063aa4704f311610208578063aa4704f314610f28578063acb2ad6f14610f80578063ad56c13c14610f96578063b494298814610fed57600080fd5b8063a8b9d24014610ec8578063a9059cbb14610ee8578063a9885de514610f0857600080fd5b80639c3372ea14610e085780639cefc1da14610e285780639ec1037e14610e48578063a457c2d714610e68578063a4640b8214610e88578063a694fc3a14610ea857600080fd5b8063868730c7116102e257806395451c29116102bc57806395451c2914610da757806395d89b4114610dbd5780639a7a23d614610dd25780639c1b8af514610df257600080fd5b8063868730c714610d49578063871c128d14610d695780638da5cb5b14610d8957600080fd5b806377a3b60914610c8c5780637928dd1d14610ca25780637d32f34214610cbc5780637fdde05c14610ce9578063837ae2d014610d095780638577a6d514610d2957600080fd5b806342966c68116104a75780635eee4bae116103f35780636ebcf607116103ac578063715018a611610386578063715018a614610c1757806372d8edf414610c2c57806375829def14610c4c57806375f0a87414610c6c57600080fd5b80636ebcf60714610baa578063700bb19114610bd757806370a0823114610bf757600080fd5b80635eee4bae14610af557806364b0f65314610b15578063679ca6e914610b2a5780636843cd8414610b4a5780636d48467b14610b6a5780636eb3821214610b8a57600080fd5b80634c0f38c2116104605780635124f8741161043a5780635124f87414610a7f5780635a84c5eb14610a955780635d098b3814610ab55780635ebf4db914610ad557600080fd5b80634c0f38c214610a1c5780634e71d92d14610a315780634fbee19314610a4657600080fd5b806342966c681461095a578063435c89e41461097a57806349bd5a5e146109a75780634a62bb65146109c75780634a74bb02146109e15780634ada218b146109fb57600080fd5b806321cbb02411610566578063313ce5671161051f5780633f407b84116104f95780633f407b84146108e457806340c10f19146108fa57806340ffdd801461091a57806341088e2b1461093a57600080fd5b8063313ce567146108885780633599bb17146108a457806339509351146108c457600080fd5b806321cbb024146107ce5780632307b441146107fe57806323b872dd1461081e57806325cd35981461083e5780632c1f52161461085357806330bb4cff1461087357600080fd5b80630ef35b7e116105d35780631a221dbb116105ad5780631a221dbb146107765780631d7b1fb41461078c5780631fa70531146107a25780631fe70a98146107b857600080fd5b80630ef35b7e146107175780631694505e1461073757806318160ddd1461075757600080fd5b806303fd2a451461062657806305ca5f081461066357806306fdde031461068557806308dfe8a5146106a757806309231602146106c7578063095ea7b3146106e757600080fd5b3661062157005b600080fd5b34801561063257600080fd5b50600954610646906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561066f57600080fd5b5061068361067e366004614ded565b61134a565b005b34801561069157600080fd5b5061069a61141b565b60405161065a9190614e06565b3480156106b357600080fd5b506106836106c2366004614e77565b6114ad565b3480156106d357600080fd5b506106836106e2366004614ded565b611536565b3480156106f357600080fd5b50610707610702366004614eb0565b6115c5565b604051901515815260200161065a565b34801561072357600080fd5b50610683610732366004614edc565b6115dc565b34801561074357600080fd5b50600654610646906001600160a01b031681565b34801561076357600080fd5b506002545b60405190815260200161065a565b34801561078257600080fd5b5061076860185481565b34801561079857600080fd5b50610768602d5481565b3480156107ae57600080fd5b50610768600b5481565b3480156107c457600080fd5b5061076860195481565b3480156107da57600080fd5b506107076107e9366004614efe565b602f6020526000908152604090205460ff1681565b34801561080a57600080fd5b50610683610819366004614ff1565b6116c1565b34801561082a57600080fd5b506107076108393660046150b3565b611892565b34801561084a57600080fd5b506106466118fb565b34801561085f57600080fd5b50600e54610646906001600160a01b031681565b34801561087f57600080fd5b5061076861196e565b34801561089457600080fd5b506040516012815260200161065a565b3480156108b057600080fd5b506106836108bf3660046150f4565b6119dc565b3480156108d057600080fd5b506107076108df366004614eb0565b611a69565b3480156108f057600080fd5b50610768600a5481565b34801561090657600080fd5b50610683610915366004614eb0565b611a9f565b34801561092657600080fd5b506106836109353660046150f4565b611ad7565b34801561094657600080fd5b50610683610955366004614efe565b611b32565b34801561096657600080fd5b50610683610975366004614ded565b611bf1565b34801561098657600080fd5b50610768610995366004614ded565b60266020526000908152604090205481565b3480156109b357600080fd5b50600854610646906001600160a01b031681565b3480156109d357600080fd5b506028546107079060ff1681565b3480156109ed57600080fd5b506020546107079060ff1681565b348015610a0757600080fd5b5060095461070790600160b01b900460ff1681565b348015610a2857600080fd5b50600754610768565b348015610a3d57600080fd5b50610683611c25565b348015610a5257600080fd5b50610707610a61366004614efe565b6001600160a01b031660009081526022602052604090205460ff1690565b348015610a8b57600080fd5b50610768601a5481565b348015610aa157600080fd5b50610683610ab0366004614ded565b611c9a565b348015610ac157600080fd5b50610683610ad0366004614efe565b611cf5565b348015610ae157600080fd5b50610683610af0366004614ded565b611d8c565b348015610b0157600080fd5b50610683610b10366004614ded565b611de7565b348015610b2157600080fd5b50610768611e29565b348015610b3657600080fd5b50610683610b453660046150f4565b611e73565b348015610b5657600080fd5b50610768610b65366004614efe565b611eb0565b348015610b7657600080fd5b50610707610b85366004614efe565b611f20565b348015610b9657600080fd5b50610683610ba5366004614efe565b611f90565b348015610bb657600080fd5b50610768610bc5366004614efe565b60006020819052908152604090205481565b348015610be357600080fd5b50610683610bf2366004614ded565b612008565b348015610c0357600080fd5b50610768610c12366004614efe565b6120da565b348015610c2357600080fd5b506106836120f5565b348015610c3857600080fd5b50610683610c47366004614efe565b612169565b348015610c5857600080fd5b50610683610c67366004614efe565b6121c5565b348015610c7857600080fd5b50600f54610646906001600160a01b031681565b348015610c9857600080fd5b50610768601c5481565b348015610cae57600080fd5b50602e546107079060ff1681565b348015610cc857600080fd5b50610768610cd7366004614efe565b60256020526000908152604090205481565b348015610cf557600080fd5b50610683610d04366004614e77565b61227a565b348015610d1557600080fd5b50610683610d24366004615111565b6122cf565b348015610d3557600080fd5b50610683610d44366004614ded565b612481565b348015610d5557600080fd5b50610683610d643660046150f4565b612531565b348015610d7557600080fd5b50610683610d84366004614ded565b612569565b348015610d9557600080fd5b506005546001600160a01b0316610646565b348015610db357600080fd5b5061076860165481565b348015610dc957600080fd5b5061069a6125e5565b348015610dde57600080fd5b50610683610ded366004614e77565b6125f4565b348015610dfe57600080fd5b5061076860215481565b348015610e1457600080fd5b50610683610e233660046150f4565b612628565b348015610e3457600080fd5b50610683610e433660046150f4565b612684565b348015610e5457600080fd5b50610683610e63366004614efe565b61271a565b348015610e7457600080fd5b50610707610e83366004614eb0565b6127f1565b348015610e9457600080fd5b50610683610ea3366004614efe565b612840565b348015610eb457600080fd5b50610683610ec3366004614ded565b6128d0565b348015610ed457600080fd5b50610768610ee3366004614efe565b612af3565b348015610ef457600080fd5b50610707610f03366004614eb0565b612b26565b348015610f1457600080fd5b50610683610f23366004614e77565b612b33565b348015610f3457600080fd5b50610f6b610f43366004614efe565b6001600160a01b03166000908152602560209081526040808320546024909252909120549091565b6040805192835260208301919091520161065a565b348015610f8c57600080fd5b50610768601f5481565b348015610fa257600080fd5b50610fb6610fb1366004614efe565b612b88565b604080516001600160a01b0390971687526020870195909552938501929092526060840152608083015260a082015260c00161065a565b348015610ff957600080fd5b50610768602c5481565b34801561100f57600080fd5b5061070761101e366004614efe565b60236020526000908152604090205460ff1681565b34801561103f57600080fd5b5061068361104e366004614ded565b612c18565b34801561105f57600080fd5b5061070761106e366004614efe565b612ca8565b34801561107f57600080fd5b5061076860155481565b34801561109557600080fd5b506106836110a4366004614efe565b612cdb565b3480156110b557600080fd5b506106836110c43660046150f4565b612dd3565b3480156110d557600080fd5b50610683612e52565b3480156110ea57600080fd5b506106836110f9366004614efe565b612e9b565b34801561110a57600080fd5b50601054610646906001600160a01b031681565b34801561112a57600080fd5b50610768611139366004615179565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561117057600080fd5b50601154610646906001600160a01b031681565b34801561119057600080fd5b5061076860145481565b3480156111a657600080fd5b506106836111b5366004614efe565b612f5e565b3480156111c657600080fd5b50610768612fee565b3480156111db57600080fd5b50601254610646906001600160a01b031681565b3480156111fb57600080fd5b5061068361120a366004614ded565b613038565b34801561121b57600080fd5b50610768601b5481565b34801561123157600080fd5b50610768611240366004614efe565b60246020526000908152604090205481565b34801561125e57600080fd5b50610768601d5481565b34801561127457600080fd5b50610fb6611283366004614ded565b613081565b34801561129457600080fd5b506106836112a3366004614efe565b6130bf565b3480156112b457600080fd5b506106836112c3366004614efe565b6131aa565b3480156112d457600080fd5b506106836112e33660046150f4565b6132d7565b3480156112f457600080fd5b5061076860175481565b34801561130a57600080fd5b5061076860135481565b34801561132057600080fd5b5061068361132f366004614ded565b61330f565b34801561134057600080fd5b50610768601e5481565b6005546001600160a01b0316331461137d5760405162461bcd60e51b8152600401611374906151a7565b60405180910390fd5b61138f81670de0b6b3a76400006151f2565b905060006113aa600a54600b546133c490919063ffffffff16565b905060006113cd826113c7600b548661342a90919063ffffffff16565b906134ac565b905060006113ea836113c7600a548761342a90919063ffffffff16565b90506113f5846134ee565b600b5461140290836138b8565b600b55600a5461141290826138b8565b600a5550505050565b60606003805461142a90615209565b80601f016020809104026020016040519081016040528092919081815260200182805461145690615209565b80156114a35780601f10611478576101008083540402835291602001916114a3565b820191906000526020600020905b81548152906001019060200180831161148657829003601f168201915b5050505050905090565b6005546001600160a01b031633146114d75760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b038216600081815260226020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b031633146115605760405162461bcd60e51b8152600401611374906151a7565b60058110156115b15760405162461bcd60e51b815260206004820152601860248201527f63616e206e65766572206265207365742062656c6f77203500000000000000006044820152606401611374565b6115bf81633b9aca006151f2565b60295550565b60006115d23384846138fa565b5060015b92915050565b6005546001600160a01b031633146116065760405162461bcd60e51b8152600401611374906151a7565b60008281526026602052604090205481900361162157600080fd5b60648111156116725760405162461bcd60e51b815260206004820152601e60248201527f5374616b696e6720626f6e75732063616e2774206578636565642031303000006044820152606401611374565b60008281526026602090815260409182902083905581518481529081018390527f065c0eec5c5d031ee25323575d53db5536226ab058b74d8bdb03c517dd4f605d910160405180910390a15050565b6005546001600160a01b031633146116eb5760405162461bcd60e51b8152600401611374906151a7565b805182511461173c5760405162461bcd60e51b815260206004820152601e60248201527f417272617973206d757374206265207468652073616d65206c656e67746800006044820152606401611374565b60c8825111156117995760405162461bcd60e51b815260206004820152602260248201527f57616c6c657473206c697374206c656e677468206d757374206265203c3d2032604482015261030360f41b6064820152608401611374565b60005b825181101561188d5760008382815181106117b9576117b9615243565b6020026020010151905060008383815181106117d7576117d7615243565b6020026020010151670de0b6b3a76400006117f291906151f2565b90506117ff338383613a1f565b600e546001600160a01b031663e30443bc8361181a816120da565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561186057600080fd5b505af1158015611874573d6000803e3d6000fd5b505050505050808061188590615259565b91505061179c565b505050565b600061189f848484613b28565b6118f184336118ec856040518060600160405280602881526020016154f5602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190614695565b6138fa565b5060019392505050565b600e54604080516304b9a6b360e31b815290516000926001600160a01b0316916325cd35989160048083019260209291908290030181865afa158015611945573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119699190615272565b905090565b600e54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa1580156119b8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611969919061528f565b6005546001600160a01b03163314611a065760405162461bcd60e51b8152600401611374906151a7565b600e54604051633599bb1760e01b815282151560048201526001600160a01b0390911690633599bb17906024015b600060405180830381600087803b158015611a4e57600080fd5b505af1158015611a62573d6000803e3d6000fd5b5050505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916115d29185906118ec90866133c4565b6012546001600160a01b03163314611ac95760405162461bcd60e51b8152600401611374906152a8565b611ad382826146cf565b5050565b6005546001600160a01b03163314611b015760405162461bcd60e51b8152600401611374906151a7565b600e546040516281ffbb60e71b815282151560048201526001600160a01b03909116906340ffdd8090602401611a34565b6005546001600160a01b03163314611b5c5760405162461bcd60e51b8152600401611374906151a7565b602e8054610100600160a81b0319166101006001600160a01b0384169081029190911790915515611bee576001600160a01b038181166000818152602f602090815260408083208054600160ff19918216811790925560229093529281902080549092169092179055600e54905163031e79db60e41b81526004810192909252909116906331e79db090602401611a34565b50565b6012546001600160a01b03163314611c1b5760405162461bcd60e51b8152600401611374906152a8565b611bee3382614833565b600e5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af1158015611c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bee91906152ef565b6005546001600160a01b03163314611cc45760405162461bcd60e51b8152600401611374906151a7565b600e54604051635a84c5eb60e01b8152600481018390526001600160a01b0390911690635a84c5eb90602401611a34565b6005546001600160a01b03163314611d1f5760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b038116600081815260226020908152604091829020805460ff19166001179055600f80546001600160a01b0319168417905590519182527faacebbe32c0dbd14817cfb53e3cc8be68c7e133928317145be50a0d86c22443391015b60405180910390a150565b6005546001600160a01b03163314611db65760405162461bcd60e51b8152600401611374906151a7565b600e54604051635ebf4db960e01b8152600481018390526001600160a01b0390911690635ebf4db990602401611a34565b6005546001600160a01b03163314611e115760405162461bcd60e51b8152600401611374906151a7565b611e2381670de0b6b3a76400006151f2565b60145550565b600e54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa1580156119b8573d6000803e3d6000fd5b6005546001600160a01b03163314611e9d5760405162461bcd60e51b8152600401611374906151a7565b6028805460ff1916911515919091179055565b600e546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa158015611efc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d6919061528f565b600e54604051636d48467b60e01b81526001600160a01b0383811660048301526000921690636d48467b906024015b602060405180830381865afa158015611f6c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d691906152ef565b6005546001600160a01b03163314611fba5760405162461bcd60e51b8152600401611374906151a7565b601280546001600160a01b0319166001600160a01b0383169081179091556040519081527ff7e059f82bd20d2e2af76029a2174fc736dbbdb71beefa4f382ae40dea52a96d90602001611d81565b600e546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af115801561205b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207f919061530c565b604080518481526020810184905290810182905260608101889052929550909350915032906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6001600160a01b031660009081526020819052604090205490565b6005546001600160a01b0316331461211f5760405162461bcd60e51b8152600401611374906151a7565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b031633146121935760405162461bcd60e51b8152600401611374906151a7565b600e5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401611a34565b6005546001600160a01b031633146121ef5760405162461bcd60e51b8152600401611374906151a7565b600e5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401600060405180830381600087803b15801561223657600080fd5b505af115801561224a573d6000803e3d6000fd5b5050506001600160a01b0382166000908152602260205260409020805460ff1916600117905550611bee816130bf565b6005546001600160a01b031633146122a45760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b03919091166000908152602760205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146122f95760405162461bcd60e51b8152600401611374906151a7565b601a8a9055601b869055601c84905560198890556018879055601689905560178590556015839055601d829055601e8190556123438761233d83818d81898c6133c4565b906133c4565b600c8190555061237260195461233d601d5461233d601a5461233d601b54601c546133c490919063ffffffff16565b600d55600c54600a1080159061238b5750600a600d5411155b6123e85760405162461bcd60e51b815260206004820152602860248201527f746f74616c20666565732063616e6e6f7420657863656564203130252073656c6044820152676c206f722062757960c01b6064820152608401611374565b601654601754601554601854601954601a54601b54601c54601d54601e54604080519a8b5260208b0199909952978901969096526060880194909452608087019290925260a086015260c085015260e08401526101008301526101208201527f07cec4532bdb36ce729ae72905c09f7bfbf8682c2cc2f1999f745188d9975122906101400160405180910390a150505050505050505050565b6005546001600160a01b031633146124ab5760405162461bcd60e51b8152600401611374906151a7565b60058111156124fc5760405162461bcd60e51b815260206004820152601d60248201527f7472616e73666572206665652063616e6e6f74206578636565642035250000006044820152606401611374565b601f8190556040518181527f6fbeac6c79c640ca4f5f47271bd7a36c7eb83076224c65a3b3378c884472034390602001611d81565b600e54604051638bc1d63960e01b815233600482015282151560248201526001600160a01b0390911690638bc1d63990604401611a34565b6005546001600160a01b031633146125935760405162461bcd60e51b8152600401611374906151a7565b62030d4081101580156125a95750620f42408111155b6125b257600080fd5b60215460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3602155565b60606004805461142a90615209565b6005546001600160a01b0316331461261e5760405162461bcd60e51b8152600401611374906151a7565b611ad38282614979565b6005546001600160a01b031633146126525760405162461bcd60e51b8152600401611374906151a7565b600e54604051634e19b97560e11b815282151560048201526001600160a01b0390911690639c3372ea90602401611a34565b6005546001600160a01b031633146126ae5760405162461bcd60e51b8152600401611374906151a7565b801515600960159054906101000a900460ff161515036126cd57600080fd5b60098054821515600160a81b0260ff60a81b199091161790556040517f0d240c24014ec8c204fc1bdcc286f7d01fd2ab6a07c558a9b2d3f12904323a8790611d8190831515815260200190565b6005546001600160a01b031633146127445760405162461bcd60e51b8152600401611374906151a7565b600e54604051630928847160e01b81526001600160a01b03838116600483015290911690630928847190602401600060405180830381600087803b15801561278b57600080fd5b505af115801561279f573d6000803e3d6000fd5b5050600e546001600160a01b0316915063e30443bc9050826127c081614a42565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611a34565b60006115d233846118ec8560405180606001604052806025815260200161551d602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190614695565b6005546001600160a01b0316331461286a5760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b038116600081815260226020908152604091829020805460ff19166001179055601180546001600160a01b0319168417905590519182527f06e7b14d4e52e36121e7de8c30e9f25ac28e251b168255f629fe15b7a44e9d909101611d81565b600954600160a81b900460ff166129225760405162461bcd60e51b815260206004820152601660248201527514dd185ada5b99c81a5cc81b9bdd08195b98589b195960521b6044820152606401611374565b600081815260266020526040812054900361297f5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964207374616b696e67206475726174696f6e00000000000000006044820152606401611374565b61298942826133c4565b33600090815260256020526040902054106129f25760405162461bcd60e51b8152602060048201526024808201527f616c7265616479207374616b656420666f722061206c6f6e67657220647572616044820152633a34b7b760e11b6064820152608401611374565b600081815260266020908152604080832054338452602490925290912055612a1a42826133c4565b33600081815260256020526040902091909155600e546001600160a01b03169063e30443bc90612a4981614a42565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015612a8f57600080fd5b505af1158015612aa3573d6000803e3d6000fd5b50505050612aae3390565b6001600160a01b03167f13dd201d7da4f9b31a9064a09abc1a6ce420dacd837a77abafaec5bd9d28d2c882604051612ae891815260200190565b60405180910390a250565b600e546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611edf565b60006115d2338484613b28565b6005546001600160a01b03163314612b5d5760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b03919091166000908152602f60205260409020805460ff1916911515919091179055565b600e5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283929091169063fbcbc0f1906024015b60c060405180830381865afa158015612be0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c04919061533a565b949c939b5091995097509550909350915050565b6005546001600160a01b03163314612c425760405162461bcd60e51b8152600401611374906151a7565b61012c811115612ca35760405162461bcd60e51b815260206004820152602660248201527f636f6f6c646f776e2074696d65722063616e6e6f74206578636565642035206d604482015265696e7574657360d01b6064820152608401611374565b602d55565b600e5460405163ba079d4960e01b81526001600160a01b038381166004830152600092169063ba079d4990602401611f4f565b6005546001600160a01b03163314612d055760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b0381811660008181526027602090815260408083208054600160ff19918216811790925560229093529281902080549092169092179055600e54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b158015612d8157600080fd5b505af1158015612d95573d6000803e3d6000fd5b50506040516001600160a01b03841681527f85d097e432d8e396fa72c83ebd34196326e1cf1694ef910cd53554b2ee7597c592506020019050611d81565b6005546001600160a01b03163314612dfd5760405162461bcd60e51b8152600401611374906151a7565b60205481151560ff909116151503612e1457600080fd5b6020805460ff191682151590811782556040519081527fff5917043f8453af413305b2dbd1ed9748a37df481beb71ba4b9b212a07b9bef9101611d81565b6005546001600160a01b03163314612e7c5760405162461bcd60e51b8152600401611374906151a7565b602e5460ff1615612e8c57600080fd5b602e805460ff19166001179055565b6005546001600160a01b03163314612ec55760405162461bcd60e51b8152600401611374906151a7565b600e5460405163d8032ed360e01b81526001600160a01b0383811660048301529091169063d8032ed390602401600060405180830381600087803b158015612f0c57600080fd5b505af1158015612f20573d6000803e3d6000fd5b50506040516001600160a01b03841681527f7597aa09105646b4cc4486748aecd1d7c5dbcbb7bbe2863c3fc27e613b64432d92506020019050611d81565b6005546001600160a01b03163314612f885760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b038116600081815260226020908152604091829020805460ff19166001179055601080546001600160a01b0319168417905590519182527f53d9cb67443c6a2c0526b12e1c2419b7ca317c61a49da6b787ab91118f47762b9101611d81565b600e546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa1580156119b8573d6000803e3d6000fd5b6005546001600160a01b031633146130625760405162461bcd60e51b8152600401611374906151a7565b6a084595161401484a000000600754111561307c57600080fd5b600755565b600e54604051635183d6fd60e01b815260048101839052600091829182918291829182916001600160a01b0390911690635183d6fd90602401612bc3565b6005546001600160a01b031633146130e95760405162461bcd60e51b8152600401611374906151a7565b6001600160a01b03811661314e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611374565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146131d45760405162461bcd60e51b8152600401611374906151a7565b602e8054610100600160a81b0319166101006001600160a01b0384169081029190911790915515613294576001600160a01b038181166000818152602f602090815260408083208054600160ff19918216811790925560229093529281902080549092169092179055600e54905163031e79db60e41b81526004810192909252909116906331e79db090602401600060405180830381600087803b15801561327b57600080fd5b505af115801561328f573d6000803e3d6000fd5b505050505b43602c556009805460ff60b01b1916600160b01b1790556040517f799663458a5ef2936f7fa0c99b3336c69c25890f82974f04e811e5bb359186c790600090a150565b600e54604051632c8be28160e21b815233600482015282151560248201526001600160a01b039091169063b22f8a0490604401611a34565b6005546001600160a01b031633146133395760405162461bcd60e51b8152600401611374906151a7565b61334b81670de0b6b3a76400006151f2565b90506103e860025461335d919061538d565b8110156133bf5760405162461bcd60e51b815260206004820152602a60248201527f6d61782077616c6c65742063616e6e6f742062652073657420746f206c657373604482015269207468616e20302e312560b01b6064820152608401611374565b601355565b6000806133d183856153af565b9050838110156134235760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401611374565b9392505050565b60008260000361343c575060006115d6565b600061344883856151f2565b905082613455858361538d565b146134235760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401611374565b600061342383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250614a9b565b806000036134f95750565b61350281614ac9565b600061351b600a54600b546133c490919063ffffffff16565b601c54909150600190819081908190600090819081901561358b57613588601954601d54601a54601c5461354f91906153af565b61355991906153af565b61356391906153af565b6113c7601c546135828c6113c7600b544761342a90919063ffffffff16565b9061342a565b91505b601554156135e2576135df601854601e546016546015546135ac91906153af565b6135b691906153af565b6135c091906153af565b6113c76015546135828c6113c7600a544761342a90919063ffffffff16565b90505b6135ec82826133c4565b9250821561364c57600e546040516001600160a01b03909116908490600081818185875af1925050503d8060008114613641576040519150601f19603f3d011682016040523d82523d6000602084013e613646565b606091505b50909750505b600061366b60195461233d601d54601a546133c490919063ffffffff16565b61368860185461233d601e546016546133c490919063ffffffff16565b61369291906153af565b9050600081156136a9576136a647836134ac565b90505b6000816136c3601654601a546133c490919063ffffffff16565b6136cd91906151f2565b90506000826136e9601e54601d546133c490919063ffffffff16565b6136f391906151f2565b905060008361370f6018546019546133c490919063ffffffff16565b61371991906151f2565b9050821561377957600f546040516001600160a01b03909116908490600081818185875af1925050503d806000811461376e576040519150601f19603f3d011682016040523d82523d6000602084013e613773565b606091505b50909b50505b81156137d7576010546040516001600160a01b03909116908390600081818185875af1925050503d80600081146137cc576040519150601f19603f3d011682016040523d82523d6000602084013e6137d1565b606091505b50909a50505b8015613835576011546040516001600160a01b03909116908290600081818185875af1925050503d806000811461382a576040519150601f19603f3d011682016040523d82523d6000602084013e61382f565b606091505b50909950505b7f8e09ec88c0d24c22e3a9b8555c029afcc4a7c609daabf6d7849e814c2d14efd0888261386285876153af565b61386c91906153af565b8e801561387657508d5b801561387f57508c5b801561388857508b5b60408051938452602084019290925215159082015260600160405180910390a15050505050505050505050505050565b600061342383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614695565b6001600160a01b03831661395c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611374565b6001600160a01b0382166139bd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611374565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316613a455760405162461bcd60e51b8152600401611374906153c2565b6001600160a01b038216613a6b5760405162461bcd60e51b815260040161137490615407565b613aa8816040518060600160405280602681526020016154cf602691396001600160a01b0386166000908152602081905260409020549190614695565b6001600160a01b038085166000908152602081905260408082209390935590841681522054613ad790826133c4565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101613a12565b6001600160a01b038316613b4e5760405162461bcd60e51b8152600401611374906153c2565b6001600160a01b038216613b745760405162461bcd60e51b815260040161137490615407565b6009546001600160a01b0390811690831603613bca5760405162461bcd60e51b8152602060048201526015602482015274536f72727920536572204e4f204275726e696e672160581b6044820152606401611374565b6001600160a01b038316600090815260276020526040812054819081908190819060ff16613c4b57600954600160b01b900460ff16613c4b5760405162461bcd60e51b815260206004820181905260248201527f54726164696e6720686173206e6f7420796574206265656e20656e61626c65646044820152606401611374565b602e5460ff16158015613c6d5750602e5461010090046001600160a01b031615155b15613d0457613c7c8888614c23565b1580613ca057506001600160a01b0388166000908152602f602052604090205460ff165b80613cc357506001600160a01b0387166000908152602f602052604090205460ff165b613d045760405162461bcd60e51b815260206004820152601260248201527121617661696c61626c652074726164696e6760701b6044820152606401611374565b85600003613d2257613d1888886000613a1f565b5050505050505050565b600954600160a01b900460ff16158015613d5557506001600160a01b03881660009081526022602052604090205460ff16155b8015613d7a57506001600160a01b03871660009081526022602052604090205460ff16155b156144c5576001600160a01b0380881660009081526023602052604080822054928b16825290205460ff918216911680158015613db5575081155b15613efb576000613dd660646113c7601f548c61342a90919063ffffffff16565b9050613de289826138b8565b9850613def8b3083613a1f565b613dfa8b8b8b613a1f565b600e546001600160a01b031663e30443bc8c613e1581614a42565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613e5b57600080fd5b505af1158015613e6f573d6000803e3d6000fd5b5050600e546001600160a01b0316915063e30443bc90508b613e9081614a42565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015613ed657600080fd5b505af1158015613eea573d6000803e3d6000fd5b505050505050505050505050505050565b80158015613f125750600954600160a81b900460ff165b15613fc9576001600160a01b038a16600090815260256020526040902054421015613f7f5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320617265207374616b656420616e64206c6f636b6564210000006044820152606401611374565b6001600160a01b038a1660009081526025602052604090205415613fc4576001600160a01b038a16600090815260256020908152604080832083905560249091528120555b614222565b811561407257601554601854601654601754601e54602854949b509299509097509550935060ff1615613fc457602d54326000908152602b602052604090205461401391906153af565b42101561405b5760405162461bcd60e51b8152602060048201526016602482015275636f6f6c646f776e20706572696f642061637469766560501b6044820152606401611374565b326000908152602b60205260409020429055614222565b801561422257601c54601954601a54601b54601d54602854949b509299509097509550935060ff16156141ab57602c546140ad9060026153af565b43116140f05760405162461bcd60e51b8152602060048201526012602482015271796f75207368616c6c206e6f74207061737360701b6044820152606401611374565b6029543a11156141425760405162461bcd60e51b815260206004820152601860248201527f4761732070726963652065786365656473206c696d69742e00000000000000006044820152606401611374565b326000908152602a60205260409020544390036141985760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e7920545820696e20626c6f636b60601b6044820152606401611374565b326000908152602a602052604090204390555b60006141b68a6120da565b6013549091506141c68a836153af565b11156142205760405162461bcd60e51b8152602060048201526024808201527f45786365656473206d6178696d756d2077616c6c657420746f6b656e20616d6f6044820152633ab73a1760e11b6064820152608401611374565b505b600061424e878561423389896153af565b61423d91906153af565b61424791906153af565b89906133c4565b9050600061425b306120da565b6014549091508110801590819061428b57506001600160a01b038d1660009081526023602052604090205460ff16155b156143a4576009805460ff60a01b1916600160a01b17905560205460ff1680156142b55750600087115b80156142c357506000600d54115b156143755760006142e1600a54600b546133c490919063ffffffff16565b905060006142fe826113c7600b548761342a90919063ffffffff16565b9050600061431b836113c7600a548861342a90919063ffffffff16565b90506000614338600d546113c78d8661342a90919063ffffffff16565b90506000614355600c546113c78e8661342a90919063ffffffff16565b9050600061436382846133c4565b905061436e81614c98565b5050505050505b6000614380306120da565b905061438b816134ee565b506001600b819055600a556009805460ff60a01b191690555b60006143b560646113c78e8761342a565b90506143c18c826138b8565b9b5085156143de57600a546143d690826133c4565b600a556143ef565b600b546143eb90826133c4565b600b555b6143fa8e3083613a1f565b602154600e546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015614467575060408051601f3d908101601f191682019092526144649181019061530c565b60015b156144bd5760408051848152602081018490529081018290526060810185905232906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505050505050505b6144d0888888613a1f565b600e546001600160a01b031663e30443bc896144eb81614a42565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561453157600080fd5b505af1158015614545573d6000803e3d6000fd5b5050600e546001600160a01b0316915063e30443bc90508861456681614a42565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156145ac57600080fd5b505af11580156145c0573d6000803e3d6000fd5b50506006546001600160a01b038b81169116148015925090506145fc57506001600160a01b03881660009081526023602052604090205460ff16155b801561461a5750602e546001600160a01b0388811661010090920416145b15613d1857602e54604051633fb6b04560e11b8152600481018890526001600160a01b038a8116602483015261010090920490911690637f6d608a90604401600060405180830381600087803b15801561467357600080fd5b505af1158015614687573d6000803e3d6000fd5b505050505050505050505050565b600081848411156146b95760405162461bcd60e51b81526004016113749190614e06565b5060006146c6848661544a565b95945050505050565b6001600160a01b0382166147255760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401611374565b8060025461473391906153af565b60075410156147aa5760405162461bcd60e51b815260206004820152603e60248201527f4d696e74206572726f722120416d6f756e742063616e2774206265206d6f726560448201527f207468616e2074686520746f74616c20737570706c79206f6e204253432100006064820152608401611374565b80600260008282546147bc91906153af565b90915550506001600160a01b038216600090815260208190526040812080548392906147e99084906153af565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166148935760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401611374565b6001600160a01b038216600090815260208190526040902054818110156149075760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401611374565b6001600160a01b038316600090815260208190526040812083830390556002805484929061493690849061544a565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001613a12565b6001600160a01b0382166000908152602360205260409020805460ff19168215801591909117909155614a0657600e5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156149ed57600080fd5b505af1158015614a01573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b600954600090600160a81b900460ff16614a6457614a5f826120da565b6115d6565b6001600160a01b0382166000908152602460205260409020546115d6906064906113c790614a9290836133c4565b613582866120da565b60008183614abc5760405162461bcd60e51b81526004016113749190614e06565b5060006146c6848661538d565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110614afe57614afe615243565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614b57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b7b9190615272565b81600181518110614b8e57614b8e615243565b6001600160a01b039283166020918202929092010152600654614bb491309116846138fa565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790614bed90859060009086903090429060040161545d565b600060405180830381600087803b158015614c0757600080fd5b505af1158015614c1b573d6000803e3d6000fd5b505050505050565b6001600160a01b03821660009081526023602052604081205460ff168015614c5957506006546001600160a01b03838116911614155b15614c66575060016115d6565b6001600160a01b03821660009081526023602052604090205460ff1615614c8f575060026115d6565b50600092915050565b6000614ca58260026134ac565b90506000614cb383836138b8565b905047614cbf83614ac9565b6000614ccb47836138b8565b9050614cd78382614d1f565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b600654614d379030906001600160a01b0316846138fa565b6006546001600160a01b031663f305d719823085600080614d606005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af1158015614dc8573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611a62919061530c565b600060208284031215614dff57600080fd5b5035919050565b600060208083528351808285015260005b81811015614e3357858101830151858201604001528201614e17565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114611bee57600080fd5b8015158114611bee57600080fd5b60008060408385031215614e8a57600080fd5b8235614e9581614e54565b91506020830135614ea581614e69565b809150509250929050565b60008060408385031215614ec357600080fd5b8235614ece81614e54565b946020939093013593505050565b60008060408385031215614eef57600080fd5b50508035926020909101359150565b600060208284031215614f1057600080fd5b813561342381614e54565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715614f5a57614f5a614f1b565b604052919050565b600067ffffffffffffffff821115614f7c57614f7c614f1b565b5060051b60200190565b600082601f830112614f9757600080fd5b81356020614fac614fa783614f62565b614f31565b82815260059290921b84018101918181019086841115614fcb57600080fd5b8286015b84811015614fe65780358352918301918301614fcf565b509695505050505050565b6000806040838503121561500457600080fd5b823567ffffffffffffffff8082111561501c57600080fd5b818501915085601f83011261503057600080fd5b81356020615040614fa783614f62565b82815260059290921b8401810191818101908984111561505f57600080fd5b948201945b8386101561508657853561507781614e54565b82529482019490820190615064565b9650508601359250508082111561509c57600080fd5b506150a985828601614f86565b9150509250929050565b6000806000606084860312156150c857600080fd5b83356150d381614e54565b925060208401356150e381614e54565b929592945050506040919091013590565b60006020828403121561510657600080fd5b813561342381614e69565b6000806000806000806000806000806101408b8d03121561513157600080fd5b505088359a60208a01359a5060408a013599606081013599506080810135985060a0810135975060c0810135965060e081013595506101008101359450610120013592509050565b6000806040838503121561518c57600080fd5b823561519781614e54565b91506020830135614ea581614e54565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b80820281158282048414176115d6576115d66151dc565b600181811c9082168061521d57607f821691505b60208210810361523d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006001820161526b5761526b6151dc565b5060010190565b60006020828403121561528457600080fd5b815161342381614e54565b6000602082840312156152a157600080fd5b5051919050565b60208082526027908201527f6f6e6c7920627269646765206861732061636365737320746f207468697320666040820152663ab731ba34b7b760c91b606082015260800190565b60006020828403121561530157600080fd5b815161342381614e69565b60008060006060848603121561532157600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c0878903121561535357600080fd5b865161535e81614e54565b6020880151604089015160608a015160808b015160a0909b0151939c929b509099909850965090945092505050565b6000826153aa57634e487b7160e01b600052601260045260246000fd5b500490565b808201808211156115d6576115d66151dc565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b818103818111156115d6576115d66151dc565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156154ad5784516001600160a01b031683529383019391830191600101615488565b50506001600160a01b0396909616606085015250505060800152939250505056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220d7c77e9bf639fded488899cea11091b7f4f55283939794bd85e0ba408f6421a964736f6c63430008110033

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

0000000000000000000000007299336e094dd0f5a74f6bdcbfe7fecc401b81c4

-----Decoded View---------------
Arg [0] : _bridge (address): 0x7299336E094dd0f5a74f6bdCbfE7fECc401b81C4

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000007299336e094dd0f5a74f6bdcbfe7fecc401b81c4


Deployed Bytecode Sourcemap

25410:33903:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25630:64;;;;;;;;;;-1:-1:-1;25630:64:0;;;;-1:-1:-1;;;;;25630:64:0;;;;;;-1:-1:-1;;;;;178:32:1;;;160:51;;148:2;133:18;25630:64:0;;;;;;;;55834:443;;;;;;;;;;-1:-1:-1;55834:443:0;;;;;:::i;:::-;;:::i;:::-;;5587:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;38008:181::-;;;;;;;;;;-1:-1:-1;38008:181:0;;;;;:::i;:::-;;:::i;39003:164::-;;;;;;;;;;-1:-1:-1;39003:164:0;;;;;:::i;:::-;;:::i;6642:210::-;;;;;;;;;;-1:-1:-1;6642:210:0;;;;;:::i;:::-;;:::i;:::-;;;2091:14:1;;2084:22;2066:41;;2054:2;2039:18;6642:210:0;1926:187:1;35124:326:0;;;;;;;;;;-1:-1:-1;35124:326:0;;;;;:::i;:::-;;:::i;25489:41::-;;;;;;;;;;-1:-1:-1;25489:41:0;;;;-1:-1:-1;;;;;25489:41:0;;;5908:108;;;;;;;;;;-1:-1:-1;5996:12:0;;5908:108;;;2752:25:1;;;2740:2;2725:18;5908:108:0;2606:177:1;26412:29:0;;;;;;;;;;;;;;;;27774:33;;;;;;;;;;;;;;;;25850:28;;;;;;;;;;;;;;;;26448;;;;;;;;;;;;;;;;27903:55;;;;;;;;;;-1:-1:-1;27903:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;58673:637;;;;;;;;;;-1:-1:-1;58673:637:0;;;;;:::i;:::-;;:::i;6860:454::-;;;;;;;;;;-1:-1:-1;6860:454:0;;;;;:::i;:::-;;:::i;54817:114::-;;;;;;;;;;;;;:::i;25960:47::-;;;;;;;;;;-1:-1:-1;25960:47:0;;;;-1:-1:-1;;;;;25960:47:0;;;44117:141;;;;;;;;;;;;;:::i;32925:93::-;;;;;;;;;;-1:-1:-1;32925:93:0;;33008:2;6379:36:1;;6367:2;6352:18;32925:93:0;6237:184:1;46564:119:0;;;;;;;;;;-1:-1:-1;46564:119:0;;;;;:::i;:::-;;:::i;7322:300::-;;;;;;;;;;-1:-1:-1;7322:300:0;;;;;:::i;:::-;;:::i;25814:29::-;;;;;;;;;;;;;;;;33766:118;;;;;;;;;;-1:-1:-1;33766:118:0;;;;;:::i;:::-;;:::i;41251:121::-;;;;;;;;;;-1:-1:-1;41251:121:0;;;;;:::i;:::-;;:::i;36554:318::-;;;;;;;;;;-1:-1:-1;36554:318:0;;;;;:::i;:::-;;:::i;34702:102::-;;;;;;;;;;-1:-1:-1;34702:102:0;;;;;:::i;:::-;;:::i;27160:49::-;;;;;;;;;;-1:-1:-1;27160:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;25595:28;;;;;;;;;;-1:-1:-1;25595:28:0;;;;-1:-1:-1;;;;;25595:28:0;;;27422:33;;;;;;;;;;-1:-1:-1;27422:33:0;;;;;;;;26695:40;;;;;;;;;;-1:-1:-1;26695:40:0;;;;;;;;25771:34;;;;;;;;;;-1:-1:-1;25771:34:0;;;;-1:-1:-1;;;25771:34:0;;;;;;44266:92;;;;;;;;;;-1:-1:-1;44340:10:0;;44266:92;;45933:103;;;;;;;;;;;;;:::i;44370:126::-;;;;;;;;;;-1:-1:-1;44370:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;44460:28:0;44436:4;44460:28;;;:19;:28;;;;;;;;;44370:126;26483:31;;;;;;;;;;;;;;;;54939:183;;;;;;;;;;-1:-1:-1;54939:183:0;;;;;:::i;:::-;;:::i;37256:205::-;;;;;;;;;;-1:-1:-1;37256:205:0;;;;;:::i;:::-;;:::i;55130:175::-;;;;;;;;;;-1:-1:-1;55130:175:0;;;;;:::i;:::-;;:::i;40607:120::-;;;;;;;;;;-1:-1:-1;40607:120:0;;;;;:::i;:::-;;:::i;46182:142::-;;;;;;;;;;;;;:::i;38875:99::-;;;;;;;;;;-1:-1:-1;38875:99:0;;;;;:::i;:::-;;:::i;44696:171::-;;;;;;;;;;-1:-1:-1;44696:171:0;;;;;:::i;:::-;;:::i;46691:185::-;;;;;;;;;;-1:-1:-1;46691:185:0;;;;;:::i;:::-;;:::i;34983:125::-;;;;;;;;;;-1:-1:-1;34983:125:0;;;;;:::i;:::-;;:::i;5238:44::-;;;;;;;;;;-1:-1:-1;5238:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;45515:410;;;;;;;;;;-1:-1:-1;45515:410:0;;;;;:::i;:::-;;:::i;6024:177::-;;;;;;;;;;-1:-1:-1;6024:177:0;;;;;:::i;:::-;;:::i;13001:148::-;;;;;;;;;;;;;:::i;38238:127::-;;;;;;;;;;-1:-1:-1;38238:127:0;;;;;:::i;:::-;;:::i;41917:208::-;;;;;;;;;;-1:-1:-1;41917:208:0;;;;;:::i;:::-;;:::i;26016:38::-;;;;;;;;;;-1:-1:-1;26016:38:0;;;;-1:-1:-1;;;;;26016:38:0;;;26558:28;;;;;;;;;;;;;;;;27839:32;;;;;;;;;;-1:-1:-1;27839:32:0;;;;;;;;27102:51;;;;;;;;;;-1:-1:-1;27102:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;38666:170;;;;;;;;;;-1:-1:-1;38666:170:0;;;;;:::i;:::-;;:::i;42375:1536::-;;;;;;;;;;-1:-1:-1;42375:1536:0;;;;;:::i;:::-;;:::i;42133:234::-;;;;;;;;;;-1:-1:-1;42133:234:0;;;;;:::i;:::-;;:::i;46332:109::-;;;;;;;;;;-1:-1:-1;46332:109:0;;;;;:::i;:::-;;:::i;41668:241::-;;;;;;;;;;-1:-1:-1;41668:241:0;;;;;:::i;:::-;;:::i;12787:79::-;;;;;;;;;;-1:-1:-1;12852:6:0;;-1:-1:-1;;;;;12852:6:0;12787:79;;26335:32;;;;;;;;;;;;;;;;5695:104;;;;;;;;;;;;;:::i;40951:163::-;;;;;;;;;;-1:-1:-1;40951:163:0;;;;;:::i;:::-;;:::i;26793:40::-;;;;;;;;;;;;;;;;41122:121;;;;;;;;;;-1:-1:-1;41122:121:0;;;;;:::i;:::-;;:::i;39727:176::-;;;;;;;;;;-1:-1:-1;39727:176:0;;;;;:::i;:::-;;:::i;38403:201::-;;;;;;;;;;-1:-1:-1;38403:201:0;;;;;:::i;:::-;;:::i;7630:400::-;;;;;;;;;;-1:-1:-1;7630:400:0;;;;;:::i;:::-;;:::i;37507:199::-;;;;;;;;;;-1:-1:-1;37507:199:0;;;;;:::i;:::-;;:::i;39911:662::-;;;;;;;;;;-1:-1:-1;39911:662:0;;;;;:::i;:::-;;:::i;44504:184::-;;;;;;;;;;-1:-1:-1;44504:184:0;;;;;:::i;:::-;;:::i;6209:216::-;;;;;;;;;;-1:-1:-1;6209:216:0;;;;;:::i;:::-;;:::i;35801:143::-;;;;;;;;;;-1:-1:-1;35801:143:0;;;;;:::i;:::-;;:::i;43919:190::-;;;;;;;;;;-1:-1:-1;43919:190:0;;;;;:::i;:::-;-1:-1:-1;;;;;44052:25:0;44010:7;44052:25;;;:16;:25;;;;;;;;;44079:12;:21;;;;;;;44052:25;;43919:190;;;;;7874:25:1;;;7930:2;7915:18;;7908:34;;;;7847:18;43919:190:0;7700:248:1;26660:26:0;;;;;;;;;;;;;;;;44875:307;;;;;;;;;;-1:-1:-1;44875:307:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;8254:32:1;;;8236:51;;8318:2;8303:18;;8296:34;;;;8346:18;;;8339:34;;;;8404:2;8389:18;;8382:34;8447:3;8432:19;;8425:35;8274:3;8476:19;;8469:35;8223:3;8208:19;44875:307:0;7953:557:1;27741:26:0;;;;;;;;;;;;;;;;26956:57;;;;;;;;;;-1:-1:-1;26956:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39254:174;;;;;;;;;;-1:-1:-1;39254:174:0;;;;;:::i;:::-;;:::i;46884:127::-;;;;;;;;;;-1:-1:-1;46884:127:0;;;;;:::i;:::-;;:::i;26299:29::-;;;;;;;;;;;;;;;;36943:268;;;;;;;;;;-1:-1:-1;36943:268:0;;;;;:::i;:::-;;:::i;40735:208::-;;;;;;;;;;-1:-1:-1;40735:208:0;;;;;:::i;:::-;;:::i;35960:146::-;;;;;;;;;;;;;:::i;54651:158::-;;;;;;;;;;-1:-1:-1;54651:158:0;;;;;:::i;:::-;;:::i;26061:34::-;;;;;;;;;;-1:-1:-1;26061:34:0;;;;-1:-1:-1;;;;;26061:34:0;;;6433:201;;;;;;;;;;-1:-1:-1;6433:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;6599:18:0;;;6567:7;6599:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;6433:201;26102:36;;;;;;;;;;-1:-1:-1;26102:36:0;;;;-1:-1:-1;;;;;26102:36:0;;;26259:33;;;;;;;;;;;;;;;;37759:193;;;;;;;;;;-1:-1:-1;37759:193:0;;;;;:::i;:::-;;:::i;46044:130::-;;;;;;;;;;;;;:::i;26145:21::-;;;;;;;;;;-1:-1:-1;26145:21:0;;;;-1:-1:-1;;;;;26145:21:0;;;34820:151;;;;;;;;;;-1:-1:-1;34820:151:0;;;;;:::i;:::-;;:::i;26521:30::-;;;;;;;;;;;;;;;;27048:47;;;;;;;;;;-1:-1:-1;27048:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;26593:26;;;;;;;;;;;;;;;;45190:317;;;;;;;;;;-1:-1:-1;45190:317:0;;;;;:::i;:::-;;:::i;13157:281::-;;;;;;;;;;-1:-1:-1;13157:281:0;;;;;:::i;:::-;;:::i;36122:420::-;;;;;;;;;;-1:-1:-1;36122:420:0;;;;;:::i;:::-;;:::i;46449:107::-;;;;;;;;;;-1:-1:-1;46449:107:0;;;;;:::i;:::-;;:::i;26374:31::-;;;;;;;;;;;;;;;;26228:24;;;;;;;;;;;;;;;;39498:221;;;;;;;;;;-1:-1:-1;39498:221:0;;;;;:::i;:::-;;:::i;26626:27::-;;;;;;;;;;;;;;;;55834:443;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;;;;;;;;;55922:17:::1;:6:::0;55932::::1;55922:17;:::i;:::-;55913:26;;55950:19;55972:25;55986:10;;55972:9;;:13;;:25;;;;:::i;:::-;55950:47;;56008:15;56026:38;56052:11;56026:21;56037:9;;56026:6;:10;;:21;;;;:::i;:::-;:25:::0;::::1;:38::i;:::-;56008:56;;56075:16;56094:39;56121:11;56094:22;56105:10;;56094:6;:10;;:22;;;;:::i;:39::-;56075:58;;56146:28;56167:6;56146:20;:28::i;:::-;56199:9;::::0;:22:::1;::::0;56213:7;56199:13:::1;:22::i;:::-;56187:9;:34:::0;56245:10:::1;::::0;:24:::1;::::0;56260:8;56245:14:::1;:24::i;:::-;56232:10;:37:::0;-1:-1:-1;;;;55834:443:0:o;5587:100::-;5641:13;5674:5;5667:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5587:100;:::o;38008:181::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38092:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;38092:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;38147:34;;2066:41:1;;;38147:34:0::1;::::0;2039:18:1;38147:34:0::1;;;;;;;38008:181:::0;;:::o;39003:164::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;39089:1:::1;39081:4;:9;;39073:46;;;::::0;-1:-1:-1;;;39073:46:0;;10161:2:1;39073:46:0::1;::::0;::::1;10143:21:1::0;10200:2;10180:18;;;10173:30;10239:26;10219:18;;;10212:54;10283:18;;39073:46:0::1;9959:348:1::0;39073:46:0::1;39146:13;:4:::0;39153:6:::1;39146:13;:::i;:::-;39130;:29:::0;-1:-1:-1;39003:164:0:o;6642:210::-;6761:4;6783:39;174:10;6806:7;6815:6;6783:8;:39::i;:::-;-1:-1:-1;6840:4:0;6642:210;;;;;:::o;35124:326::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;35246:24:::1;::::0;;;:14:::1;:24;::::0;;;;;:33;;;35238:42:::1;;;::::0;::::1;;35308:3;35299:5;:12;;35291:55;;;::::0;-1:-1:-1;;;35291:55:0;;10514:2:1;35291:55:0::1;::::0;::::1;10496:21:1::0;10553:2;10533:18;;;10526:30;10592:32;10572:18;;;10565:60;10642:18;;35291:55:0::1;10312:354:1::0;35291:55:0::1;35357:24;::::0;;;:14:::1;:24;::::0;;;;;;;;:32;;;35405:37;;7874:25:1;;;7915:18;;;7908:34;;;35405:37:0::1;::::0;7847:18:1;35405:37:0::1;;;;;;;35124:326:::0;;:::o;58673:637::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;58845:6:::1;:13;58820:14;:21;:38;58812:80;;;::::0;-1:-1:-1;;;58812:80:0;;10873:2:1;58812:80:0::1;::::0;::::1;10855:21:1::0;10912:2;10892:18;;;10885:30;10951:32;10931:18;;;10924:60;11001:18;;58812:80:0::1;10671:354:1::0;58812:80:0::1;58936:3;58911:14;:21;:28;;58903:75;;;::::0;-1:-1:-1;;;58903:75:0;;11232:2:1;58903:75:0::1;::::0;::::1;11214:21:1::0;11271:2;11251:18;;;11244:30;11310:34;11290:18;;;11283:62;-1:-1:-1;;;11361:18:1;;;11354:32;11403:19;;58903:75:0::1;11030:398:1::0;58903:75:0::1;58994:9;58989:314;59013:14;:21;59009:1;:25;58989:314;;;59056:14;59073;59088:1;59073:17;;;;;;;;:::i;:::-;;;;;;;59056:34;;59105:21;59129:6;59136:1;59129:9;;;;;;;;:::i;:::-;;;;;;;59142:6;59129:20;;;;:::i;:::-;59105:44;;59164:50;59180:10;59192:6;59200:13;59164:15;:50::i;:::-;59229:15;::::0;-1:-1:-1;;;;;59229:15:0::1;:26;59264:6:::0;59273:17:::1;59264:6:::0;59273:9:::1;:17::i;:::-;59229:62;::::0;-1:-1:-1;;;;;;59229:62:0::1;::::0;;;;;;-1:-1:-1;;;;;11765:32:1;;;59229:62:0::1;::::0;::::1;11747:51:1::0;11814:18;;;11807:34;11720:18;;59229:62:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;59041:262;;59036:3;;;;;:::i;:::-;;;;58989:314;;;;58673:637:::0;;:::o;6860:454::-;7000:4;7017:36;7027:6;7035:9;7046:6;7017:9;:36::i;:::-;7064:220;7087:6;174:10;7135:138;7191:6;7135:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7135:19:0;;;;;;:11;:19;;;;;;;;174:10;7135:33;;;;;;;;;;:37;:138::i;:::-;7064:8;:220::i;:::-;-1:-1:-1;7302:4:0;6860:454;;;;;:::o;54817:114::-;54891:15;;:32;;;-1:-1:-1;;;54891:32:0;;;;54864:7;;-1:-1:-1;;;;;54891:15:0;;:30;;:32;;;;;;;;;;;;;;:15;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54884:39;;54817:114;:::o;44117:141::-;44207:15;;:43;;;-1:-1:-1;;;44207:43:0;;;;44180:7;;-1:-1:-1;;;;;44207:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;46564:119::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;46634:15:::1;::::0;:41:::1;::::0;-1:-1:-1;;;46634:41:0;;2091:14:1;;2084:22;46634:41:0::1;::::0;::::1;2066::1::0;-1:-1:-1;;;;;46634:15:0;;::::1;::::0;:34:::1;::::0;2039:18:1;;46634:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46564:119:::0;:::o;7322:300::-;174:10;7437:4;7531:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7531:34:0;;;;;;;;;;7437:4;;7459:133;;7509:7;;7531:50;;7570:10;7531:38;:50::i;33766:118::-;29938:6;;-1:-1:-1;;;;;29938:6:0;29924:10;:20;29916:72;;;;-1:-1:-1;;;29916:72:0;;;;;;;:::i;:::-;33852:24:::1;33858:9;33869:6;33852:5;:24::i;:::-;33766:118:::0;;:::o;41251:121::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;41321:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;41321:43:0;;2091:14:1;;2084:22;41321:43:0::1;::::0;::::1;2066:41:1::0;-1:-1:-1;;;;;41321:15:0;;::::1;::::0;:36:::1;::::0;2039:18:1;;41321:43:0::1;1926:187:1::0;36554:318:0;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;36631:10:::1;:20:::0;;-1:-1:-1;;;;;;36631:20:0::1;;-1:-1:-1::0;;;;;36631:20:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;36666:21;36662:203:::1;;-1:-1:-1::0;;;;;36704:32:0;;::::1;;::::0;;;:23:::1;:32;::::0;;;;;;;:39;;36739:4:::1;-1:-1:-1::0;;36704:39:0;;::::1;::::0;::::1;::::0;;;36758:19:::1;:28:::0;;;;;;;:35;;;;::::1;::::0;;::::1;::::0;;36808:15:::1;::::0;:45;;-1:-1:-1;;;36808:45:0;;::::1;::::0;::::1;160:51:1::0;;;;36808:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;36808:45:0::1;14:203:1::0;36662::0::1;36554:318:::0;:::o;34702:102::-;29938:6;;-1:-1:-1;;;;;29938:6:0;29924:10;:20;29916:72;;;;-1:-1:-1;;;29916:72:0;;;;;;;:::i;:::-;34769:27:::1;174:10:::0;34789:6:::1;34769:5;:27::i;45933:103::-:0;45970:15;;:58;;-1:-1:-1;;;45970:58:0;;46009:10;45970:58;;;13029:51:1;45970:15:0;13096:18:1;;;13089:50;-1:-1:-1;;;;;45970:15:0;;;;:30;;13002:18:1;;45970:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;54939:183::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;55053:15:::1;::::0;:61:::1;::::0;-1:-1:-1;;;55053:61:0;;::::1;::::0;::::1;2752:25:1::0;;;-1:-1:-1;;;;;55053:15:0;;::::1;::::0;:54:::1;::::0;2725:18:1;;55053:61:0::1;2606:177:1::0;37256:205:0;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37330:27:0;::::1;;::::0;;;:19:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;37330:34:0::1;37360:4;37330:34;::::0;;37375:15:::1;:33:::0;;-1:-1:-1;;;;;;37375:33:0::1;::::0;::::1;::::0;;37424:29;;160:51:1;;;37424:29:0::1;::::0;133:18:1;37424:29:0::1;;;;;;;;37256:205:::0;:::o;55130:175::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;55240:15:::1;::::0;:57:::1;::::0;-1:-1:-1;;;55240:57:0;;::::1;::::0;::::1;2752:25:1::0;;;-1:-1:-1;;;;;55240:15:0;;::::1;::::0;:50:::1;::::0;2725:18:1;;55240:57:0::1;2606:177:1::0;40607:120:0;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;40702:17:::1;:6:::0;40712::::1;40702:17;:::i;:::-;40681:18;:38:::0;-1:-1:-1;40607:120:0:o;46182:142::-;46275:15;;:41;;;-1:-1:-1;;;46275:41:0;;;;46248:7;;-1:-1:-1;;;;;46275:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;38875:99;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;38944:14:::1;:22:::0;;-1:-1:-1;;38944:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;38875:99::o;44696:171::-;44825:15;;:34;;-1:-1:-1;;;44825:34:0;;-1:-1:-1;;;;;178:32:1;;;44825:34:0;;;160:51:1;44793:7:0;;44825:15;;:25;;133:18:1;;44825:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;46691:185::-;46820:15;;:48;;-1:-1:-1;;;46820:48:0;;-1:-1:-1;;;;;178:32:1;;;46820:48:0;;;160:51:1;46791:4:0;;46820:15;;:39;;133:18:1;;46820:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34983:125::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;35049:6:::1;:15:::0;;-1:-1:-1;;;;;;35049:15:0::1;-1:-1:-1::0;;;;;35049:15:0;::::1;::::0;;::::1;::::0;;;35080:20:::1;::::0;160:51:1;;;35080:20:0::1;::::0;148:2:1;133:18;35080:20:0::1;14:203:1::0;45515:410:0;45697:15;;:28;;-1:-1:-1;;;;;;45697:28:0;;;;;2752:25:1;;;45595:18:0;;;;;;-1:-1:-1;;;;;45697:15:0;;:23;;2725:18:1;;45697:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45741:176;;;13942:25:1;;;13998:2;13983:18;;13976:34;;;14026:18;;;14019:34;;;14084:2;14069:18;;14062:34;;;45580:145:0;;-1:-1:-1;45580:145:0;;-1:-1:-1;45580:145:0;-1:-1:-1;45897:9:0;;45859:5;;45741:176;;13929:3:1;13914:19;45741:176:0;;;;;;;45569:356;;;45515:410;:::o;6024:177::-;-1:-1:-1;;;;;6175:18:0;6143:7;6175:18;;;;;;;;;;;;6024:177::o;13001:148::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;13092:6:::1;::::0;13071:40:::1;::::0;13108:1:::1;::::0;-1:-1:-1;;;;;13092:6:0::1;::::0;13071:40:::1;::::0;13108:1;;13071:40:::1;13122:6;:19:::0;;-1:-1:-1;;;;;;13122:19:0::1;::::0;;13001:148::o;38238:127::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;38312:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;38312:45:0;;-1:-1:-1;;;;;178:32:1;;;38312:45:0::1;::::0;::::1;160:51:1::0;38312:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;38312:45:0::1;14:203:1::0;41917:208:0;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;41986:15:::1;::::0;:46:::1;::::0;-1:-1:-1;;;41986:46:0;;-1:-1:-1;;;;;178:32:1;;;41986:46:0::1;::::0;::::1;160:51:1::0;41986:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;41986:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;42043:29:0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:36;;-1:-1:-1;;42043:36:0::1;42075:4;42043:36;::::0;;-1:-1:-1;42090:27:0::1;42063:8:::0;42090:17:::1;:27::i;38666:170::-:0;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38778:41:0;;;::::1;;::::0;;;:33:::1;:41;::::0;;;;:50;;-1:-1:-1;;38778:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;38666:170::o;42375:1536::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;42729:16:::1;:31:::0;;;42771:15:::1;:30:::0;;;42812:13:::1;:26:::0;;;42849:13:::1;:26:::0;;;42886:14:::1;:28:::0;;;42925:17:::1;:33:::0;;;42969:16:::1;:32:::0;;;43012:14:::1;:28:::0;;;43051:11:::1;:22:::0;;;43084:12:::1;:24:::0;;;43137:153:::1;42903:11:::0;43137:119:::1;43099:9:::0;43137:119;42945:13;43137:119;43029:11;42988:13;43137:32:::1;:50::i;:::-;:68:::0;::::1;:87::i;:153::-;43121:13;:169;;;;43318:148;43452:13;;43318:115;43421:11;;43318:84;43385:16;;43318:48;43350:15;;43318:13;;:31;;:48;;;;:::i;:148::-;43303:12;:163:::0;43487:13:::1;::::0;43504:2:::1;-1:-1:-1::0;43487:19:0;::::1;::::0;:41:::1;;;43526:2;43510:12;;:18;;43487:41;43479:94;;;::::0;-1:-1:-1;;;43479:94:0;;14309:2:1;43479:94:0::1;::::0;::::1;14291:21:1::0;14348:2;14328:18;;;14321:30;14387:34;14367:18;;;14360:62;-1:-1:-1;;;14438:18:1;;;14431:38;14486:19;;43479:94:0::1;14107:404:1::0;43479:94:0::1;43616:17;::::0;43648:16:::1;::::0;43679:14:::1;::::0;43708::::1;::::0;43737:13:::1;::::0;43765:16:::1;::::0;43796:15:::1;::::0;43826:13:::1;::::0;43854:11:::1;::::0;43880:12:::1;::::0;43591:312:::1;::::0;;14915:25:1;;;14971:2;14956:18;;14949:34;;;;14999:18;;;14992:34;;;;15057:2;15042:18;;15035:34;;;;15100:3;15085:19;;15078:35;;;;15144:3;15129:19;;15122:35;15188:3;15173:19;;15166:35;15232:3;15217:19;;15210:35;15276:3;15261:19;;15254:35;15320:3;15305:19;;15298:35;43591:312:0::1;::::0;14902:3:1;14887:19;43591:312:0::1;;;;;;;42375:1536:::0;;;;;;;;;;:::o;42133:234::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;42239:1:::1;42221:14;:19;;42212:62;;;::::0;-1:-1:-1;;;42212:62:0;;15546:2:1;42212:62:0::1;::::0;::::1;15528:21:1::0;15585:2;15565:18;;;15558:30;15624:31;15604:18;;;15597:59;15673:18;;42212:62:0::1;15344:353:1::0;42212:62:0::1;42285:11;:28:::0;;;42329:30:::1;::::0;2752:25:1;;;42329:30:0::1;::::0;2740:2:1;2725:18;42329:30:0::1;2606:177:1::0;46332:109:0;46386:15;;:47;;-1:-1:-1;;;46386:47:0;;46415:10;46386:47;;;13029:51:1;13123:14;;13116:22;13096:18;;;13089:50;-1:-1:-1;;;;;46386:15:0;;;;:28;;13002:18:1;;46386:47:0;12845:300:1;41668:241:0;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;41766:6:::1;41754:8;:18;;:41;;;;;41788:7;41776:8;:19;;41754:41;41746:50;;;::::0;::::1;;41846:16;::::0;41812:51:::1;::::0;41836:8;;41812:51:::1;::::0;;;::::1;41874:16;:27:::0;41668:241::o;5695:104::-;5751:13;5784:7;5777:14;;;;;:::i;40951:163::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;41065:41:::1;41094:4;41100:5;41065:28;:41::i;41122:121::-:0;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;41192:15:::1;::::0;:43:::1;::::0;-1:-1:-1;;;41192:43:0;;2091:14:1;;2084:22;41192:43:0::1;::::0;::::1;2066:41:1::0;-1:-1:-1;;;;;41192:15:0;;::::1;::::0;:36:::1;::::0;2039:18:1;;41192:43:0::1;1926:187:1::0;39727:176:0;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;39817:6:::1;39799:24;;:14;;;;;;;;;;;:24;;::::0;39791:33:::1;;;::::0;::::1;;39835:14;:23:::0;;;::::1;;-1:-1:-1::0;;;39835:23:0::1;-1:-1:-1::0;;;;39835:23:0;;::::1;;::::0;;39874:21:::1;::::0;::::1;::::0;::::1;::::0;39852:6;2091:14:1;2084:22;2066:41;;2054:2;2039:18;;1926:187;38403:201:0;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;38477:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;38477:45:0;;-1:-1:-1;;;;;178:32:1;;;38477:45:0::1;::::0;::::1;160:51:1::0;38477:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;38477:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;38533:15:0::1;::::0;-1:-1:-1;;;;;38533:15:0::1;::::0;-1:-1:-1;38533:26:0::1;::::0;-1:-1:-1;38560:7:0;38569:26:::1;38560:7:::0;38569:17:::1;:26::i;:::-;38533:63;::::0;-1:-1:-1;;;;;;38533:63:0::1;::::0;;;;;;-1:-1:-1;;;;;11765:32:1;;;38533:63:0::1;::::0;::::1;11747:51:1::0;11814:18;;;11807:34;11720:18;;38533:63:0::1;11565:282:1::0;7630:400:0;7750:4;7772:228;174:10;7822:7;7844:145;7901:15;7844:145;;;;;;;;;;;;;;;;;174:10;7844:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;7844:34:0;;;;;;;;;;;;:38;:145::i;37507:199::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37579:27:0;::::1;;::::0;;;:19:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;37579:34:0::1;37609:4;37579:34;::::0;;37624:13:::1;:31:::0;;-1:-1:-1;;;;;;37624:31:0::1;::::0;::::1;::::0;;37671:27;;160:51:1;;;37671:27:0::1;::::0;133:18:1;37671:27:0::1;14:203:1::0;39911:662:0;39970:14;;-1:-1:-1;;;39970:14:0;;;;39962:49;;;;-1:-1:-1;;;39962:49:0;;16472:2:1;39962:49:0;;;16454:21:1;16511:2;16491:18;;;16484:30;-1:-1:-1;;;16530:18:1;;;16523:52;16592:18;;39962:49:0;16270:346:1;39962:49:0;40030:24;;;;:14;:24;;;;;;:29;;40022:66;;;;-1:-1:-1;;;40022:66:0;;16823:2:1;40022:66:0;;;16805:21:1;16862:2;16842:18;;;16835:30;16901:26;16881:18;;;16874:54;16945:18;;40022:66:0;16621:348:1;40022:66:0;40154:29;:15;40174:8;40154:19;:29::i;:::-;174:10;40121:30;;;;:16;:30;;;;;;:62;40099:148;;;;-1:-1:-1;;;40099:148:0;;17176:2:1;40099:148:0;;;17158:21:1;17215:2;17195:18;;;17188:30;17254:34;17234:18;;;17227:62;-1:-1:-1;;;17305:18:1;;;17298:34;17349:19;;40099:148:0;16974:400:1;40099:148:0;40287:24;;;;:14;:24;;;;;;;;;174:10;40258:26;;:12;:26;;;;;;:53;40355:29;:15;40287:24;40355:19;:29::i;:::-;174:10;40322:30;;;;:16;:30;;;;;:62;;;;40395:15;;-1:-1:-1;;;;;40395:15:0;;:26;;40463:31;174:10;40463:17;:31::i;:::-;40395:110;;-1:-1:-1;;;;;;40395:110:0;;;;;;;-1:-1:-1;;;;;11765:32:1;;;40395:110:0;;;11747:51:1;11814:18;;;11807:34;11720:18;;40395:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40542:12;174:10;;94:98;40542:12;-1:-1:-1;;;;;40521:44:0;;40556:8;40521:44;;;;2752:25:1;;2740:2;2725:18;;2606:177;40521:44:0;;;;;;;;39911:662;:::o;44504:184::-;44633:15;;:47;;-1:-1:-1;;;44633:47:0;;-1:-1:-1;;;;;178:32:1;;;44633:47:0;;;160:51:1;44601:7:0;;44633:15;;:38;;133:18:1;;44633:47:0;14:203:1;6209:216:0;6331:4;6353:42;174:10;6377:9;6388:6;6353:9;:42::i;35801:143::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35894:30:0;;;::::1;;::::0;;;:23:::1;:30;::::0;;;;:38;;-1:-1:-1;;35894:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35801:143::o;44875:307::-;45139:15;;:35;;-1:-1:-1;;;45139:35:0;;-1:-1:-1;;;;;178:32:1;;;45139:35:0;;;160:51:1;44989:7:0;;;;;;;;;;;;45139:15;;;;:26;;133:18:1;;45139:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45132:42;;;;-1:-1:-1;45132:42:0;;-1:-1:-1;45132:42:0;-1:-1:-1;45132:42:0;-1:-1:-1;45132:42:0;;-1:-1:-1;44875:307:0;-1:-1:-1;;44875:307:0:o;39254:174::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;39342:3:::1;39333:5;:12;;39325:63;;;::::0;-1:-1:-1;;;39325:63:0;;18143:2:1;39325:63:0::1;::::0;::::1;18125:21:1::0;18182:2;18162:18;;;18155:30;18221:34;18201:18;;;18194:62;-1:-1:-1;;;18272:18:1;;;18265:36;18318:19;;39325:63:0::1;17941:402:1::0;39325:63:0::1;39399:13;:21:::0;39254:174::o;46884:127::-;46968:15;;:35;;-1:-1:-1;;;46968:35:0;;-1:-1:-1;;;;;178:32:1;;;46968:35:0;;;160:51:1;46944:4:0;;46968:15;;:26;;133:18:1;;46968:35:0;14:203:1;36943:268:0;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37015:41:0;;::::1;;::::0;;;:33:::1;:41;::::0;;;;;;;:48;;37059:4:::1;-1:-1:-1::0;;37015:48:0;;::::1;::::0;::::1;::::0;;;37074:19:::1;:27:::0;;;;;;;:34;;;;::::1;::::0;;::::1;::::0;;37119:15:::1;::::0;:44;;-1:-1:-1;;;37119:44:0;;::::1;::::0;::::1;160:51:1::0;;;;37119:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;37119:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;37179:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;37179:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;37179:24:0::1;14:203:1::0;40735:208:0;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;40815:21:::1;::::0;:32;::::1;;:21;::::0;;::::1;:32;;::::0;40807:41:::1;;;::::0;::::1;;40859:21;:31:::0;;-1:-1:-1;;40859:31:0::1;::::0;::::1;;::::0;;::::1;::::0;;40906:29:::1;::::0;2066:41:1;;;40906:29:0::1;::::0;2039:18:1;40906:29:0::1;1926:187:1::0;35960:146:0;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;36027:20:::1;::::0;::::1;;36026:21;36018:30;;;::::0;::::1;;36067:20;:27:::0;;-1:-1:-1;;36067:27:0::1;36090:4;36067:27;::::0;;35960:146::o;54651:158::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;54721:15:::1;::::0;:40:::1;::::0;-1:-1:-1;;;54721:40:0;;-1:-1:-1;;;;;178:32:1;;;54721:40:0::1;::::0;::::1;160:51:1::0;54721:15:0;;::::1;::::0;:33:::1;::::0;133:18:1;;54721:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;54777:24:0::1;::::0;-1:-1:-1;;;;;178:32:1;;160:51;;54777:24:0::1;::::0;-1:-1:-1;148:2:1;133:18;;-1:-1:-1;54777:24:0::1;14:203:1::0;37759:193:0;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37829:27:0;::::1;;::::0;;;:19:::1;:27;::::0;;;;;;;;:34;;-1:-1:-1;;37829:34:0::1;37859:4;37829:34;::::0;;37874:11:::1;:29:::0;;-1:-1:-1;;;;;;37874:29:0::1;::::0;::::1;::::0;;37919:25;;160:51:1;;;37919:25:0::1;::::0;133:18:1;37919:25:0::1;14:203:1::0;46044:130:0;46127:15;;:39;;;-1:-1:-1;;;46127:39:0;;;;46100:7;;-1:-1:-1;;;;;46127:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;34820:151;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;34911:21:::1;34897:10;;:35;;34889:44;;;::::0;::::1;;34944:10;:19:::0;34820:151::o;45190:317::-;45459:15;;:40;;-1:-1:-1;;;45459:40:0;;;;;2752:25:1;;;45309:7:0;;;;;;;;;;;;-1:-1:-1;;;;;45459:15:0;;;;:33;;2725:18:1;;45459:40:0;2606:177:1;13157:281:0;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13260:22:0;::::1;13238:110;;;::::0;-1:-1:-1;;;13238:110:0;;18550:2:1;13238:110:0::1;::::0;::::1;18532:21:1::0;18589:2;18569:18;;;18562:30;18628:34;18608:18;;;18601:62;-1:-1:-1;;;18679:18:1;;;18672:36;18725:19;;13238:110:0::1;18348:402:1::0;13238:110:0::1;13385:6;::::0;13364:38:::1;::::0;-1:-1:-1;;;;;13364:38:0;;::::1;::::0;13385:6:::1;::::0;13364:38:::1;::::0;13385:6:::1;::::0;13364:38:::1;13413:6;:17:::0;;-1:-1:-1;;;;;;13413:17:0::1;-1:-1:-1::0;;;;;13413:17:0;;;::::1;::::0;;;::::1;::::0;;13157:281::o;36122:420::-;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;36196:10:::1;:20:::0;;-1:-1:-1;;;;;;36196:20:0::1;;-1:-1:-1::0;;;;;36196:20:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;36231:21;36227:203:::1;;-1:-1:-1::0;;;;;36269:32:0;;::::1;;::::0;;;:23:::1;:32;::::0;;;;;;;:39;;36304:4:::1;-1:-1:-1::0;;36269:39:0;;::::1;::::0;::::1;::::0;;;36323:19:::1;:28:::0;;;;;;;:35;;;;::::1;::::0;;::::1;::::0;;36373:15:::1;::::0;:45;;-1:-1:-1;;;36373:45:0;;::::1;::::0;::::1;160:51:1::0;;;;36373:15:0;;::::1;::::0;:36:::1;::::0;133:18:1;;36373:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;36227:203;36454:12;36440:11;:26:::0;36477:14:::1;:21:::0;;-1:-1:-1;;;;36477:21:0::1;-1:-1:-1::0;;;36477:21:0::1;::::0;;36514:16:::1;::::0;::::1;::::0;36477:21;;36514:16:::1;36122:420:::0;:::o;46449:107::-;46502:15;;:46;;-1:-1:-1;;;46502:46:0;;46530:10;46502:46;;;13029:51:1;13123:14;;13116:22;13096:18;;;13089:50;-1:-1:-1;;;;;46502:15:0;;;;:27;;13002:18:1;;46502:46:0;12845:300:1;39498:221:0;12914:6;;-1:-1:-1;;;;;12914:6:0;174:10;12914:22;12906:67;;;;-1:-1:-1;;;12906:67:0;;;;;;;:::i;:::-;39573:16:::1;:5:::0;39582:6:::1;39573:16;:::i;:::-;39565:24;;39632:4;39617:12;;:19;;;;:::i;:::-;39608:5;:28;;39600:83;;;::::0;-1:-1:-1;;;39600:83:0;;19179:2:1;39600:83:0::1;::::0;::::1;19161:21:1::0;19218:2;19198:18;;;19191:30;19257:34;19237:18;;;19230:62;-1:-1:-1;;;19308:18:1;;;19301:40;19358:19;;39600:83:0::1;18977:406:1::0;39600:83:0::1;39694:9;:17:::0;39498:221::o;10813:181::-;10871:7;;10903:5;10907:1;10903;:5;:::i;:::-;10891:17;;10932:1;10927;:6;;10919:46;;;;-1:-1:-1;;;10919:46:0;;19720:2:1;10919:46:0;;;19702:21:1;19759:2;19739:18;;;19732:30;19798:29;19778:18;;;19771:57;19845:18;;10919:46:0;19518:351:1;10919:46:0;10985:1;10813:181;-1:-1:-1;;;10813:181:0:o;11380:250::-;11438:7;11462:1;11467;11462:6;11458:47;;-1:-1:-1;11492:1:0;11485:8;;11458:47;11517:9;11529:5;11533:1;11529;:5;:::i;:::-;11517:17;-1:-1:-1;11562:1:0;11553:5;11557:1;11517:17;11553:5;:::i;:::-;:10;11545:56;;;;-1:-1:-1;;;11545:56:0;;20076:2:1;11545:56:0;;;20058:21:1;20115:2;20095:18;;;20088:30;20154:34;20134:18;;;20127:62;-1:-1:-1;;;20205:18:1;;;20198:31;20246:19;;11545:56:0;19874:397:1;11638:132:0;11696:7;11723:39;11727:1;11730;11723:39;;;;;;;;;;;;;;;;;:3;:39::i;56285:2380::-;56354:6;56364:1;56354:11;56350:50;;56285:2380;:::o;56350:50::-;56410:24;56427:6;56410:16;:24::i;:::-;56445:19;56467:25;56481:10;;56467:9;;:13;;:25;;;;:::i;:::-;56741:13;;56445:47;;-1:-1:-1;56520:4:0;;;;;;;;56505:12;;;;;;56741:17;56737:279;;56794:210;56990:13;;56976:11;;56957:16;;56941:13;;:32;;;;:::i;:::-;:46;;;;:::i;:::-;:62;;;;:::i;:::-;56794:128;56908:13;;56794:95;56877:11;56794:64;56848:9;;56794:35;:53;;:64;;;;:::i;:95::-;:113;;:128::i;:210::-;56775:229;;56737:279;57030:14;;:18;57026:287;;57085:216;57286:14;;57271:12;;57251:17;;57234:14;;:34;;;;:::i;:::-;:49;;;;:::i;:::-;:66;;;;:::i;:::-;57085:130;57200:14;;57085:96;57169:11;57085:65;57139:10;;57085:35;:53;;:65;;;;:::i;:216::-;57065:236;;57026:287;57335:39;:16;57356:17;57335:20;:39::i;:::-;57323:51;-1:-1:-1;57391:13:0;;57387:111;;57443:15;;57435:51;;-1:-1:-1;;;;;57443:15:0;;;;57472:9;;57435:51;;;;57472:9;57443:15;57435:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57421:65:0;;-1:-1:-1;;57387:111:0;57518:21;57613:52;57651:13;;57613:33;57634:11;;57613:16;;:20;;:33;;;;:::i;:52::-;57542:55;57582:14;;57542:35;57564:12;;57542:17;;:21;;:35;;;;:::i;:55::-;:123;;;;:::i;:::-;57518:147;-1:-1:-1;57678:19:0;57712:17;;57708:104;;57760:40;:21;57786:13;57760:25;:40::i;:::-;57746:54;;57708:104;57822:23;57890:11;57848:39;57869:17;;57848:16;;:20;;:39;;;;:::i;:::-;:53;;;;:::i;:::-;57822:79;;57912:19;57966:11;57934:29;57950:12;;57934:11;;:15;;:29;;;;:::i;:::-;:43;;;;:::i;:::-;57912:65;;57988:21;58048:11;58012:33;58030:14;;58012:13;;:17;;:33;;;;:::i;:::-;:47;;;;:::i;:::-;57988:71;-1:-1:-1;58084:19:0;;58080:126;;58145:15;;58137:57;;-1:-1:-1;;;;;58145:15:0;;;;58174;;58137:57;;;;58174:15;58145;58137:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58120:74:0;;-1:-1:-1;;58080:126:0;58220:15;;58216:114;;58277:11;;58269:49;;-1:-1:-1;;;;;58277:11:0;;;;58302;;58269:49;;;;58302:11;58277;58269:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58252:66:0;;-1:-1:-1;;58216:114:0;58344:17;;58340:120;;58403:13;;58395:53;;-1:-1:-1;;;;;58403:13:0;;;;58430;;58395:53;;;;58430:13;58403;58395:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58378:70:0;;-1:-1:-1;;58340:120:0;58485:172;58513:9;58569:13;58537:29;58555:11;58537:15;:29;:::i;:::-;:45;;;;:::i;:::-;58597:7;:21;;;;;58608:10;58597:21;:35;;;;;58622:10;58597:35;:49;;;;;58636:10;58597:49;58485:172;;;20682:25:1;;;20738:2;20723:18;;20716:34;;;;20793:14;20786:22;20766:18;;;20759:50;20670:2;20655:18;58485:172:0;;;;;;;56339:2326;;;;;;;;;;;;;56285:2380;:::o;11002:136::-;11060:7;11087:43;11091:1;11094;11087:43;;;;;;;;;;;;;;;;;:3;:43::i;9505:380::-;-1:-1:-1;;;;;9641:19:0;;9633:68;;;;-1:-1:-1;;;9633:68:0;;21022:2:1;9633:68:0;;;21004:21:1;21061:2;21041:18;;;21034:30;21100:34;21080:18;;;21073:62;-1:-1:-1;;;21151:18:1;;;21144:34;21195:19;;9633:68:0;20820:400:1;9633:68:0;-1:-1:-1;;;;;9720:21:0;;9712:68;;;;-1:-1:-1;;;9712:68:0;;21427:2:1;9712:68:0;;;21409:21:1;21466:2;21446:18;;;21439:30;21505:34;21485:18;;;21478:62;-1:-1:-1;;;21556:18:1;;;21549:32;21598:19;;9712:68:0;21225:398:1;9712:68:0;-1:-1:-1;;;;;9793:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;9845:32;;2752:25:1;;;9845:32:0;;2725:18:1;9845:32:0;;;;;;;;9505:380;;;:::o;8038:610::-;-1:-1:-1;;;;;8178:20:0;;8170:70;;;;-1:-1:-1;;;8170:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8259:23:0;;8251:71;;;;-1:-1:-1;;;8251:71:0;;;;;;;:::i;:::-;8415:108;8451:6;8415:108;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8415:17:0;;:9;:17;;;;;;;;;;;;:108;:21;:108::i;:::-;-1:-1:-1;;;;;8395:17:0;;;:9;:17;;;;;;;;;;;:128;;;;8557:20;;;;;;;:32;;8582:6;8557:24;:32::i;:::-;-1:-1:-1;;;;;8534:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;8605:35;2752:25:1;;;8534:20:0;;8605:35;;;;;;2725:18:1;8605:35:0;2606:177:1;47019:6332:0;-1:-1:-1;;;;;47151:18:0;;47143:68;;;;-1:-1:-1;;;47143:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;47230:16:0;;47222:64;;;;-1:-1:-1;;;47222:64:0;;;;;;;:::i;:::-;47319:4;;-1:-1:-1;;;;;47319:4:0;;;47305:19;;;;47297:53;;;;-1:-1:-1;;;47297:53:0;;22640:2:1;47297:53:0;;;22622:21:1;22679:2;22659:18;;;22652:30;-1:-1:-1;;;22698:18:1;;;22691:51;22759:18;;47297:53:0;22438:345:1;47297:53:0;-1:-1:-1;;;;;47517:39:0;;47361:18;47517:39;;;:33;:39;;;;;;47361:18;;;;;;;;47517:39;;47512:132;;47581:14;;-1:-1:-1;;;47581:14:0;;;;47573:59;;;;-1:-1:-1;;;47573:59:0;;22990:2:1;47573:59:0;;;22972:21:1;;;23009:18;;;23002:30;23068:34;23048:18;;;23041:62;23120:18;;47573:59:0;22788:356:1;47573:59:0;47668:20;;;;:29;;;:57;;-1:-1:-1;47701:10:0;;;;;-1:-1:-1;;;;;47701:10:0;:24;;47668:57;47664:209;;;47750:19;47760:4;47766:2;47750:9;:19::i;:::-;:24;;:57;;-1:-1:-1;;;;;;47778:29:0;;;;;;:23;:29;;;;;;;;47750:57;:88;;;-1:-1:-1;;;;;;47811:27:0;;;;;;:23;:27;;;;;;;;47750:88;47742:119;;;;-1:-1:-1;;;47742:119:0;;23351:2:1;47742:119:0;;;23333:21:1;23390:2;23370:18;;;23363:30;-1:-1:-1;;;23409:18:1;;;23402:48;23467:18;;47742:119:0;23149:342:1;47742:119:0;47905:6;47915:1;47905:11;47901:5066;;47933:28;47949:4;47955:2;47959:1;47933:15;:28::i;:::-;47976:7;;;;;47019:6332;;;:::o;47901:5066::-;48050:8;;-1:-1:-1;;;48050:8:0;;;;48049:9;:39;;;;-1:-1:-1;;;;;;48063:25:0;;;;;;:19;:25;;;;;;;;48062:26;48049:39;:67;;;;-1:-1:-1;;;;;;48093:23:0;;;;;;:19;:23;;;;;;;;48092:24;48049:67;48031:4936;;;-1:-1:-1;;;;;48160:29:0;;;48143:14;48160:29;;;:25;:29;;;;;;;48220:31;;;;;;;;48160:29;;;;;48220:31;48272:9;;:23;;;;;48286:9;48285:10;48272:23;48268:2302;;;48316:13;48332:32;48360:3;48332:23;48343:11;;48332:6;:10;;:23;;;;:::i;:32::-;48316:48;-1:-1:-1;48392:17:0;:6;48316:48;48392:10;:17::i;:::-;48383:26;;48428:43;48444:4;48458;48465:5;48428:15;:43::i;:::-;48490:33;48506:4;48512:2;48516:6;48490:15;:33::i;:::-;48542:15;;-1:-1:-1;;;;;48542:15:0;:26;48569:4;48575:23;48569:4;48575:17;:23::i;:::-;48542:57;;-1:-1:-1;;;;;;48542:57:0;;;;;;;-1:-1:-1;;;;;11765:32:1;;;48542:57:0;;;11747:51:1;11814:18;;;11807:34;11720:18;;48542:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48618:15:0;;-1:-1:-1;;;;;48618:15:0;;-1:-1:-1;48618:26:0;;-1:-1:-1;48645:2:0;48649:21;48645:2;48649:17;:21::i;:::-;48618:53;;-1:-1:-1;;;;;;48618:53:0;;;;;;;-1:-1:-1;;;;;11765:32:1;;;48618:53:0;;;11747:51:1;11814:18;;;11807:34;11720:18;;48618:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48690:7;;;;;;;;47019:6332;;;:::o;48268:2302::-;48750:8;48749:9;:27;;;;-1:-1:-1;48762:14:0;;-1:-1:-1;;;48762:14:0;;;;48749:27;48745:1825;;;-1:-1:-1;;;;;48827:22:0;;;;;;:16;:22;;;;;;48853:15;-1:-1:-1;48827:41:0;48797:144;;;;-1:-1:-1;;;48797:144:0;;23698:2:1;48797:144:0;;;23680:21:1;23737:2;23717:18;;;23710:30;23776:31;23756:18;;;23749:59;23825:18;;48797:144:0;23496:353:1;48797:144:0;-1:-1:-1;;;;;48964:22:0;;;;;;:16;:22;;;;;;:27;48960:147;;-1:-1:-1;;;;;49016:22:0;;49041:1;49016:22;;;:16;:22;;;;;;;;:26;;;49065:12;:18;;;;;:22;48960:147;48745:1825;;;49147:9;49143:1427;;;49190:14;;49236;;49285:17;;49336:16;;49383:12;;49420:14;;49190;;-1:-1:-1;49236:14:0;;-1:-1:-1;49285:17:0;;-1:-1:-1;49336:16:0;-1:-1:-1;49383:12:0;-1:-1:-1;49420:14:0;;49416:271;;;49524:13;;49511:9;49482:39;;;;:28;:39;;;;;;:55;;49524:13;49482:55;:::i;:::-;49463:15;:74;;49455:134;;;;-1:-1:-1;;;49455:134:0;;24056:2:1;49455:134:0;;;24038:21:1;24095:2;24075:18;;;24068:30;-1:-1:-1;;;24114:18:1;;;24107:52;24176:18;;49455:134:0;23854:346:1;49455:134:0;49637:9;49608:39;;;;:28;:39;;;;;49650:15;49608:57;;49143:1427;;;49714:8;49710:860;;;49756:13;;49801;;49849:16;;49899:15;;49945:11;;49981:14;;49756:13;;-1:-1:-1;49801:13:0;;-1:-1:-1;49849:16:0;;-1:-1:-1;49899:15:0;-1:-1:-1;49945:11:0;-1:-1:-1;49981:14:0;;49977:369;;;50039:11;;:15;;50053:1;50039:15;:::i;:::-;50024:12;:30;50016:60;;;;-1:-1:-1;;;50016:60:0;;24407:2:1;50016:60:0;;;24389:21:1;24446:2;24426:18;;;24419:30;-1:-1:-1;;;24465:18:1;;;24458:48;24523:18;;50016:60:0;24205:342:1;50016:60:0;50118:13;;50103:11;:28;;50095:64;;;;-1:-1:-1;;;50095:64:0;;24754:2:1;50095:64:0;;;24736:21:1;24793:2;24773:18;;;24766:30;24832:26;24812:18;;;24805:54;24876:18;;50095:64:0;24552:348:1;50095:64:0;50211:9;50186:35;;;;:24;:35;;;;;;50225:12;50186:51;;50178:83;;;;-1:-1:-1;;;50178:83:0;;25107:2:1;50178:83:0;;;25089:21:1;25146:2;25126:18;;;25119:30;-1:-1:-1;;;25165:18:1;;;25158:50;25225:18;;50178:83:0;24905:344:1;50178:83:0;50305:9;50280:35;;;;:24;:35;;;;;50318:12;50280:50;;49977:369;50374:32;50409:13;50419:2;50409:9;:13::i;:::-;50482:9;;50374:48;;-1:-1:-1;50445:33:0;50472:6;50374:48;50445:33;:::i;:::-;:46;;50437:117;;;;-1:-1:-1;;;50437:117:0;;25456:2:1;50437:117:0;;;25438:21:1;25495:2;25475:18;;;25468:30;25534:34;25514:18;;;25507:62;-1:-1:-1;;;25585:18:1;;;25578:34;25629:19;;50437:117:0;25254:400:1;50437:117:0;49724:846;49710:860;50586:17;50606:87;50682:10;50670:9;50639:28;50654:13;50639:12;:28;:::i;:::-;:40;;;;:::i;:::-;:53;;;;:::i;:::-;50606:10;;:32;:87::i;:::-;50586:107;;50710:28;50741:24;50759:4;50741:9;:24::i;:::-;50821:18;;50710:55;;-1:-1:-1;50797:42:0;;;;;;;50860:43;;-1:-1:-1;;;;;;50872:31:0;;;;;;:25;:31;;;;;;;;50871:32;50860:43;50856:1251;;;50924:8;:15;;-1:-1:-1;;;;50924:15:0;-1:-1:-1;;;50924:15:0;;;50964:21;;50924:15;50964:21;:41;;;;;51004:1;50989:12;:16;50964:41;:61;;;;;51024:1;51009:12;;:16;50964:61;50960:903;;;51050:20;51073:25;51087:10;;51073:9;;:13;;:25;;;;:::i;:::-;51050:48;;51121:24;51148:105;51240:12;51148:61;51199:9;;51148:20;:50;;:61;;;;:::i;:105::-;51121:132;;51276:22;51301:106;51394:12;51301:62;51352:10;;51301:20;:50;;:62;;;;:::i;:106::-;51276:131;;51432:21;51456:104;51547:12;;51456:60;51503:12;51456:16;:46;;:60;;;;:::i;:104::-;51432:128;;51585:22;51610:103;51699:13;;51610:58;51655:12;51610:14;:44;;:58;;;;:::i;:103::-;51585:128;-1:-1:-1;51738:18:0;51759:33;51585:128;51778:13;51759:18;:33::i;:::-;51738:54;;51817:26;51832:10;51817:14;:26::i;:::-;51027:836;;;;;;50960:903;51883:24;51910;51928:4;51910:9;:24::i;:::-;51883:51;;51953:38;51974:16;51953:20;:38::i;:::-;-1:-1:-1;52022:1:0;52010:9;:13;;;52042:10;:14;52075:8;:16;;-1:-1:-1;;;;52075:16:0;;;50856:1251;52123:12;52138:30;52164:3;52138:21;:6;52149:9;52138:10;:21::i;:30::-;52123:45;-1:-1:-1;52194:16:0;:6;52123:45;52194:10;:16::i;:::-;52185:25;;52231:9;52227:155;;;52274:10;;:20;;52289:4;52274:14;:20::i;:::-;52261:10;:33;52227:155;;;52347:9;;:19;;52361:4;52347:13;:19::i;:::-;52335:9;:31;52227:155;52398:42;52414:4;52428;52435;52398:15;:42::i;:::-;52471:16;;52508:15;;:28;;-1:-1:-1;;;;;;52508:28:0;;;;;2752:25:1;;;-1:-1:-1;;;;;52508:15:0;;;;:23;;2725:18:1;;52508:28:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;52508:28:0;;;;;;;;-1:-1:-1;;52508:28:0;;;;;;;;;;;;:::i;:::-;;;52504:452;;;52700:231;;;13942:25:1;;;13998:2;13983:18;;13976:34;;;14026:18;;;14019:34;;;14084:2;14069:18;;14062:34;;;52903:9:0;;52850:4;;52700:231;;13929:3:1;13914:19;52700:231:0;;;;;;;52537:410;;;52504:452;48128:4839;;;;;;;48031:4936;52979:33;52995:4;53001:2;53005:6;52979:15;:33::i;:::-;53023:15;;-1:-1:-1;;;;;53023:15:0;:26;53050:4;53056:23;53050:4;53056:17;:23::i;:::-;53023:57;;-1:-1:-1;;;;;;53023:57:0;;;;;;;-1:-1:-1;;;;;11765:32:1;;;53023:57:0;;;11747:51:1;11814:18;;;11807:34;11720:18;;53023:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53091:15:0;;-1:-1:-1;;;;;53091:15:0;;-1:-1:-1;53091:26:0;;-1:-1:-1;53118:2:0;53122:21;53118:2;53122:17;:21::i;:::-;53091:53;;-1:-1:-1;;;;;;53091:53:0;;;;;;;-1:-1:-1;;;;;11765:32:1;;;53091:53:0;;;11747:51:1;11814:18;;;11807:34;11720:18;;53091:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53181:15:0;;-1:-1:-1;;;;;53165:32:0;;;53181:15;;53165:32;;;;-1:-1:-1;53165:32:0;-1:-1:-1;53165:68:0;;-1:-1:-1;;;;;;53202:31:0;;;;;;:25;:31;;;;;;;;53201:32;53165:68;:88;;;;-1:-1:-1;53243:10:0;;-1:-1:-1;;;;;53237:16:0;;;53243:10;;;;;53237:16;53165:88;53161:179;;;53284:10;;53270:58;;-1:-1:-1;;;53270:58:0;;;;;25833:25:1;;;-1:-1:-1;;;;;25894:32:1;;;25874:18;;;25867:60;53284:10:0;;;;;;;;53270:44;;25806:18:1;;53270:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47132:6219;;;;;47019:6332;;;:::o;11146:226::-;11266:7;11302:12;11294:6;;;;11286:29;;;;-1:-1:-1;;;11286:29:0;;;;;;;;:::i;:::-;-1:-1:-1;11326:9:0;11338:5;11342:1;11338;:5;:::i;:::-;11326:17;11146:226;-1:-1:-1;;;;;11146:226:0:o;33342:416::-;-1:-1:-1;;;;;33435:21:0;;33427:65;;;;-1:-1:-1;;;33427:65:0;;26273:2:1;33427:65:0;;;26255:21:1;26312:2;26292:18;;;26285:30;26351:33;26331:18;;;26324:61;26402:18;;33427:65:0;26071:355:1;33427:65:0;33540:6;33525:12;;:21;;;;:::i;:::-;33511:10;;:35;;33503:110;;;;-1:-1:-1;;;33503:110:0;;26633:2:1;33503:110:0;;;26615:21:1;26672:2;26652:18;;;26645:30;26711:34;26691:18;;;26684:62;26782:32;26762:18;;;26755:60;26832:19;;33503:110:0;26431:426:1;33503:110:0;33642:6;33626:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;33659:18:0;;:9;:18;;;;;;;;;;:28;;33681:6;;33659:9;:28;;33681:6;;33659:28;:::i;:::-;;;;-1:-1:-1;;33713:37:0;;2752:25:1;;;-1:-1:-1;;;;;33713:37:0;;;33730:1;;33713:37;;2740:2:1;2725:18;33713:37:0;;;;;;;33342:416;;:::o;34217:477::-;-1:-1:-1;;;;;34310:21:0;;34302:67;;;;-1:-1:-1;;;34302:67:0;;27064:2:1;34302:67:0;;;27046:21:1;27103:2;27083:18;;;27076:30;27142:34;27122:18;;;27115:62;-1:-1:-1;;;27193:18:1;;;27186:31;27234:19;;34302:67:0;26862:397:1;34302:67:0;-1:-1:-1;;;;;34407:18:0;;34382:22;34407:18;;;;;;;;;;;34444:24;;;;34436:71;;;;-1:-1:-1;;;34436:71:0;;27466:2:1;34436:71:0;;;27448:21:1;27505:2;27485:18;;;27478:30;27544:34;27524:18;;;27517:62;-1:-1:-1;;;27595:18:1;;;27588:32;27637:19;;34436:71:0;27264:398:1;34436:71:0;-1:-1:-1;;;;;34543:18:0;;:9;:18;;;;;;;;;;34564:23;;;34543:44;;34609:12;:22;;34581:6;;34543:9;34609:22;;34581:6;;34609:22;:::i;:::-;;;;-1:-1:-1;;34649:37:0;;2752:25:1;;;34675:1:0;;-1:-1:-1;;;;;34649:37:0;;;;;2740:2:1;2725:18;34649:37:0;2606:177:1;41380:280:0;-1:-1:-1;;;;;41463:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;41463:39:0;;;;;;;;;;;;41515:80;;41541:15;;:42;;-1:-1:-1;;;41541:42:0;;-1:-1:-1;;;;;178:32:1;;;41541:42:0;;;160:51:1;41541:15:0;;;;:36;;133:18:1;;41541:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41515:80;41612:40;;;;;;-1:-1:-1;;;;;41612:40:0;;;;;;;;41380:280;;:::o;53359:289::-;53465:14;;53425:7;;-1:-1:-1;;;53465:14:0;;;;:175;;53622:18;53632:7;53622:9;:18::i;:::-;53465:175;;;-1:-1:-1;;;;;53522:21:0;;;;;;:12;:21;;;;;;53499:103;;53580:3;;53499:54;;53522:30;;53580:3;53522:25;:30::i;:::-;53499:18;53509:7;53499:9;:18::i;11778:312::-;11898:7;11933:12;11926:5;11918:28;;;;-1:-1:-1;;;11918:28:0;;;;;;;;:::i;:::-;-1:-1:-1;11957:9:0;11969:5;11973:1;11969;:5;:::i;54144:499::-;54234:16;;;54248:1;54234:16;;;;;;;;54210:21;;54234:16;;;;;;;;;;-1:-1:-1;54234:16:0;54210:40;;54279:4;54261;54266:1;54261:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54261:23:0;;;:7;;;;;;;;;;:23;;;;54305:15;;:22;;;-1:-1:-1;;;54305:22:0;;;;:15;;;;;:20;;:22;;;;;54261:7;;54305:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54295:4;54300:1;54295:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54295:32:0;;;:7;;;;;;;;;:32;54370:15;;54338:62;;54355:4;;54370:15;54388:11;54338:8;:62::i;:::-;54411:15;;:224;;-1:-1:-1;;;54411:224:0;;-1:-1:-1;;;;;54411:15:0;;;;:66;;:224;;54492:11;;54411:15;;54562:4;;54589;;54609:15;;54411:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54199:444;54144:499;:::o;35458:327::-;-1:-1:-1;;;;;35581:34:0;;35555:4;35581:34;;;:25;:34;;;;;;;;:76;;;;-1:-1:-1;35641:15:0;;-1:-1:-1;;;;;35619:38:0;;;35641:15;;35619:38;;35581:76;35577:90;;;-1:-1:-1;35666:1:0;35659:8;;35577:90;-1:-1:-1;;;;;35696:37:0;;;;;;:25;:37;;;;;;;;35692:51;;;-1:-1:-1;35742:1:0;35735:8;;35692:51;-1:-1:-1;35776:1:0;35458:327;;;;:::o;53656:480::-;53715:12;53730:13;:6;53741:1;53730:10;:13::i;:::-;53715:28;-1:-1:-1;53754:17:0;53774:16;:6;53715:28;53774:10;:16::i;:::-;53754:36;-1:-1:-1;53826:21:0;53858:22;53875:4;53858:16;:22::i;:::-;53961:18;53982:41;:21;54008:14;53982:25;:41::i;:::-;53961:62;;54034:35;54047:9;54058:10;54034:12;:35::i;:::-;54085:43;;;28854:25:1;;;28910:2;28895:18;;28888:34;;;28938:18;;;28931:34;;;54085:43:0;;28842:2:1;28827:18;54085:43:0;;;;;;;53704:432;;;;53656:480;:::o;55313:513::-;55493:15;;55461:62;;55478:4;;-1:-1:-1;;;;;55493:15:0;55511:11;55461:8;:62::i;:::-;55566:15;;-1:-1:-1;;;;;55566:15:0;:31;55605:9;55638:4;55658:11;55566:15;;55770:7;12852:6;;-1:-1:-1;;;;;12852:6:0;;12787:79;55770:7;55566:252;;;;;;-1:-1:-1;;;;;;55566:252:0;;;-1:-1:-1;;;;;29335:15:1;;;55566:252:0;;;29317:34:1;29367:18;;;29360:34;;;;29410:18;;;29403:34;;;;29453:18;;;29446:34;29517:15;;;29496:19;;;29489:44;55792:15:0;29549:19:1;;;29542:35;29251:19;;55566:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;222:180:1:-;281:6;334:2;322:9;313:7;309:23;305:32;302:52;;;350:1;347;340:12;302:52;-1:-1:-1;373:23:1;;222:180;-1:-1:-1;222:180:1:o;407:548::-;519:4;548:2;577;566:9;559:21;609:6;603:13;652:6;647:2;636:9;632:18;625:34;677:1;687:140;701:6;698:1;695:13;687:140;;;796:14;;;792:23;;786:30;762:17;;;781:2;758:26;751:66;716:10;;687:140;;;691:3;876:1;871:2;862:6;851:9;847:22;843:31;836:42;946:2;939;935:7;930:2;922:6;918:15;914:29;903:9;899:45;895:54;887:62;;;;407:548;;;;:::o;960:131::-;-1:-1:-1;;;;;1035:31:1;;1025:42;;1015:70;;1081:1;1078;1071:12;1096:118;1182:5;1175:13;1168:21;1161:5;1158:32;1148:60;;1204:1;1201;1194:12;1219:382;1284:6;1292;1345:2;1333:9;1324:7;1320:23;1316:32;1313:52;;;1361:1;1358;1351:12;1313:52;1400:9;1387:23;1419:31;1444:5;1419:31;:::i;:::-;1469:5;-1:-1:-1;1526:2:1;1511:18;;1498:32;1539:30;1498:32;1539:30;:::i;:::-;1588:7;1578:17;;;1219:382;;;;;:::o;1606:315::-;1674:6;1682;1735:2;1723:9;1714:7;1710:23;1706:32;1703:52;;;1751:1;1748;1741:12;1703:52;1790:9;1777:23;1809:31;1834:5;1809:31;:::i;:::-;1859:5;1911:2;1896:18;;;;1883:32;;-1:-1:-1;;;1606:315:1:o;2118:248::-;2186:6;2194;2247:2;2235:9;2226:7;2222:23;2218:32;2215:52;;;2263:1;2260;2253:12;2215:52;-1:-1:-1;;2286:23:1;;;2356:2;2341:18;;;2328:32;;-1:-1:-1;2118:248:1:o;2788:247::-;2847:6;2900:2;2888:9;2879:7;2875:23;2871:32;2868:52;;;2916:1;2913;2906:12;2868:52;2955:9;2942:23;2974:31;2999:5;2974:31;:::i;3040:127::-;3101:10;3096:3;3092:20;3089:1;3082:31;3132:4;3129:1;3122:15;3156:4;3153:1;3146:15;3172:275;3243:2;3237:9;3308:2;3289:13;;-1:-1:-1;;3285:27:1;3273:40;;3343:18;3328:34;;3364:22;;;3325:62;3322:88;;;3390:18;;:::i;:::-;3426:2;3419:22;3172:275;;-1:-1:-1;3172:275:1:o;3452:183::-;3512:4;3545:18;3537:6;3534:30;3531:56;;;3567:18;;:::i;:::-;-1:-1:-1;3612:1:1;3608:14;3624:4;3604:25;;3452:183::o;3640:662::-;3694:5;3747:3;3740:4;3732:6;3728:17;3724:27;3714:55;;3765:1;3762;3755:12;3714:55;3801:6;3788:20;3827:4;3851:60;3867:43;3907:2;3867:43;:::i;:::-;3851:60;:::i;:::-;3945:15;;;4031:1;4027:10;;;;4015:23;;4011:32;;;3976:12;;;;4055:15;;;4052:35;;;4083:1;4080;4073:12;4052:35;4119:2;4111:6;4107:15;4131:142;4147:6;4142:3;4139:15;4131:142;;;4213:17;;4201:30;;4251:12;;;;4164;;4131:142;;;-1:-1:-1;4291:5:1;3640:662;-1:-1:-1;;;;;;3640:662:1:o;4307:1215::-;4425:6;4433;4486:2;4474:9;4465:7;4461:23;4457:32;4454:52;;;4502:1;4499;4492:12;4454:52;4542:9;4529:23;4571:18;4612:2;4604:6;4601:14;4598:34;;;4628:1;4625;4618:12;4598:34;4666:6;4655:9;4651:22;4641:32;;4711:7;4704:4;4700:2;4696:13;4692:27;4682:55;;4733:1;4730;4723:12;4682:55;4769:2;4756:16;4791:4;4815:60;4831:43;4871:2;4831:43;:::i;4815:60::-;4909:15;;;4991:1;4987:10;;;;4979:19;;4975:28;;;4940:12;;;;5015:19;;;5012:39;;;5047:1;5044;5037:12;5012:39;5071:11;;;;5091:217;5107:6;5102:3;5099:15;5091:217;;;5187:3;5174:17;5204:31;5229:5;5204:31;:::i;:::-;5248:18;;5124:12;;;;5286;;;;5091:217;;;5327:5;-1:-1:-1;;5370:18:1;;5357:32;;-1:-1:-1;;5401:16:1;;;5398:36;;;5430:1;5427;5420:12;5398:36;;5453:63;5508:7;5497:8;5486:9;5482:24;5453:63;:::i;:::-;5443:73;;;4307:1215;;;;;:::o;5527:456::-;5604:6;5612;5620;5673:2;5661:9;5652:7;5648:23;5644:32;5641:52;;;5689:1;5686;5679:12;5641:52;5728:9;5715:23;5747:31;5772:5;5747:31;:::i;:::-;5797:5;-1:-1:-1;5854:2:1;5839:18;;5826:32;5867:33;5826:32;5867:33;:::i;:::-;5527:456;;5919:7;;-1:-1:-1;;;5973:2:1;5958:18;;;;5945:32;;5527:456::o;6426:241::-;6482:6;6535:2;6523:9;6514:7;6510:23;6506:32;6503:52;;;6551:1;6548;6541:12;6503:52;6590:9;6577:23;6609:28;6631:5;6609:28;:::i;6896:799::-;7036:6;7044;7052;7060;7068;7076;7084;7092;7100;7108;7161:3;7149:9;7140:7;7136:23;7132:33;7129:53;;;7178:1;7175;7168:12;7129:53;-1:-1:-1;;7201:23:1;;;7271:2;7256:18;;7243:32;;-1:-1:-1;7322:2:1;7307:18;;7294:32;;7373:2;7358:18;;7345:32;;-1:-1:-1;7424:3:1;7409:19;;7396:33;;-1:-1:-1;7476:3:1;7461:19;;7448:33;;-1:-1:-1;7528:3:1;7513:19;;7500:33;;-1:-1:-1;7580:3:1;7565:19;;7552:33;;-1:-1:-1;7632:3:1;7617:19;;7604:33;;-1:-1:-1;7684:3:1;7669:19;7656:33;;-1:-1:-1;6896:799:1;-1:-1:-1;6896:799:1:o;8515:388::-;8583:6;8591;8644:2;8632:9;8623:7;8619:23;8615:32;8612:52;;;8660:1;8657;8650:12;8612:52;8699:9;8686:23;8718:31;8743:5;8718:31;:::i;:::-;8768:5;-1:-1:-1;8825:2:1;8810:18;;8797:32;8838:33;8797:32;8838:33;:::i;8908:356::-;9110:2;9092:21;;;9129:18;;;9122:30;9188:34;9183:2;9168:18;;9161:62;9255:2;9240:18;;8908:356::o;9269:127::-;9330:10;9325:3;9321:20;9318:1;9311:31;9361:4;9358:1;9351:15;9385:4;9382:1;9375:15;9401:168;9474:9;;;9505;;9522:15;;;9516:22;;9502:37;9492:71;;9543:18;;:::i;9574:380::-;9653:1;9649:12;;;;9696;;;9717:61;;9771:4;9763:6;9759:17;9749:27;;9717:61;9824:2;9816:6;9813:14;9793:18;9790:38;9787:161;;9870:10;9865:3;9861:20;9858:1;9851:31;9905:4;9902:1;9895:15;9933:4;9930:1;9923:15;9787:161;;9574:380;;;:::o;11433:127::-;11494:10;11489:3;11485:20;11482:1;11475:31;11525:4;11522:1;11515:15;11549:4;11546:1;11539:15;11852:135;11891:3;11912:17;;;11909:43;;11932:18;;:::i;:::-;-1:-1:-1;11979:1:1;11968:13;;11852:135::o;11992:251::-;12062:6;12115:2;12103:9;12094:7;12090:23;12086:32;12083:52;;;12131:1;12128;12121:12;12083:52;12163:9;12157:16;12182:31;12207:5;12182:31;:::i;12248:184::-;12318:6;12371:2;12359:9;12350:7;12346:23;12342:32;12339:52;;;12387:1;12384;12377:12;12339:52;-1:-1:-1;12410:16:1;;12248:184;-1:-1:-1;12248:184:1:o;12437:403::-;12639:2;12621:21;;;12678:2;12658:18;;;12651:30;12717:34;12712:2;12697:18;;12690:62;-1:-1:-1;;;12783:2:1;12768:18;;12761:37;12830:3;12815:19;;12437:403::o;13150:245::-;13217:6;13270:2;13258:9;13249:7;13245:23;13241:32;13238:52;;;13286:1;13283;13276:12;13238:52;13318:9;13312:16;13337:28;13359:5;13337:28;:::i;13400:306::-;13488:6;13496;13504;13557:2;13545:9;13536:7;13532:23;13528:32;13525:52;;;13573:1;13570;13563:12;13525:52;13602:9;13596:16;13586:26;;13652:2;13641:9;13637:18;13631:25;13621:35;;13696:2;13685:9;13681:18;13675:25;13665:35;;13400:306;;;;;:::o;17379:557::-;17492:6;17500;17508;17516;17524;17532;17585:3;17573:9;17564:7;17560:23;17556:33;17553:53;;;17602:1;17599;17592:12;17553:53;17634:9;17628:16;17653:31;17678:5;17653:31;:::i;:::-;17748:2;17733:18;;17727:25;17792:2;17777:18;;17771:25;17836:2;17821:18;;17815:25;17880:3;17865:19;;17859:26;17925:3;17910:19;;;17904:26;17703:5;;17727:25;;-1:-1:-1;17771:25:1;;17815;;-1:-1:-1;17859:26:1;-1:-1:-1;17904:26:1;;-1:-1:-1;17379:557:1;-1:-1:-1;;;17379:557:1:o;18755:217::-;18795:1;18821;18811:132;;18865:10;18860:3;18856:20;18853:1;18846:31;18900:4;18897:1;18890:15;18928:4;18925:1;18918:15;18811:132;-1:-1:-1;18957:9:1;;18755:217::o;19388:125::-;19453:9;;;19474:10;;;19471:36;;;19487:18;;:::i;21628:401::-;21830:2;21812:21;;;21869:2;21849:18;;;21842:30;21908:34;21903:2;21888:18;;21881:62;-1:-1:-1;;;21974:2:1;21959:18;;21952:35;22019:3;22004:19;;21628:401::o;22034:399::-;22236:2;22218:21;;;22275:2;22255:18;;;22248:30;22314:34;22309:2;22294:18;;22287:62;-1:-1:-1;;;22380:2:1;22365:18;;22358:33;22423:3;22408:19;;22034:399::o;25938:128::-;26005:9;;;26026:11;;;26023:37;;;26040:18;;:::i;27667:980::-;27929:4;27977:3;27966:9;27962:19;28008:6;27997:9;27990:25;28034:2;28072:6;28067:2;28056:9;28052:18;28045:34;28115:3;28110:2;28099:9;28095:18;28088:31;28139:6;28174;28168:13;28205:6;28197;28190:22;28243:3;28232:9;28228:19;28221:26;;28282:2;28274:6;28270:15;28256:29;;28303:1;28313:195;28327:6;28324:1;28321:13;28313:195;;;28392:13;;-1:-1:-1;;;;;28388:39:1;28376:52;;28483:15;;;;28448:12;;;;28424:1;28342:9;28313:195;;;-1:-1:-1;;;;;;;28564:32:1;;;;28559:2;28544:18;;28537:60;-1:-1:-1;;;28628:3:1;28613:19;28606:35;28525:3;27667:980;-1:-1:-1;;;27667:980:1:o

Swarm Source

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