BNB Price: $694.99 (-2.11%)
Gas: 1 GWei
 

Overview

Max Total Supply

100,000,000,000BST

Holders

438

Market

Price

$0.00 @ 0.000000 BNB

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
USD Coin: USDC Token
Balance
95 BST

Value
$0.00
0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
BST

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at BscScan.com on 2021-09-04
*/

pragma solidity ^0.7.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/Context.sol

pragma solidity >=0.6.0 <0.8.0;

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

// File: contracts/IUniswapV2Router01.sol

pragma solidity >=0.6.2;

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

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

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

pragma solidity >=0.6.2;


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

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}
// File: contracts/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

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

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}
// File: contracts/IUniswapV2Pair.sol

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}
// File: contracts/IterableMapping.sol

pragma solidity ^0.7.6;

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

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

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

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

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

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

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

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

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

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

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}
// File: contracts/Ownable.sol

pragma solidity ^0.7.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}
// File: contracts/IDividendPayingTokenOptional.sol

pragma solidity ^0.7.6;

/// @title Dividend-Paying Token Optional Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev OPTIONAL functions for a dividend-paying token contract.
interface IDividendPayingTokenOptional {
  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) external view returns(uint256);

  /// @notice View the amount of dividend in wei that an address has withdrawn.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has withdrawn.
  function withdrawnDividendOf(address _owner) external view returns(uint256);

  /// @notice View the amount of dividend in wei that an address has earned in total.
  /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) external view returns(uint256);
}
// File: contracts/IDividendPayingToken.sol

pragma solidity ^0.7.6;

/// @title Dividend-Paying Token Interface
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev An interface for a dividend-paying token contract.
interface IDividendPayingToken {
  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) external view returns(uint256);

  /// @notice Distributes ether to token holders as dividends.
  /// @dev SHOULD distribute the paid ether to token holders as dividends.
  ///  SHOULD NOT directly transfer ether to token holders in this function.
  ///  MUST emit a `DividendsDistributed` event when the amount of distributed ether is greater than 0.
  function distributeDividends() external payable;

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev SHOULD transfer `dividendOf(msg.sender)` wei to `msg.sender`, and `dividendOf(msg.sender)` SHOULD be 0 after the transfer.
  ///  MUST emit a `DividendWithdrawn` event if the amount of ether transferred is greater than 0.
  function withdrawDividend() external;

  /// @dev This event MUST emit when ether is distributed to token holders.
  /// @param from The address which sends ether to this contract.
  /// @param weiAmount The amount of distributed ether in wei.
  event DividendsDistributed(
    address indexed from,
    uint256 weiAmount
  );

  /// @dev This event MUST emit when an address withdraws their dividend.
  /// @param to The address which withdraws ether from this contract.
  /// @param weiAmount The amount of withdrawn ether in wei.
  event DividendWithdrawn(
    address indexed to,
    uint256 weiAmount,
    address indexed tokenWithdrawn
  );
}
// File: contracts/SafeMathInt.sol

pragma solidity ^0.7.6;

/**
 * @title SafeMathInt
 * @dev Math operations with safety checks that revert on error
 * @dev SafeMath adapted for int256
 * Based on code of  https://github.com/RequestNetwork/requestNetwork/blob/master/packages/requestNetworkSmartContracts/contracts/base/math/SafeMathInt.sol
 */
library SafeMathInt {
  function mul(int256 a, int256 b) internal pure returns (int256) {
    // Prevent overflow when multiplying INT256_MIN with -1
    // https://github.com/RequestNetwork/requestNetwork/issues/43
    require(!(a == - 2**255 && b == -1) && !(b == - 2**255 && a == -1));

    int256 c = a * b;
    require((b == 0) || (c / b == a));
    return c;
  }

  function div(int256 a, int256 b) internal pure returns (int256) {
    // Prevent overflow when dividing INT256_MIN by -1
    // https://github.com/RequestNetwork/requestNetwork/issues/43
    require(!(a == - 2**255 && b == -1) && (b > 0));

    return a / b;
  }

  function sub(int256 a, int256 b) internal pure returns (int256) {
    require((b >= 0 && a - b <= a) || (b < 0 && a - b > a));

    return a - b;
  }

  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 toUint256Safe(int256 a) internal pure returns (uint256) {
    require(a >= 0);
    return uint256(a);
  }
}
// File: contracts/SafeMathUint.sol

pragma solidity ^0.7.6;

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

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _decimals = 18;
    }

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    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;
    }

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

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

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    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);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) 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);
    }

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

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

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal virtual {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
// File: contracts/SafeMath.sol
pragma solidity ^0.7.0;
/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}
// File: contracts/BSTDividendPayingToken.sol
pragma solidity ^0.7.6;
/// @title Dividend-Paying Token
/// @author Roger Wu (https://github.com/roger-wu)
/// @dev A mintable ERC20 token that allows anyone to pay and distribute ether
///  to token holders as dividends and allows token holders to withdraw their dividends.
///  Reference: the source code of PoWH3D: https://etherscan.io/address/0xB3775fB83F7D12A36E0475aBdD1FCA35c091efBe#code
contract DividendPayingToken is ERC20, IDividendPayingToken, IDividendPayingTokenOptional {
  using SafeMath for uint256;
  using SafeMathUint for uint256;
  using SafeMathInt for int256;

  // With `magnitude`, we can properly distribute dividends even if the amount of received ether is small.
  // For more discussion about choosing the value of `magnitude`,
  //  see https://github.com/ethereum/EIPs/issues/1726#issuecomment-472352728
  uint256 constant internal magnitude = 2**128;

  uint256 internal magnifiedDividendPerShare;
  uint256 internal lastAmount;
  
  address public DividendToken = address(0);
  address public masterContract;

    modifier onlyMaster() {
            require(masterContract == msg.sender, "Ownable: caller is not the master contract");
            _;
    }
  // About dividendCorrection:
  // If the token balance of a `_user` is never changed, the dividend of `_user` can be computed with:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user)`.
  // When `balanceOf(_user)` is changed (via minting/burning/transferring tokens),
  //   `dividendOf(_user)` should not be changed,
  //   but the computed value of `dividendPerShare * balanceOf(_user)` is changed.
  // To keep the `dividendOf(_user)` unchanged, we add a correction term:
  //   `dividendOf(_user) = dividendPerShare * balanceOf(_user) + dividendCorrectionOf(_user)`,
  //   where `dividendCorrectionOf(_user)` is updated whenever `balanceOf(_user)` is changed:
  //   `dividendCorrectionOf(_user) = dividendPerShare * (old balanceOf(_user)) - (new balanceOf(_user))`.
  // So now `dividendOf(_user)` returns the same value before and after `balanceOf(_user)` is changed.
  mapping(address => int256) internal magnifiedDividendCorrections;
  mapping(address => uint256) internal withdrawnDividends;

  uint256 public totalDividendsDistributed;

  constructor(string memory _name, string memory _symbol) public ERC20(_name, _symbol) {
    masterContract = msg.sender;
  }
  

  receive() external payable {
  }

  /// @notice Distributes ether to token holders as dividends.
  /// @dev It reverts if the total supply of tokens is 0.
  /// It emits the `DividendsDistributed` event if the amount of received ether is greater than 0.
  /// About undistributed ether:
  ///   In each distribution, there is a small amount of ether not distributed,
  ///     the magnified amount of which is
  ///     `(msg.value * magnitude) % totalSupply()`.
  ///   With a well-chosen `magnitude`, the amount of undistributed ether
  ///     (de-magnified) in a distribution can be less than 1 wei.
  ///   We can actually keep track of the undistributed ether in a distribution
  ///     and try to distribute it in the next distribution,
  ///     but keeping track of such data on-chain costs much more than
  ///     the saved ether, so we don't do that.

  function updateMasterContract(address newAddress) public onlyMaster {
        masterContract = newAddress;
  }  
  function distributeDividends() public override payable {
    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 distributeTokenDividends(uint256 amount) public onlyMaster{
    require(totalSupply() > 0);

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

      totalDividendsDistributed = totalDividendsDistributed.add(amount);
    }
  }

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
  function withdrawDividend() public virtual override {
    _withdrawDividendOfUser(msg.sender);
  }

  /// @notice Withdraws the ether distributed to the sender.
  /// @dev It emits a `DividendWithdrawn` event if the amount of withdrawn ether is greater than 0.
  /// modified to support BNB dividend
  function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
    uint256 _withdrawableDividend = withdrawableDividendOf(user);
    if (_withdrawableDividend > 0) {
      withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);

        bool success = false;
        if(DividendToken == address(0)){
            (bool sent,) = user.call{value: _withdrawableDividend}("");
            success = sent;
            emit DividendWithdrawn(user, _withdrawableDividend, DividendToken);     
        }else{
            success = IERC20(DividendToken).transfer(user, _withdrawableDividend);
            emit DividendWithdrawn(user, _withdrawableDividend, DividendToken);
        }

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

      return _withdrawableDividend;
    }

    return 0;
  }

  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function dividendOf(address _owner) public view override returns(uint256) {
    return withdrawableDividendOf(_owner);
  }

  /// @notice View the amount of dividend in wei that an address can withdraw.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` can withdraw.
  function withdrawableDividendOf(address _owner) public view override returns(uint256) {
    return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
  }

  /// @notice View the amount of dividend in wei that an address has withdrawn.
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has withdrawn.
  function withdrawnDividendOf(address _owner) public view override returns(uint256) {
    return withdrawnDividends[_owner];
  }

  /// @notice View the amount of dividend in wei that an address has earned in total.
  /// @dev accumulativeDividendOf(_owner) = withdrawableDividendOf(_owner) + withdrawnDividendOf(_owner)
  /// = (magnifiedDividendPerShare * balanceOf(_owner) + magnifiedDividendCorrections[_owner]) / magnitude
  /// @param _owner The address of a token holder.
  /// @return The amount of dividend in wei that `_owner` has earned in total.
  function accumulativeDividendOf(address _owner) public view override returns(uint256) {
    return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
      .add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
  }

  /// @dev Internal function that transfer tokens from one address to another.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param from The address to transfer from.
  /// @param to The address to transfer to.
  /// @param value The amount to be transferred.
  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);
  }

  /// @dev Internal function that mints tokens to an account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account that will receive the created tokens.
  /// @param value The amount that will be created.
  function _mint(address account, uint256 value) internal override {
    super._mint(account, value);

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

  /// @dev Internal function that burns an amount of the token of a given account.
  /// Update magnifiedDividendCorrections to keep dividends unchanged.
  /// @param account The account whose tokens will be burnt.
  /// @param value The amount that will be burnt.
  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);
    }
  }
}
// File: contracts/BST.sol
pragma solidity ^0.7.6;
contract BST is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public uniswapV2Router;
    address public immutable uniswapV2Pair;

    address public DividendToken = address(0);

    bool private swapping;

    BSTDividendTracker public dividendTracker;

    address public burnAddress;
    
    uint256 public maxBuyTransactionAmount = 100000000000 * (10**18);
    uint256 public maxSellTransactionAmount = 100000000000 * (10**18);
    uint256 public swapTokensAtAmount = 20000000 * (10**18);
    uint256 public _maxWalletToken = 100000000000 * (10**18);

    uint256 public sellLimitTime = 86400;
    mapping(address => uint256) public buycooldown;
    mapping(address => uint256) public sellcooldown;
    mapping(address => uint256) public firstsell;
    mapping(address => uint256) public sellnumber;
    address payable public marketAddress;
    address payable public charityAddress;
    address payable public buyBackAddress;
    address public marketTokenAddressForFee;
    address public charityTokenAddressForFee;
    address public buyBackTokenAddressForFee;
    // transfer fees
    uint256 public marketFee = 0;
    uint256 public charityFee = 0;
    uint256 public buyBackFee = 0;
    uint256 public tokenRewardsFee = 5;
    uint256 public liquidityFee = 5;
    uint256 public burnFee = 0;
    uint256 public totalFees = tokenRewardsFee.add(liquidityFee).add(marketFee).add(charityFee).add(buyBackFee).add(burnFee);
    // buy fees
    uint256 public buyMarketFee = 0;
    uint256 public buyCharityFee = 0;
    uint256 public buyBuyBackFee = 0;
    uint256 public buyTokenRewardsFee = 5;
    uint256 public buyLiquidityFee = 5;
    uint256 public buyBurnFee = 0;
    uint256 public buyTotalFees = buyTokenRewardsFee.add(buyLiquidityFee).add(buyMarketFee).add(buyCharityFee).add(buyBuyBackFee).add(buyBurnFee);
    // sell fees
    uint256 public sellMarketFee = 0;
    uint256 public sellCharityFee = 0;
    uint256 public sellBuyBackFee = 0;
    uint256 public sellTokenRewardsFee = 5;
    uint256 public sellLiquidityFee = 5;
    uint256 public sellBurnFee = 0;
    uint256 public sellTotalFees = sellTokenRewardsFee.add(sellLiquidityFee).add(sellMarketFee).add(sellCharityFee).add(sellBuyBackFee).add(sellBurnFee);
    // fee tracker
    uint256 private previousMarketFee = marketFee;
    uint256 private previousCharityFee = charityFee;
    uint256 private previousBuyBackFee = buyBackFee;
    uint256 private previousTokenRewardsFee = tokenRewardsFee;
    uint256 private previousLiquidityFee = liquidityFee;
    uint256 private previousBurnFee = burnFee;
    uint256 private previousTotalFees = totalFees;
    //
    uint256 public processDividendTime;
    uint256 public dividendTime = 3600;
    //
    bool public isBuyBackActive = true;
    bool public isTransferFeesDisabled = true;

    // use by default 300,000 gas to process auto-claiming dividends
    uint256 public gasForProcessing = 350000;
    
    address public presaleAddress = address(0);

    // timestamp for when the token can be traded freely on PanackeSwap
    uint256 public tradingEnabledTimestamp = 1626399138;

    // blacklisted from all transfers
    mapping (address => bool) private _isBlacklisted;    
    // exlcude from fees and max transaction amount
    mapping (address => bool) private _isExcludedFromFees;
    mapping (address => bool) private _isExcludedFromLimits;

    // addresses that can make transfers before presale is over
    mapping (address => bool) private canTransferBeforeTradingIsEnabled;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping (address => bool) public automatedMarketMakerPairs;

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

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

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

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event ExcludeMultipleAccountsFromFees(address[] accounts, bool isExcluded);
    event ExcludedMaxSellTransactionAmount(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event BurnWalletUpdated(address indexed newBurnWallet, address indexed oldBurnWallet);

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

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

    event SendDividends(
        uint256 tokensSwapped,
        uint256 amount
    );

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

    constructor() public ERC20("Binance Smart Token", "BST") {
        // LP burn address
        burnAddress = address(0xdead);
        uint256 _processDividendTime = block.timestamp;
        processDividendTime = _processDividendTime;

        dividendTracker = new BSTDividendTracker();
        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x10ED43C718714eb63d5aA57B78B54704E256024E);
         // Create a uniswap pair for this new token
        address _uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;

        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        // exclude from receiving dividends
        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));
        dividendTracker.excludeFromDividends(owner());
        _isExcludedFromLimits[address(dividendTracker)];
        _isExcludedFromLimits[address(this)];
        _isExcludedFromLimits[address(_uniswapV2Router)];
        _isExcludedFromLimits[owner()];
        _isExcludedFromLimits[_uniswapV2Pair];


        // exclude from paying fees
        excludeFromFees(burnAddress, true);
        excludeFromFees(address(this), true);
        excludeFromFees(owner(), true);


        // enable owner and fixed-sale wallet to send tokens before presales are over
        canTransferBeforeTradingIsEnabled[owner()] = true;
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(owner(), 100000000000 * (10**decimals()));
    }

    receive() external payable {

    }
    
    function swapAndLiquifyOwner(uint256 _tokens) external onlyOwner {
        swapAndLiquify(_tokens);
    }    
    
    function swapAndSendDividendsOwner(uint256 _tokens) external onlyOwner {
        swapAndSendDividends(_tokens);
    }
    function restoreFees() internal {
            marketFee = previousMarketFee;
            charityFee = previousCharityFee;
            buyBackFee = previousBuyBackFee;
            tokenRewardsFee = previousTokenRewardsFee;
            liquidityFee = previousLiquidityFee;
            burnFee = previousBurnFee;
            totalFees = previousTotalFees;
    
    }       
    
    function updateMaxSellTx(uint256 _newAmountNoDecimals) external onlyOwner {
        maxSellTransactionAmount = _newAmountNoDecimals * (10**decimals());
    }   

    function updateMaxWalletAmount(uint256 newAmountNoDecimials) external onlyOwner {
        _maxWalletToken = newAmountNoDecimials * (10**decimals());
    }     

    function updateSwapAtAmount(uint256 newAmountNoDecimials) external onlyOwner {
        swapTokensAtAmount = newAmountNoDecimials * (10**decimals());
    } 
    
    function updateMaxBuyTx(uint256 _newAmountNoDecimals) external onlyOwner {
        maxBuyTransactionAmount = _newAmountNoDecimals * (10**decimals());
    }

    function updatedividendTime(uint256 _dividendTime) external onlyOwner {
        dividendTime = _dividendTime;
    }      
    
    function updateBuyBackMode(bool _isBuyBackActive) external onlyOwner {
        isBuyBackActive = _isBuyBackActive;
    }    
    
    function updateisTransferDisabled(bool _isTransferDisabled) external onlyOwner {
        isTransferFeesDisabled = _isTransferDisabled;
    }     

    function updateTradingEnabledTime (uint256 newTimeInEpoch) external onlyOwner {
        tradingEnabledTimestamp = newTimeInEpoch;
    }     

    function updateMinimumBalanceForDividends (uint256 newAmountNoDecimials) external onlyOwner {
        dividendTracker.updateMinimumBalanceForDividends(newAmountNoDecimials);
    }    
    
    function updateTokenForDividend(address newAddress) external onlyOwner {
        dividendTracker.updateTokenForDividend(newAddress);
        DividendToken = newAddress;
        emit UpdateDividendToken(newAddress, address(DividendToken));
    }    

    function updateMarketAddress(address payable newAddress) external onlyOwner {
        marketAddress = newAddress;
        _isExcludedFromFees[newAddress] = true;
        //dividendTracker.excludeFromDividends(marketAddress);     
    }    

    function updateCharityAddress(address payable newAddress) external onlyOwner {
        charityAddress = newAddress;
        _isExcludedFromFees[newAddress] = true;
        //dividendTracker.excludeFromDividends(charityAddress);
    }       

    function updateBuyBackAddress(address payable newAddress) external onlyOwner {
        buyBackAddress = newAddress;
        _isExcludedFromFees[newAddress] = true;
        //dividendTracker.excludeFromDividends(buyBackAddress);
    }    

    function updateMarketTokenFeeAddress(address newAddress) external onlyOwner {
        marketTokenAddressForFee = newAddress;
    }    

    function updateCharityTokenFeeAddress(address newAddress) external onlyOwner {
        charityTokenAddressForFee = newAddress;
    }    

    function updateBuyBackTokenFeeAddress(address newAddress) external onlyOwner {
        buyBackTokenAddressForFee = newAddress;
    }
    
    function burnTokens(uint256 amountNoDecimals) external onlyOwner {
        uint256 sendAmount = amountNoDecimals * (10**decimals());
        super._transfer(address(this), burnAddress, sendAmount);
    }
    function updateFees(uint256 _tokenRewardsFee, uint256 _liquidityFee, uint256 _marketFee, uint256 _charityFee, uint256 _buyBackFee, uint256 _burnFee) external onlyOwner {
        tokenRewardsFee = _tokenRewardsFee;
        liquidityFee = _liquidityFee;
        marketFee = _marketFee;
        charityFee = _charityFee;
        buyBackFee = _buyBackFee;
        burnFee = _burnFee;
        totalFees = _tokenRewardsFee.add(_liquidityFee).add(_marketFee).add(_charityFee).add(_buyBackFee).add(_burnFee);
    }    
    
    function updateBuyFees(uint256 _tokenRewardsFee, uint256 _liquidityFee, uint256 _marketFee, uint256 _charityFee, uint256 _buyBackFee, uint256 _burnFee) external onlyOwner {
        buyTokenRewardsFee = _tokenRewardsFee;
        buyLiquidityFee = _liquidityFee;
        buyMarketFee = _marketFee;
        buyCharityFee = _charityFee;
        buyBuyBackFee = _buyBackFee;
        buyBurnFee = _burnFee;
        buyTotalFees = _tokenRewardsFee.add(_liquidityFee).add(_marketFee).add(_charityFee).add(_buyBackFee).add(_burnFee);
    }    
    
    function updateSellFees(uint256 _tokenRewardsFee, uint256 _liquidityFee, uint256 _marketFee, uint256 _charityFee, uint256 _buyBackFee, uint256 _burnFee) external onlyOwner {
        sellTokenRewardsFee = _tokenRewardsFee;
        sellLiquidityFee = _liquidityFee;
        sellMarketFee = _marketFee;
        sellCharityFee = _charityFee;
        sellBuyBackFee = _buyBackFee;
        sellBurnFee = _burnFee;
        sellTotalFees = _tokenRewardsFee.add(_liquidityFee).add(_marketFee).add(_charityFee).add(_buyBackFee).add(_burnFee);
    }
    
    function whitelistDxSale(address _presaleAddress, address _routerAddress) external onlyOwner {
        presaleAddress = _presaleAddress;
        canTransferBeforeTradingIsEnabled[presaleAddress] = true;
        dividendTracker.excludeFromDividends(_presaleAddress);
        excludeFromFees(_presaleAddress, true);

        canTransferBeforeTradingIsEnabled[_routerAddress] = true;
        dividendTracker.excludeFromDividends(_routerAddress);
        excludeFromFees(_routerAddress, true);
    }

    function updateDividendTracker(address newAddress) external onlyOwner {
        require(newAddress != address(dividendTracker), "BST: The dividend tracker already has that address");

        BSTDividendTracker newDividendTracker = BSTDividendTracker(payable(newAddress));

        require(newDividendTracker.owner() == address(this), "BST: The new dividend tracker must be owned by the BST token contract");

        newDividendTracker.excludeFromDividends(address(newDividendTracker));
        newDividendTracker.excludeFromDividends(address(this));
        newDividendTracker.excludeFromDividends(address(uniswapV2Router));

        emit UpdateDividendTracker(newAddress, address(dividendTracker));

        dividendTracker = newDividendTracker;
    }

    function updateUniswapV2Router(address newAddress) external onlyOwner {
        require(newAddress != address(uniswapV2Router), "BST: The router already has that address");
        emit UpdateUniswapV2Router(newAddress, address(uniswapV2Router));
        uniswapV2Router = IUniswapV2Router02(newAddress);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        //require(_isExcludedFromFees[account] != excluded, "BST: Account is already the value of 'excluded'");
        _isExcludedFromFees[account] = excluded;
        //dividendTracker.excludeFromDividends(account);
        //emit ExcludeFromFees(account, excluded);
    }           
    
    function excludeFromLimits(address account, bool excluded) public onlyOwner {
        //require(_isExcludedFromFees[account] != excluded, "BST: Account is already the value of 'excluded'");
        _isExcludedFromLimits[account] = excluded;
        //dividendTracker.excludeFromDividends(account);
        //emit ExcludeFromFees(account, excluded);
    }       

    function blacklistAddress(address account, bool excluded) public onlyOwner {
        //require(_isExcludedFromFees[account] != excluded, "BST: Account is already the value of 'excluded'");
        _isBlacklisted[account] = excluded;
        dividendTracker.excludeFromDividends(account);
        //emit ExcludeFromFees(account, excluded);
    }    

    function excludeFromDividends(address account) public onlyOwner {
        //require(_isExcludedFromFees[account] != excluded, "BST: Account is already the value of 'excluded'");
        dividendTracker.excludeFromDividends(account);
        //emit ExcludeFromFees(account, excluded);
    }    

    function enableDividends(address account) public onlyOwner {
        //require(_isExcludedFromFees[account] != excluded, "BST: Account is already the value of 'excluded'");
        dividendTracker.enableDividends(account);
        //emit ExcludeFromFees(account, excluded);
    }

    function excludeMultipleAccountsFromFees(address[] calldata accounts, bool excluded) external onlyOwner {
        for(uint256 i = 0; i < accounts.length; i++) {
            _isExcludedFromFees[accounts[i]] = excluded;
        }

        emit ExcludeMultipleAccountsFromFees(accounts, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value) external onlyOwner {
        require(pair != uniswapV2Pair, "BST: The PancakeSwap pair cannot be removed from automatedMarketMakerPairs");

        _setAutomatedMarketMakerPair(pair, value);
    }

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

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }

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

    function updateClaimWait(uint256 claimWait) external onlyOwner {
        dividendTracker.updateClaimWait(claimWait);
    }

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

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

    function isExcludedFromFees(address account) public view returns(bool) {
        return _isExcludedFromFees[account];
    }    
    
    function isExcludedFromLimits(address account) public view returns(bool) {
        return _isExcludedFromLimits[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,
            uint256,
            uint256) {
        return dividendTracker.getAccount(account);
    }

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

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

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

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

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

    function getTradingIsEnabled() public view returns (bool) {
        return block.timestamp >= tradingEnabledTimestamp;
    }

    function swapAndLiquify(uint256 tokens) private  {
        uint256 marketFeeFull;
        uint256 charityFeeFull;
        uint256 buyBackFeeFull;
        
        if(marketFee != 0){
            marketFeeFull = tokens.mul(marketFee).div(100);
        }
        if(charityFee != 0){
            charityFeeFull = tokens.mul(charityFee).div(100);
        }
        if(buyBackFee != 0){
            buyBackFeeFull = tokens.mul(buyBackFee).div(100);
        }

        uint256 tokensAfterFee = tokens - marketFeeFull - charityFeeFull - buyBackFeeFull;
        // split the contract balance into halves
        uint256 initHalf = tokens.div(2);
        uint256 half = tokensAfterFee.div(2);
        uint256 otherHalf = tokensAfterFee.sub(half);

        // capture the contract's current ETH balance.
        // this is so that we can capture exactly the amount of ETH that the
        // swap creates, and not make the liquidity event include any ETH that
        // has been manually sent to the contract
        uint256 initialBalance = address(this).balance;

        // swap tokens for ETH
        swapTokensForEth(initHalf); // <- this breaks the ETH -> HATE swap when swap+liquify is triggered
        // how much ETH did we just swap into?
        uint256 newBalance = address(this).balance.sub(initialBalance);

        uint256 marketFeeBalance;
        uint256 charityFeeBalance;
        uint256 buyBackFeeBalance;

        if(marketFee != 0){
            marketFeeBalance = newBalance.mul(marketFee).div(100);
        }
        if(charityFee != 0){
            charityFeeBalance = newBalance.mul(charityFee).div(100);
        }
        if(buyBackFee != 0){
            buyBackFeeBalance = newBalance.mul(buyBackFee).div(100);
        }
        
        uint256 finalBalance = newBalance - marketFeeBalance - charityFeeBalance - buyBackFeeBalance;
        uint256 finalHalf = otherHalf;

        if(marketFeeBalance != 0){
        if(marketTokenAddressForFee != address(0)){
            swapEthForTokens(marketFeeBalance, marketTokenAddressForFee, marketAddress);
        }else{
            (bool sent,) = marketAddress.call{value: marketFeeBalance}("");
        }}

        if(charityFeeBalance != 0){        
        if(charityTokenAddressForFee != address(0)){
            swapEthForTokens(charityFeeBalance, charityTokenAddressForFee, charityAddress);
        }else{
            (bool sent,) = charityAddress.call{value: charityFeeBalance}("");
        }}
        
        if(buyBackFeeBalance != 0){        
        if(isBuyBackActive){
            swapEthForTokens(buyBackFeeBalance, address(this), buyBackAddress);
        }else{
            (bool sent,) = buyBackAddress.call{value: buyBackFeeBalance}("");
        }}

        // add liquidity to uniswap
        addLiquidity(finalHalf, finalBalance);
        emit SwapAndLiquify(half, finalBalance, otherHalf);
    }
    // modified to support BNB dividend
    function swapAndSendDividends(uint256 tokens) private {
        address payable diviTracker = address(dividendTracker);
        bool success = false;
        uint256 dividends;
        if(DividendToken != address(0)){
            swapTokensForTokens(tokens, address(this));
            dividends = IERC20(DividendToken).balanceOf(address(this));
            success = IERC20(DividendToken).transfer(address(dividendTracker), dividends);
        }else{
            uint256 initialBalance = address(this).balance;
            swapTokensForEth(tokens);
            uint256 newBalance = address(this).balance.sub(initialBalance);
            dividends = newBalance;
            (bool sent,) = diviTracker.call{value: newBalance}("");
            success = sent;
        }
        if (success) {
            dividendTracker.distributeTokenDividends(dividends);
            emit SendDividends(tokens, dividends);
        }
    } 
    function swapEthForTokens(uint256 ethAmount, address tokenAddress, address receiver) private {
        // generate the uniswap pair path of weth -> token
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = tokenAddress;

        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ethAmount}(
            0, // accept any amount of ETH
            path,
            receiver,
            block.timestamp
        );
    }
    function swapTokensForEth(uint256 tokenAmount) private {    
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
        
    }
    function swapTokensForTokens(uint256 tokenAmount, address recipient) private {
       
        // generate the uniswap pair path of weth -> busd
        address[] memory path = new address[](3);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        path[2] = DividendToken;

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of BUSD
            path,
            recipient,
            block.timestamp
        );
        
    }
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) internal {
        
        // 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
            burnAddress,
            block.timestamp
        );
        
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(!_isBlacklisted[from], "Blacklisted address cannot transfer!");
        require(!_isBlacklisted[to], "Blacklisted address cannot transfer!");
        require(from != address(0), "ERC20: transfer to the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        bool buyOrSell = false;
        if (
            from != owner() &&
            to != address(0) &&
            to != address(0xdead) &&
            automatedMarketMakerPairs[from]
        ) {
            if(!_isExcludedFromLimits[from]){
            require(
                amount <= maxBuyTransactionAmount,
                "Transfer amount exceeds the maxTxAmount."
            );
            }

            previousMarketFee = marketFee;
            previousCharityFee = charityFee;
            previousBuyBackFee = buyBackFee;
            previousTokenRewardsFee = tokenRewardsFee;
            previousLiquidityFee = liquidityFee;
            previousBurnFee = liquidityFee;
            previousTotalFees = totalFees;
            marketFee = buyMarketFee;
            charityFee = buyCharityFee;
            buyBackFee = buyBuyBackFee;
            tokenRewardsFee = buyTokenRewardsFee;
            liquidityFee = buyLiquidityFee;
            burnFee = buyBurnFee;
            totalFees = buyTotalFees;
            buyOrSell = true;
        }
        
        
        
        bool tradingIsEnabled = getTradingIsEnabled();
        

        // only whitelisted addresses can make transfers after the fixed-sale has started
        // and before the public presale is over
        if(!tradingIsEnabled) {
            require(canTransferBeforeTradingIsEnabled[from], "BST: This account cannot send tokens until trading is enabled");
        }

        if( 
            from != owner() &&
            !swapping &&
            tradingIsEnabled &&
            automatedMarketMakerPairs[to] && // sells only by detecting transfer to automated market maker pair
            from != address(uniswapV2Router) && //router -> pair is removing liquidity which shouldn't have max
            !_isExcludedFromFees[to] //no max for those excluded from fees
        ) {

            // sets reset
            if(firstsell[from] + sellLimitTime < block.timestamp){
                sellnumber[from] = 0;
            }

            if(!_isExcludedFromLimits[from]){
                require(amount + sellnumber[from] <= maxSellTransactionAmount, "Sell transfer amount exceeds the maxSellAmount for the given time.");
                //require(sellcooldown[from] < block.timestamp, "Wait for sell cooldown!");
            }
            // increment existing amount or restart
            if (sellnumber[from] > 0) {
                sellnumber[from] += amount;
            }else{
                firstsell[from] = block.timestamp;
                //sellcooldown[from] = block.timestamp + sellLimitTime;
                sellnumber[from] += amount;
            }
            //
            previousMarketFee = marketFee;
            previousCharityFee = charityFee;
            previousBuyBackFee = buyBackFee;
            previousTokenRewardsFee = tokenRewardsFee;
            previousLiquidityFee = liquidityFee;
            previousBurnFee = burnFee;
            previousTotalFees = totalFees;
            marketFee = sellMarketFee;
            charityFee = sellCharityFee;
            buyBackFee = sellBuyBackFee;
            tokenRewardsFee = sellTokenRewardsFee;
            liquidityFee = sellLiquidityFee;
            burnFee = sellBurnFee;
            totalFees = sellTotalFees;
            buyOrSell = true;
            
        }

        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if(
            tradingIsEnabled && 
            canSwap &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            from != burnAddress &&
            to != burnAddress
        ) {
            swapping = true;
            // added to sell this amount set instead of just trigger
            //contractTokenBalance = swapTokensAtAmount;
            //uint256 swapTokens = contractTokenBalance.mul(liquidityFee).div(totalFees);
            swapAndLiquify(swapTokensAtAmount);

            uint256 sellTokens = balanceOf(address(this));
            swapAndSendDividends(sellTokens);

            swapping = false;
        }


        bool takeFee = tradingIsEnabled && !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to] || isTransferFeesDisabled) {
            takeFee = false;
        }

        if(takeFee || buyOrSell ) {
            if(_isExcludedFromFees[from] || _isExcludedFromFees[to]){
             // exclude fees from those excluded from fees in case of buy or sell
            }else{
            uint256 calcFee = totalFees.sub(burnFee);
            uint256 feeAmount = amount.mul(calcFee).div(100);
            uint burnAmount = amount.mul(burnFee).div(100);
            amount = amount.sub(feeAmount).sub(burnAmount);
            super._transfer(from, address(this), feeAmount);
            super._transfer(from, burnAddress, burnAmount);
            }
        }else{
            if(_isExcludedFromFees[from] || _isExcludedFromFees[to]){
             // exclude burn from those excluded from fees
            }else{
            uint burnAmount = amount.mul(burnFee).div(100);
            amount = amount.sub(burnAmount);
            super._transfer(from, burnAddress, burnAmount);
            }
        }
        

        super._transfer(from, to, amount);

        if(buyOrSell){
        restoreFees();
        }

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

        bool canDividend = block.timestamp >= processDividendTime;

        if(!swapping && canDividend) {
            uint256 gas = gasForProcessing;
            processDividendTime += dividendTime;
            try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
                emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
            }
            catch {

            }
        }
    }
    
}

contract BSTDividendTracker 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 => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;

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

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

    constructor() public DividendPayingToken("BST_Dividend_Tracker", "BST_Dividend_Tracker") {
        claimWait = 3600;
        minimumTokenBalanceForDividends = 1 * (10**18);
    }

    function updateMinimumBalanceForDividends(uint256 newAmountNoDecimials) external onlyOwner{
        minimumTokenBalanceForDividends = newAmountNoDecimials * (10**18);
    }

    function updateTokenForDividend(address newAddress) external onlyOwner {
        DividendToken = newAddress;
    }  
    
    function _transfer(address, address, uint256) internal override {
        require(false, "BST_Dividend_Tracker: No transfers allowed");
    }

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

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

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

        //emit ExcludeFromDividends(account);
    }    

    function enableDividends(address account) external onlyOwner {
        //require(!excludedFromDividends[account]);
        excludedFromDividends[account] = false;
        //emit ExcludeFromDividends(account);
    }

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

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

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


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

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

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


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


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

        lastClaimTime = lastClaimTimes[account];

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

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

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

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

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

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

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

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

        processAccount(account, true);
    }

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

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

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

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

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

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

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

            iterations++;

            uint256 newGasLeft = gasleft();

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

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

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

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

        return false;
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newBurnWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldBurnWallet","type":"address"}],"name":"BurnWalletUpdated","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":false,"internalType":"address[]","name":"accounts","type":"address[]"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeMultipleAccountsFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedMaxSellTransactionAmount","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":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"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":"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":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"DividendToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountNoDecimals","type":"uint256"}],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBackAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBackTokenAddressForFee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyBurnFee","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":"buyCharityFee","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":"buyMarketFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTokenRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"buycooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityTokenAddressForFee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dividendTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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 BSTDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"enableDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeMultipleAccountsFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"firstsell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTradingIsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"isBuyBackActive","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":"isExcludedFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTransferFeesDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketTokenAddressForFee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBuyTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSellTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"processDividendTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"sellBurnFee","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":"sellCharityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLimitTime","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":"sellMarketFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTokenRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sellcooldown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sellnumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"swapAndLiquifyOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"swapAndSendDividendsOwner","outputs":[],"stateMutability":"nonpayable","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":"tokenRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabledTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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 payable","name":"newAddress","type":"address"}],"name":"updateBuyBackAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isBuyBackActive","type":"bool"}],"name":"updateBuyBackMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateBuyBackTokenFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenRewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_marketFee","type":"uint256"},{"internalType":"uint256","name":"_charityFee","type":"uint256"},{"internalType":"uint256","name":"_buyBackFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddress","type":"address"}],"name":"updateCharityAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateCharityTokenFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenRewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_marketFee","type":"uint256"},{"internalType":"uint256","name":"_charityFee","type":"uint256"},{"internalType":"uint256","name":"_buyBackFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newAddress","type":"address"}],"name":"updateMarketAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateMarketTokenFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmountNoDecimals","type":"uint256"}],"name":"updateMaxBuyTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAmountNoDecimals","type":"uint256"}],"name":"updateMaxSellTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmountNoDecimials","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmountNoDecimials","type":"uint256"}],"name":"updateMinimumBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenRewardsFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_marketFee","type":"uint256"},{"internalType":"uint256","name":"_charityFee","type":"uint256"},{"internalType":"uint256","name":"_buyBackFee","type":"uint256"},{"internalType":"uint256","name":"_burnFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmountNoDecimials","type":"uint256"}],"name":"updateSwapAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateTokenForDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTimeInEpoch","type":"uint256"}],"name":"updateTradingEnabledTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dividendTime","type":"uint256"}],"name":"updatedividendTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isTransferDisabled","type":"bool"}],"name":"updateisTransferDisabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_presaleAddress","type":"address"},{"internalType":"address","name":"_routerAddress","type":"address"}],"name":"whitelistDxSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0604052600780546001600160a01b03191690556c01431e0fae6d7217caa0000000600a819055600b8190556a108b2a2c28029094000000600c55600d5562015180600e5560006019819055601a819055601b8190556005601c819055601d819055601e829055620000a5919062000091908290829082908290829082908062000780602090811b62003bf417901c565b6200078060201b62003bf41790919060201c565b601f5560006020556000602155600060225560056023556005602455600060255562000100602554620000916022546200009160215462000091602054620000916024546023546200078060201b62003bf41790919060201c565b6026556000602755600060285560006029556005602a556005602b556000602c556200015b602c5462000091602954620000916028546200009160275462000091602b54602a546200078060201b62003bf41790919060201c565b602d55601954602e55601a54602f55601b54603055601c54603155601d54603255601e54603355601f54603455610e106036556037805461ff001960ff199091166001171661010017905562055730603855603980546001600160a01b03191690556360f0e1a2603a55348015620001d257600080fd5b506040518060400160405280601381526020017f42696e616e636520536d61727420546f6b656e00000000000000000000000000815250604051806040016040528060038152602001621094d560ea1b81525081600390805190602001906200023d92919062000aee565b5080516200025390600490602084019062000aee565b50506005805460ff191660121790555060006200026f620007e2565b60058054610100600160a81b0319166101006001600160a01b03841690810291909117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600980546001600160a01b03191661dead179055426035819055604051620002ed9062000b83565b604051809103906000f0801580156200030a573d6000803e3d6000fd5b50600860006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060007310ed43c718714eb63d5aa57b78b54704e256024e90506000816001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200038657600080fd5b505afa1580156200039b573d6000803e3d6000fd5b505050506040513d6020811015620003b257600080fd5b5051604080516315ab88c960e31b815290516001600160a01b039283169263c9c653969230929187169163ad5c464891600480820192602092909190829003018186803b1580156200040357600080fd5b505afa15801562000418573d6000803e3d6000fd5b505050506040513d60208110156200042f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b1580156200048257600080fd5b505af115801562000497573d6000803e3d6000fd5b505050506040513d6020811015620004ae57600080fd5b5051600680546001600160a01b0319166001600160a01b038516179055606081901b6001600160601b0319166080529050620004ec816001620007e6565b6008546040805163031e79db60e41b81526001600160a01b0390921660048301819052905190916331e79db091602480830192600092919082900301818387803b1580156200053a57600080fd5b505af11580156200054f573d6000803e3d6000fd5b50506008546040805163031e79db60e41b815230600482015290516001600160a01b0390921693506331e79db0925060248082019260009290919082900301818387803b158015620005a057600080fd5b505af1158015620005b5573d6000803e3d6000fd5b50506008546040805163031e79db60e41b81526001600160a01b03878116600483015291519190921693506331e79db09250602480830192600092919082900301818387803b1580156200060857600080fd5b505af11580156200061d573d6000803e3d6000fd5b50506008546001600160a01b031691506331e79db090506200063e62000919565b6040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b1580156200067e57600080fd5b505af115801562000693573d6000803e3d6000fd5b5050603d60208190526001600160a01b03851660009081529092509050620006ba62000919565b6001600160a01b039081168252602091820192909252828216600052603d9052600954620006eb911660016200092d565b620006f83060016200092d565b6200070e6200070662000919565b60016200092d565b6001603e60006200071e62000919565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620007776200075462000919565b6200075e620009d1565b60ff16600a0a64174876e80002620009da60201b60201c565b50505062000ba8565b600082820183811015620007db576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b0382166000908152603f602052604090205460ff1615158115151415620008465760405162461bcd60e51b815260040180806020018281038252603d81526020018062008fa8603d913960400191505060405180910390fd5b6001600160a01b0382166000908152603f60205260409020805460ff19168215801591909117909155620008dd576008546040805163031e79db60e41b81526001600160a01b038581166004830152915191909216916331e79db091602480830192600092919082900301818387803b158015620008c357600080fd5b505af1158015620008d8573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b60055461010090046001600160a01b031690565b62000937620007e2565b6001600160a01b03166200094a62000919565b6001600160a01b031614620009a6576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03919091166000908152603c60205260409020805460ff1916911515919091179055565b60055460ff1690565b6001600160a01b03821662000a36576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b62000a446000838362000ae9565b62000a60816002546200078060201b62003bf41790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000a9391839062003bf462000780821b17901c565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b505050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000b26576000855562000b71565b82601f1062000b4157805160ff191683800117855562000b71565b8280016001018555821562000b71579182015b8281111562000b7157825182559160200191906001019062000b54565b5062000b7f92915062000b91565b5090565b6128ef80620066b983390190565b5b8082111562000b7f576000815560010162000b92565b60805160601c615aee62000bcb60003980611f4d5280612ef85250615aee6000f3fe6080604052600436106106a15760003560e01c80637a41865b1161035f578063c0246668116101d1578063e708a0f911610102578063f11a24d3116100a0578063f63743421161007a578063f6374342146116fa578063f7822e091461170f578063fa280d4414611739578063fce589d814611763576106a8565b8063f11a24d314611688578063f27fd2541461169d578063f2fde38b146116c7576106a8565b8063e7841ec0116100dc578063e7841ec01461160a578063e98030c71461161f578063e9d3d61e14611649578063ecfca89914611673576106a8565b8063e708a0f9146115cb578063e71dc3f5146115e0578063e76ed0e3146115f5576106a8565b8063d4d90c251161016f578063dd62ed3e11610149578063dd62ed3e1461153a578063e2f4560514611575578063e371f7cf1461158a578063e4a1b95f146115b6576106a8565b8063d4d90c25146114dd578063d644c365146114f2578063d85ba06314611525576106a8565b8063c492f046116101ab578063c492f046146113ec578063c55d22871461146b578063c9fa039614611495578063d2630cc3146114aa576106a8565b8063c02466681461134c578063c0a904a214611387578063c18bc195146113c2576106a8565b8063992c58e4116102ab578063a8b9d24011610249578063adb873bd11610223578063adb873bd146112bc578063ae5a17a7146112d1578063afcf2fc414611304578063b62496f514611319576106a8565b8063a8b9d240146111d2578063a9059cbb14611205578063ad56c13c1461123e576106a8565b8063a1dc92bc11610285578063a1dc92bc1461113c578063a26579ad14611151578063a457c2d714611166578063a5afbcb81461119f576106a8565b8063992c58e4146110a45780639a7a23d6146110ec5780639c1b8af514611127576106a8565b80638f7142601161031857806395d89b41116102f257806395d89b4114611032578063974d628c1461104757806398118cb41461105c57806398eac15614611071576106a8565b80638f71426014610fde57806394305f4e14611008578063956236411461101d576106a8565b80637a41865b14610ed357806381dcc26614610f06578063871c128d14610f3957806388bdd9be14610f635780638ae1cf2214610f965780638da5cb5b14610fc9576106a8565b80633d0c8963116105135780635cce86cd11610444578063700bb191116103e2578063715018a6116103bc578063715018a614610e4c57806378109e5414610e61578063783478ad14610e7657806379e02b4414610e8b576106a8565b8063700bb19114610dda57806370a0823114610e0457806370d5ae0514610e37576106a8565b806365b8dbc01161041e57806365b8dbc014610d355780636843cd8414610d685780636a486a8e14610d9b5780636d1b229d14610db0576106a8565b80635cce86cd14610cc3578063616c594614610cf657806364b0f65314610d20576106a8565b80634be8f8b1116104b15780634e83ff6f1161048b5780634e83ff6f14610c145780634fbee19314610c4f57806354503bf714610c825780635aa821a914610cae576106a8565b80634be8f8b114610bd55780634d33b1ef14610bea5780634e71d92d14610bff576106a8565b8063425b682e116104ed578063425b682e14610b5b578063455a439614610b70578063486b6d8614610bab57806349bd5a5e14610bc0576106a8565b80633d0c896314610acb5780633fe9092214610afe578063407e378714610b31576106a8565b80631bc8b18f116105ed57806330bb4cff1161058b57806335b5fb631161056557806335b5fb6314610a3e57806338b7692314610a535780633950935114610a685780633b364da814610aa1576106a8565b806330bb4cff146109cb578063313ce567146109e057806331e79db014610a0b576106a8565b806323b872dd116105c757806323b872dd14610949578063255e9d0a1461098c57806325b61703146109a15780632c1f5216146109b6576106a8565b80631bc8b18f146108b75780631fe70a98146108ea57806322d3e2aa146108ff576106a8565b80630d7f14411161065a57806313114a9d1161063457806313114a9d146108635780631694505e1461087857806318160ddd1461088d5780631a221dbb146108a2576106a8565b80630d7f1441146107ea578063122fe685146107ff5780631283f1ca14610830576106a8565b806302259e9e146106ad57806302df64d6146106d457806306fdde03146106e957806308b2a12c14610773578063095ea7b3146107885780630ccf2156146107d5576106a8565b366106a857005b600080fd5b3480156106b957600080fd5b506106c2611778565b60408051918252519081900360200190f35b3480156106e057600080fd5b506106c261177e565b3480156106f557600080fd5b506106fe611784565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610738578181015183820152602001610720565b50505050905090810190601f1680156107655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561077f57600080fd5b506106c261181a565b34801561079457600080fd5b506107c1600480360360408110156107ab57600080fd5b506001600160a01b038135169060200135611820565b604080519115158252519081900360200190f35b3480156107e157600080fd5b506106c261183e565b3480156107f657600080fd5b506106c2611844565b34801561080b57600080fd5b5061081461184a565b604080516001600160a01b039092168252519081900360200190f35b34801561083c57600080fd5b506106c26004803603602081101561085357600080fd5b50356001600160a01b0316611859565b34801561086f57600080fd5b506106c261186b565b34801561088457600080fd5b50610814611871565b34801561089957600080fd5b506106c2611880565b3480156108ae57600080fd5b506106c2611886565b3480156108c357600080fd5b506106c2600480360360208110156108da57600080fd5b50356001600160a01b031661188c565b3480156108f657600080fd5b506106c261189e565b34801561090b57600080fd5b50610947600480360360c081101561092257600080fd5b5080359060208101359060408101359060608101359060808101359060a001356118a4565b005b34801561095557600080fd5b506107c16004803603606081101561096c57600080fd5b506001600160a01b03813581169160208101359091169060400135611949565b34801561099857600080fd5b506106c26119d0565b3480156109ad57600080fd5b506106c26119d6565b3480156109c257600080fd5b506108146119dc565b3480156109d757600080fd5b506106c26119eb565b3480156109ec57600080fd5b506109f5611a61565b6040805160ff9092168252519081900360200190f35b348015610a1757600080fd5b5061094760048036036020811015610a2e57600080fd5b50356001600160a01b0316611a6a565b348015610a4a57600080fd5b506106c2611b35565b348015610a5f57600080fd5b50610814611b3b565b348015610a7457600080fd5b506107c160048036036040811015610a8b57600080fd5b506001600160a01b038135169060200135611b4a565b348015610aad57600080fd5b5061094760048036036020811015610ac457600080fd5b5035611b98565b348015610ad757600080fd5b5061094760048036036020811015610aee57600080fd5b50356001600160a01b0316611c47565b348015610b0a57600080fd5b5061094760048036036020811015610b2157600080fd5b50356001600160a01b0316611d5f565b348015610b3d57600080fd5b5061094760048036036020811015610b5457600080fd5b5035611de3565b348015610b6757600080fd5b506107c1611e51565b348015610b7c57600080fd5b5061094760048036036040811015610b9357600080fd5b506001600160a01b0381351690602001351515611e5a565b348015610bb757600080fd5b506107c1611f3d565b348015610bcc57600080fd5b50610814611f4b565b348015610be157600080fd5b506106c2611f6f565b348015610bf657600080fd5b506107c1611f75565b348015610c0b57600080fd5b50610947611f7e565b348015610c2057600080fd5b5061094760048036036040811015610c3757600080fd5b506001600160a01b0381358116916020013516612003565b348015610c5b57600080fd5b506107c160048036036020811015610c7257600080fd5b50356001600160a01b031661218b565b348015610c8e57600080fd5b5061094760048036036020811015610ca557600080fd5b503515156121a9565b348015610cba57600080fd5b506106c261221e565b348015610ccf57600080fd5b506107c160048036036020811015610ce657600080fd5b50356001600160a01b0316612224565b348015610d0257600080fd5b5061094760048036036020811015610d1957600080fd5b5035612242565b348015610d2c57600080fd5b506106c26122a9565b348015610d4157600080fd5b5061094760048036036020811015610d5857600080fd5b50356001600160a01b03166122ee565b348015610d7457600080fd5b506106c260048036036020811015610d8b57600080fd5b50356001600160a01b03166123fa565b348015610da757600080fd5b506106c261247d565b348015610dbc57600080fd5b5061094760048036036020811015610dd357600080fd5b5035612483565b348015610de657600080fd5b5061094760048036036020811015610dfd57600080fd5b5035612514565b348015610e1057600080fd5b506106c260048036036020811015610e2757600080fd5b50356001600160a01b03166125fb565b348015610e4357600080fd5b50610814612616565b348015610e5857600080fd5b50610947612625565b348015610e6d57600080fd5b506106c26126d7565b348015610e8257600080fd5b506108146126dd565b348015610e9757600080fd5b50610947600480360360c0811015610eae57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356126ec565b348015610edf57600080fd5b506106c260048036036020811015610ef657600080fd5b50356001600160a01b031661278b565b348015610f1257600080fd5b506106c260048036036020811015610f2957600080fd5b50356001600160a01b031661279d565b348015610f4557600080fd5b5061094760048036036020811015610f5c57600080fd5b50356127af565b348015610f6f57600080fd5b5061094760048036036020811015610f8657600080fd5b50356001600160a01b03166128d6565b348015610fa257600080fd5b5061094760048036036020811015610fb957600080fd5b50356001600160a01b0316612bc9565b348015610fd557600080fd5b50610814612c65565b348015610fea57600080fd5b506109476004803603602081101561100157600080fd5b5035612c79565b34801561101457600080fd5b506106c2612cef565b34801561102957600080fd5b50610814612cf5565b34801561103e57600080fd5b506106fe612d04565b34801561105357600080fd5b506106c2612d65565b34801561106857600080fd5b506106c2612d6b565b34801561107d57600080fd5b506109476004803603602081101561109457600080fd5b50356001600160a01b0316612d71565b3480156110b057600080fd5b50610947600480360360c08110156110c757600080fd5b5080359060208101359060408101359060608101359060808101359060a00135612df5565b3480156110f857600080fd5b506109476004803603604081101561110f57600080fd5b506001600160a01b0381351690602001351515612e94565b34801561113357600080fd5b506106c2612f71565b34801561114857600080fd5b506106c2612f77565b34801561115d57600080fd5b506106c2612f7d565b34801561117257600080fd5b506107c16004803603604081101561118957600080fd5b506001600160a01b038135169060200135612fc2565b3480156111ab57600080fd5b50610947600480360360208110156111c257600080fd5b50356001600160a01b031661302a565b3480156111de57600080fd5b506106c2600480360360208110156111f557600080fd5b50356001600160a01b03166130c6565b34801561121157600080fd5b506107c16004803603604081101561122857600080fd5b506001600160a01b038135169060200135613117565b34801561124a57600080fd5b506112716004803603602081101561126157600080fd5b50356001600160a01b031661312b565b604080516001600160a01b0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b3480156112c857600080fd5b506106c261320b565b3480156112dd57600080fd5b50610947600480360360208110156112f457600080fd5b50356001600160a01b0316613211565b34801561131057600080fd5b506108146132ad565b34801561132557600080fd5b506107c16004803603602081101561133c57600080fd5b50356001600160a01b03166132bc565b34801561135857600080fd5b506109476004803603604081101561136f57600080fd5b506001600160a01b03813516906020013515156132d1565b34801561139357600080fd5b50610947600480360360408110156113aa57600080fd5b506001600160a01b038135169060200135151561335e565b3480156113ce57600080fd5b50610947600480360360208110156113e557600080fd5b50356133eb565b3480156113f857600080fd5b506109476004803603604081101561140f57600080fd5b81019060208101813564010000000081111561142a57600080fd5b82018360208201111561143c57600080fd5b8035906020019184602083028401116401000000008311171561145e57600080fd5b9193509150351515613461565b34801561147757600080fd5b506109476004803603602081101561148e57600080fd5b503561358b565b3480156114a157600080fd5b50610814613601565b3480156114b657600080fd5b50610947600480360360208110156114cd57600080fd5b50356001600160a01b0316613610565b3480156114e957600080fd5b50610814613694565b3480156114fe57600080fd5b506109476004803603602081101561151557600080fd5b50356001600160a01b03166136a3565b34801561153157600080fd5b506106c2613753565b34801561154657600080fd5b506106c26004803603604081101561155d57600080fd5b506001600160a01b0381358116916020013516613759565b34801561158157600080fd5b506106c2613784565b34801561159657600080fd5b50610947600480360360208110156115ad57600080fd5b5035151561378a565b3480156115c257600080fd5b506106c2613806565b3480156115d757600080fd5b506106c261380c565b3480156115ec57600080fd5b506106c2613812565b34801561160157600080fd5b50610814613818565b34801561161657600080fd5b506106c2613827565b34801561162b57600080fd5b506109476004803603602081101561164257600080fd5b503561386c565b34801561165557600080fd5b506109476004803603602081101561166c57600080fd5b503561391b565b34801561167f57600080fd5b506106c2613986565b34801561169457600080fd5b506106c261398c565b3480156116a957600080fd5b50611271600480360360208110156116c057600080fd5b5035613992565b3480156116d357600080fd5b50610947600480360360208110156116ea57600080fd5b50356001600160a01b03166139f8565b34801561170657600080fd5b506106c2613b06565b34801561171b57600080fd5b506109476004803603602081101561173257600080fd5b5035613b0c565b34801561174557600080fd5b506109476004803603602081101561175c57600080fd5b5035613b73565b34801561176f57600080fd5b506106c2613bee565b600b5481565b60235481565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156118105780601f106117e557610100808354040283529160200191611810565b820191906000526020600020905b8154815290600101906020018083116117f357829003601f168201915b5050505050905090565b602a5481565b600061183461182d613c55565b8484613c59565b5060015b92915050565b60195481565b60285481565b6039546001600160a01b031681565b600f6020526000908152604090205481565b601f5481565b6006546001600160a01b031681565b60025490565b60295481565b60116020526000908152604090205481565b60225481565b6118ac613c55565b6001600160a01b03166118bd612c65565b6001600160a01b031614611906576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b602a869055602b859055602784905560288390556029829055602c81905561193e81611938848187818a818e8e613bf4565b90613bf4565b602d55505050505050565b6000611956848484613d45565b6119c684611962613c55565b6119c18560405180606001604052806028815260200161594f602891396001600160a01b038a166000908152600160205260408120906119a0613c55565b6001600160a01b031681526020810191909152604001600020549190614737565b613c59565b5060019392505050565b60365481565b603a5481565b6008546001600160a01b031681565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015611a3057600080fd5b505afa158015611a44573d6000803e3d6000fd5b505050506040513d6020811015611a5a57600080fd5b5051905090565b60055460ff1690565b611a72613c55565b6001600160a01b0316611a83612c65565b6001600160a01b031614611acc576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6008546040805163031e79db60e41b81526001600160a01b038481166004830152915191909216916331e79db091602480830192600092919082900301818387803b158015611b1a57600080fd5b505af1158015611b2e573d6000803e3d6000fd5b5050505050565b60275481565b6018546001600160a01b031681565b6000611834611b57613c55565b846119c18560016000611b68613c55565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490613bf4565b611ba0613c55565b6001600160a01b0316611bb1612c65565b6001600160a01b031614611bfa576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b60085460408051630766c9b560e31b81526004810184905290516001600160a01b0390921691633b364da89160248082019260009290919082900301818387803b158015611b1a57600080fd5b611c4f613c55565b6001600160a01b0316611c60612c65565b6001600160a01b031614611ca9576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b60085460408051633d0c896360e01b81526001600160a01b03848116600483015291519190921691633d0c896391602480830192600092919082900301818387803b158015611cf757600080fd5b505af1158015611d0b573d6000803e3d6000fd5b5050600780546001600160a01b0319166001600160a01b03858116918217928390556040519216935091507fc50953975bfb7dc05da466bc18236bf737c11097c9cc7ef9d079bc7ed96f03ae90600090a350565b611d67613c55565b6001600160a01b0316611d78612c65565b6001600160a01b031614611dc1576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b601780546001600160a01b0319166001600160a01b0392909216919091179055565b611deb613c55565b6001600160a01b0316611dfc612c65565b6001600160a01b031614611e45576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b611e4e816147ce565b50565b60375460ff1681565b611e62613c55565b6001600160a01b0316611e73612c65565b6001600160a01b031614611ebc576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6001600160a01b038281166000818152603b6020526040808220805460ff1916861515179055600854815163031e79db60e41b8152600481019490945290519316926331e79db092602480820193929182900301818387803b158015611f2157600080fd5b505af1158015611f35573d6000803e3d6000fd5b505050505050565b603754610100900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b601b5481565b603a5442101590565b6008546040805163bc4c4b3760e01b815233600482015260006024820181905291516001600160a01b039093169263bc4c4b3792604480840193602093929083900390910190829087803b158015611fd557600080fd5b505af1158015611fe9573d6000803e3d6000fd5b505050506040513d6020811015611fff57600080fd5b5050565b61200b613c55565b6001600160a01b031661201c612c65565b6001600160a01b031614612065576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b603980546001600160a01b0319166001600160a01b03848116918217928390559182166000908152603e6020526040808220805460ff19166001179055600854815163031e79db60e41b8152600481019490945290519316926331e79db092602480820193929182900301818387803b1580156120e157600080fd5b505af11580156120f5573d6000803e3d6000fd5b505050506121048260016132d1565b6001600160a01b038082166000818152603e6020526040808220805460ff19166001179055600854815163031e79db60e41b8152600481019490945290519316926331e79db092602480820193929182900301818387803b15801561216857600080fd5b505af115801561217c573d6000803e3d6000fd5b50505050611fff8160016132d1565b6001600160a01b03166000908152603c602052604090205460ff1690565b6121b1613c55565b6001600160a01b03166121c2612c65565b6001600160a01b03161461220b576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6037805460ff1916911515919091179055565b600a5481565b6001600160a01b03166000908152603d602052604090205460ff1690565b61224a613c55565b6001600160a01b031661225b612c65565b6001600160a01b0316146122a4576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b603a55565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015611a3057600080fd5b6122f6613c55565b6001600160a01b0316612307612c65565b6001600160a01b031614612350576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6006546001600160a01b038281169116141561239d5760405162461bcd60e51b81526004018080602001828103825260288152602001806157cb6028913960400191505060405180910390fd5b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600854604080516370a0823160e01b81526001600160a01b038481166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b15801561244b57600080fd5b505afa15801561245f573d6000803e3d6000fd5b505050506040513d602081101561247557600080fd5b505192915050565b602d5481565b61248b613c55565b6001600160a01b031661249c612c65565b6001600160a01b0316146124e5576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b60006124ef611a61565b60095460ff91909116600a0a83029150611fff9030906001600160a01b031683614b14565b600854604080516001624d3b8760e01b03198152600481018490529051600092839283926001600160a01b039092169163ffb2c4799160248082019260609290919082900301818787803b15801561256b57600080fd5b505af115801561257f573d6000803e3d6000fd5b505050506040513d606081101561259557600080fd5b5080516020808301516040938401518451848152928301829052828501819052606083018990529351929650945091925032916000917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a350505050565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b031681565b61262d613c55565b6001600160a01b031661263e612c65565b6001600160a01b031614612687576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b600d5481565b6015546001600160a01b031681565b6126f4613c55565b6001600160a01b0316612705612c65565b6001600160a01b03161461274e576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b60238690556024859055602084905560218390556022829055602581905561278081611938848187818a818e8e613bf4565b602655505050505050565b60106020526000908152604090205481565b60126020526000908152604090205481565b6127b7613c55565b6001600160a01b03166127c8612c65565b6001600160a01b031614612811576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b62030d40811015801561282757506207a1208111155b6128625760405162461bcd60e51b81526004018080602001828103825260398152602001806157926039913960400191505060405180910390fd5b6038548114156128a35760405162461bcd60e51b81526004018080602001828103825260318152602001806157616031913960400191505060405180910390fd5b60385460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3603855565b6128de613c55565b6001600160a01b03166128ef612c65565b6001600160a01b031614612938576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6008546001600160a01b03828116911614156129855760405162461bcd60e51b8152600401808060200182810382526032815260200180615a016032913960400191505060405180910390fd5b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129cd57600080fd5b505afa1580156129e1573d6000803e3d6000fd5b505050506040513d60208110156129f757600080fd5b50516001600160a01b031614612a3e5760405162461bcd60e51b81526004018080602001828103825260458152602001806159976045913960600191505060405180910390fd5b806001600160a01b03166331e79db0826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015612a8d57600080fd5b505af1158015612aa1573d6000803e3d6000fd5b50506040805163031e79db60e41b815230600482015290516001600160a01b03851693506331e79db09250602480830192600092919082900301818387803b158015612aec57600080fd5b505af1158015612b00573d6000803e3d6000fd5b50506006546040805163031e79db60e41b81526001600160a01b039283166004820152905191851693506331e79db0925060248082019260009290919082900301818387803b158015612b5257600080fd5b505af1158015612b66573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b612bd1613c55565b6001600160a01b0316612be2612c65565b6001600160a01b031614612c2b576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b601580546001600160a01b039092166001600160a01b0319909216821790556000908152603c60205260409020805460ff19166001179055565b60055461010090046001600160a01b031690565b612c81613c55565b6001600160a01b0316612c92612c65565b6001600160a01b031614612cdb576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b612ce3611a61565b60ff16600a0a02600b55565b600e5481565b6013546001600160a01b031681565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156118105780601f106117e557610100808354040283529160200191611810565b60355481565b601d5481565b612d79613c55565b6001600160a01b0316612d8a612c65565b6001600160a01b031614612dd3576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b601680546001600160a01b0319166001600160a01b0392909216919091179055565b612dfd613c55565b6001600160a01b0316612e0e612c65565b6001600160a01b031614612e57576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b601c869055601d8590556019849055601a839055601b829055601e819055612e8981611938848187818a818e8e613bf4565b601f55505050505050565b612e9c613c55565b6001600160a01b0316612ead612c65565b6001600160a01b031614612ef6576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161415612f675760405162461bcd60e51b815260040180806020018281038252604a815260200180615819604a913960600191505060405180910390fd5b611fff8282614c6f565b60385481565b60215481565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015611a3057600080fd5b6000611834612fcf613c55565b846119c185604051806060016040528060258152602001615a946025913960016000612ff9613c55565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190614737565b613032613c55565b6001600160a01b0316613043612c65565b6001600160a01b03161461308c576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b601380546001600160a01b039092166001600160a01b0319909216821790556000908152603c60205260409020805460ff19166001179055565b600854604080516302a2e74960e61b81526001600160a01b0384811660048301529151600093929092169163a8b9d24091602480820192602092909190829003018186803b15801561244b57600080fd5b6000611834613124613c55565b8484613d45565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b031663fbcbc0f18a6040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506101006040518083038186803b15801561319a57600080fd5b505afa1580156131ae573d6000803e3d6000fd5b505050506040513d6101008110156131c557600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e090970151959e50939c50919a509850965094509092509050919395975091939597565b602c5481565b613219613c55565b6001600160a01b031661322a612c65565b6001600160a01b031614613273576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b601480546001600160a01b039092166001600160a01b0319909216821790556000908152603c60205260409020805460ff19166001179055565b6014546001600160a01b031681565b603f6020526000908152604090205460ff1681565b6132d9613c55565b6001600160a01b03166132ea612c65565b6001600160a01b031614613333576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152603c60205260409020805460ff1916911515919091179055565b613366613c55565b6001600160a01b0316613377612c65565b6001600160a01b0316146133c0576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152603d60205260409020805460ff1916911515919091179055565b6133f3613c55565b6001600160a01b0316613404612c65565b6001600160a01b03161461344d576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b613455611a61565b60ff16600a0a02600d55565b613469613c55565b6001600160a01b031661347a612c65565b6001600160a01b0316146134c3576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b60005b828110156135185781603c60008686858181106134df57fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff19169115159190911790556001016134c6565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051808060200183151581526020018281038252858582818152602001925060200280828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b613593613c55565b6001600160a01b03166135a4612c65565b6001600160a01b0316146135ed576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6135f5611a61565b60ff16600a0a02600c55565b6017546001600160a01b031681565b613618613c55565b6001600160a01b0316613629612c65565b6001600160a01b031614613672576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6016546001600160a01b031681565b6136ab613c55565b6001600160a01b03166136bc612c65565b6001600160a01b031614613705576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6008546040805163d644c36560e01b81526001600160a01b0384811660048301529151919092169163d644c36591602480830192600092919082900301818387803b158015611b1a57600080fd5b60265481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600c5481565b613792613c55565b6001600160a01b03166137a3612c65565b6001600160a01b0316146137ec576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b603780549115156101000261ff0019909216919091179055565b60205481565b601c5481565b60255481565b6007546001600160a01b031681565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015611a3057600080fd5b613874613c55565b6001600160a01b0316613885612c65565b6001600160a01b0316146138ce576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6008546040805163e98030c760e01b81526004810184905290516001600160a01b039092169163e98030c79160248082019260009290919082900301818387803b158015611b1a57600080fd5b613923613c55565b6001600160a01b0316613934612c65565b6001600160a01b03161461397d576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b611e4e81614d9d565b601a5481565b60245481565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b0316635183d6fd8a6040518263ffffffff1660e01b8152600401808281526020019150506101006040518083038186803b15801561319a57600080fd5b613a00613c55565b6001600160a01b0316613a11612c65565b6001600160a01b031614613a5a576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6001600160a01b038116613a9f5760405162461bcd60e51b81526004018080602001828103825260268152602001806157196026913960400191505060405180910390fd5b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b602b5481565b613b14613c55565b6001600160a01b0316613b25612c65565b6001600160a01b031614613b6e576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b603655565b613b7b613c55565b6001600160a01b0316613b8c612c65565b6001600160a01b031614613bd5576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b613bdd611a61565b60ff16600a0a8102600a8190555050565b601e5481565b600082820183811015613c4e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b038316613c9e5760405162461bcd60e51b8152600401808060200182810382526024815260200180615a336024913960400191505060405180910390fd5b6001600160a01b038216613ce35760405162461bcd60e51b815260040180806020018281038252602281526020018061573f6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166000908152603b602052604090205460ff1615613d9d5760405162461bcd60e51b81526004018080602001828103825260248152602001806158a06024913960400191505060405180910390fd5b6001600160a01b0382166000908152603b602052604090205460ff1615613df55760405162461bcd60e51b81526004018080602001828103825260248152602001806158a06024913960400191505060405180910390fd5b6001600160a01b038316613e3a5760405162461bcd60e51b81526004018080602001828103825260238152602001806156f66023913960400191505060405180910390fd5b6001600160a01b038216613e7f5760405162461bcd60e51b81526004018080602001828103825260238152602001806156f66023913960400191505060405180910390fd5b80613e9557613e9083836000614b14565b614732565b6000613e9f612c65565b6001600160a01b0316846001600160a01b031614158015613ec857506001600160a01b03831615155b8015613edf57506001600160a01b03831661dead14155b8015613f0357506001600160a01b0384166000908152603f602052604090205460ff165b15613fc3576001600160a01b0384166000908152603d602052604090205460ff16613f6957600a54821115613f695760405162461bcd60e51b81526004018080602001828103825260288152602001806158c46028913960400191505060405180910390fd5b5060198054602e55601a8054602f55601b8054603055601c8054603155601d80546032819055603355601f805460345560205490955560215490935560225490915560235490556024549055602554601e55602654905560015b6000613fcd611f75565b90508061402b576001600160a01b0385166000908152603e602052604090205460ff1661402b5760405162461bcd60e51b815260040180806020018281038252603d815260200180615a57603d913960400191505060405180910390fd5b614033612c65565b6001600160a01b0316856001600160a01b03161415801561405e5750600754600160a01b900460ff16155b80156140675750805b801561408b57506001600160a01b0384166000908152603f602052604090205460ff165b80156140a557506006546001600160a01b03868116911614155b80156140ca57506001600160a01b0384166000908152603c602052604090205460ff16155b1561425257600e546001600160a01b038616600090815260116020526040902054429101101561410e576001600160a01b0385166000908152601260205260408120555b6001600160a01b0385166000908152603d602052604090205460ff1661418957600b546001600160a01b038616600090815260126020526040902054840111156141895760405162461bcd60e51b81526004018080602001828103825260428152602001806158ec6042913960600191505060405180910390fd5b6001600160a01b038516600090815260126020526040902054156141ca576001600160a01b03851660009081526012602052604090208054840190556141f6565b6001600160a01b0385166000908152601160209081526040808320429055601290915290208054840190555b60198054602e55601a8054602f55601b8054603055601c8054603155601d8054603255601e8054603355601f8054603455602754909655602854909455602954909255602a549055602b549055602c549055602d549055600191505b600061425d306125fb565b600c549091508110158280156142705750805b80156142865750600754600160a01b900460ff16155b80156142ab57506001600160a01b0387166000908152603f602052604090205460ff16155b80156142c557506009546001600160a01b03888116911614155b80156142df57506009546001600160a01b03878116911614155b15614328576007805460ff60a01b1916600160a01b179055600c54614303906147ce565b600061430e306125fb565b905061431981614d9d565b506007805460ff60a01b191690555b60008380156143415750600754600160a01b900460ff16155b6001600160a01b0389166000908152603c602052604090205490915060ff168061438357506001600160a01b0387166000908152603c602052604090205460ff165b806143955750603754610100900460ff165b1561439e575060005b80806143a75750845b15614489576001600160a01b0388166000908152603c602052604090205460ff16806143eb57506001600160a01b0387166000908152603c602052604090205460ff165b156143f557614484565b600061440e601e54601f54614feb90919063ffffffff16565b9050600061442760646144218a85615048565b906150a1565b905060006144456064614421601e548c61504890919063ffffffff16565b905061445b816144558b85614feb565b90614feb565b98506144688b3084614b14565b600954614480908c906001600160a01b031683614b14565b5050505b614517565b6001600160a01b0388166000908152603c602052604090205460ff16806144c857506001600160a01b0387166000908152603c602052604090205460ff165b156144d257614517565b60006144ee6064614421601e548a61504890919063ffffffff16565b90506144fa8782614feb565b600954909750614515908a906001600160a01b031683614b14565b505b614522888888614b14565b841561453057614530615108565b6008546001600160a01b031663e30443bc8961454b816125fb565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561459157600080fd5b505af19250505080156145a2575060015b506008546001600160a01b031663e30443bc886145be816125fb565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561460457600080fd5b505af1925050508015614615575060015b5060355460075442919091101590600160a01b900460ff161580156146375750805b1561472b57603854603654603580549091019055600854604080516001624d3b8760e01b031981526004810184905290516001600160a01b039092169163ffb2c479916024808201926060929091908290030181600087803b15801561469c57600080fd5b505af19250505080156146d057506040513d60608110156146bc57600080fd5b508051602082015160409092015190919060015b6146d957614729565b604080518481526020810184905280820183905260608101869052905132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505b505b5050505050505b505050565b600081848411156147c65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561478b578181015183820152602001614773565b50505050905090810190601f1680156147b85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008060006019546000146147fa576147f760646144216019548761504890919063ffffffff16565b92505b601a541561481f5761481c6064614421601a548761504890919063ffffffff16565b91505b601b5415614844576148416064614421601b548761504890919063ffffffff16565b90505b828403829003819003600061485a8660026150a1565b905060006148698360026150a1565b905060006148778483614feb565b90504761488384615134565b600061488f4783614feb565b905060008060006019546000146148bd576148ba60646144216019548761504890919063ffffffff16565b92505b601a54156148e2576148df6064614421601a548761504890919063ffffffff16565b91505b601b5415614907576149046064614421601b548761504890919063ffffffff16565b90505b8284038290038190038684156149a2576016546001600160a01b03161561494b576016546013546149469187916001600160a01b0391821691166152c7565b6149a2565b6013546040516000916001600160a01b03169087908381818185875af1925050503d8060008114614998576040519150601f19603f3d011682016040523d82523d6000602084013e61499d565b606091505b505050505b8315614a33576017546001600160a01b0316156149dc576017546014546149d79186916001600160a01b0391821691166152c7565b614a33565b6014546040516000916001600160a01b03169086908381818185875af1925050503d8060008114614a29576040519150601f19603f3d011682016040523d82523d6000602084013e614a2e565b606091505b505050505b8215614ab95760375460ff1615614a6257601554614a5d90849030906001600160a01b03166152c7565b614ab9565b6015546040516000916001600160a01b03169085908381818185875af1925050503d8060008114614aaf576040519150601f19603f3d011682016040523d82523d6000602084013e614ab4565b606091505b505050505b614ac38183615460565b604080518a8152602081018490528082018a905290517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a1505050505050505050505050505050565b6001600160a01b038316614b595760405162461bcd60e51b81526004018080602001828103825260258152602001806159dc6025913960400191505060405180910390fd5b6001600160a01b038216614b9e5760405162461bcd60e51b81526004018080602001828103825260238152602001806156f66023913960400191505060405180910390fd5b614ba9838383614732565b614be6816040518060600160405280602681526020016157f3602691396001600160a01b0386166000908152602081905260409020549190614737565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614c159082613bf4565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6001600160a01b0382166000908152603f602052604090205460ff1615158115151415614ccd5760405162461bcd60e51b815260040180806020018281038252603d815260200180615863603d913960400191505060405180910390fd5b6001600160a01b0382166000908152603f60205260409020805460ff19168215801591909117909155614d61576008546040805163031e79db60e41b81526001600160a01b038581166004830152915191909216916331e79db091602480830192600092919082900301818387803b158015614d4857600080fd5b505af1158015614d5c573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6008546007546001600160a01b039182169160009182911615614ec957614dc48430615518565b600754604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015614e0f57600080fd5b505afa158015614e23573d6000803e3d6000fd5b505050506040513d6020811015614e3957600080fd5b50516007546008546040805163a9059cbb60e01b81526001600160a01b03928316600482015260248101859052905193945091169163a9059cbb916044808201926020929091908290030181600087803b158015614e9657600080fd5b505af1158015614eaa573d6000803e3d6000fd5b505050506040513d6020811015614ec057600080fd5b50519150614f3e565b47614ed385615134565b6000614edf4783614feb565b6040519093508391506000906001600160a01b0387169083908381818185875af1925050503d8060008114614f30576040519150601f19603f3d011682016040523d82523d6000602084013e614f35565b606091505b50909550505050505b8115614fe5576008546040805163b0c7ce3760e01b81526004810184905290516001600160a01b039092169163b0c7ce379160248082019260009290919082900301818387803b158015614f9157600080fd5b505af1158015614fa5573d6000803e3d6000fd5b5050604080518781526020810185905281517f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc39450908190039091019150a15b50505050565b600082821115615042576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008261505757506000611838565b8282028284828161506457fe5b0414613c4e5760405162461bcd60e51b815260040180806020018281038252602181526020018061592e6021913960400191505060405180910390fd5b60008082116150f7576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161510057fe5b049392505050565b602e54601955602f54601a55603054601b55603154601c55603254601d55603354601e55603454601f55565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061516357fe5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156151b757600080fd5b505afa1580156151cb573d6000803e3d6000fd5b505050506040513d60208110156151e157600080fd5b50518151829060019081106151f257fe5b6001600160a01b0392831660209182029290920101526006546152189130911684613c59565b60065460405163791ac94760e01b8152600481018481526000602483018190523060648401819052426084850181905260a060448601908152875160a487015287516001600160a01b039097169663791ac947968a968a9594939092909160c40190602080880191028083838b5b8381101561529e578181015183820152602001615286565b505050509050019650505050505050600060405180830381600087803b158015611f2157600080fd5b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561532c57600080fd5b505afa158015615340573d6000803e3d6000fd5b505050506040513d602081101561535657600080fd5b50518151829060009061536557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061539357fe5b6001600160a01b0392831660209182029290920181019190915260065460405163b6f9de9560e01b815260006004820181815287861660448401524260648401819052608060248501908152885160848601528851959097169663b6f9de95968c9694958a958c95939260a49092019187810191028083838b5b8381101561542557818101518382015260200161540d565b50505050905001955050505050506000604051808303818588803b15801561544c57600080fd5b505af115801561472b573d6000803e3d6000fd5b6006546154789030906001600160a01b031684613c59565b6006546009546040805163f305d71960e01b81523060048201526024810186905260006044820181905260648201526001600160a01b0392831660848201524260a48201529051919092169163f305d71991849160c48082019260609290919082900301818588803b1580156154ed57600080fd5b505af1158015615501573d6000803e3d6000fd5b50505050506040513d6060811015614fe557600080fd5b6040805160038082526080820190925260009160208201606080368337019050509050308160008151811061554957fe5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561559d57600080fd5b505afa1580156155b1573d6000803e3d6000fd5b505050506040513d60208110156155c757600080fd5b50518151829060019081106155d857fe5b6001600160a01b03928316602091820292909201015260075482519116908290600290811061560357fe5b6001600160a01b0392831660209182029290920101526006546156299130911685613c59565b600654604051635c11d79560e01b8152600481018581526000602483018190526001600160a01b038681166064850152426084850181905260a060448601908152875160a487015287519290961695635c11d795958a9589948b9493919260c40190602080880191028083838b5b838110156156af578181015183820152602001615697565b505050509050019650505050505050600060405180830381600087803b1580156156d857600080fd5b505af11580156156ec573d6000803e3d6000fd5b5050505050505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734253543a2043616e6e6f742075706461746520676173466f7250726f63657373696e6720746f2073616d652076616c75654253543a20676173466f7250726f63657373696e67206d757374206265206265747765656e203230302c30303020616e64203530302c3030304253543a2054686520726f7574657220616c7265616479206861732074686174206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654253543a205468652050616e63616b655377617020706169722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b657250616972734253543a204175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c7565426c61636b6c697374656420616464726573732063616e6e6f74207472616e73666572215472616e7366657220616d6f756e74206578636565647320746865206d61785478416d6f756e742e53656c6c207472616e7366657220616d6f756e74206578636565647320746865206d617853656c6c416d6f756e7420666f722074686520676976656e2074696d652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724253543a20546865206e6577206469766964656e6420747261636b6572206d757374206265206f776e6564206279207468652042535420746f6b656e20636f6e747261637445524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734253543a20546865206469766964656e6420747261636b657220616c7265616479206861732074686174206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734253543a2054686973206163636f756e742063616e6e6f742073656e6420746f6b656e7320756e74696c2074726164696e6720697320656e61626c656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ed2f5182efa2c7fa5c8b64e10a7967c8dab04fedfe41df1aee673128b9cea0af64736f6c634300070600336080604052600880546001600160a01b03191690553480156200002157600080fd5b5060408051808201825260148082527f4253545f4469766964656e645f547261636b6572000000000000000000000000602080840182815285518087019096529285528401528151919291839183916200007e916003916200012e565b508051620000949060049060208401906200012e565b50506005805460ff191660121790555050600980546001600160a01b03191633179055506000620000c46200012a565b600d80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350610e10601555670de0b6b3a7640000601655620001da565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001665760008555620001b1565b82601f106200018157805160ff1916838001178555620001b1565b82800160010185558215620001b1579182015b82811115620001b157825182559160200191906001019062000194565b50620001bf929150620001c3565b5090565b5b80821115620001bf5760008155600101620001c4565b61270580620001ea6000396000f3fe6080604052600436106102555760003560e01c806385a6b3ae11610139578063be10b614116100b6578063e76ed0e31161007a578063e76ed0e314610919578063e7841ec01461092e578063e98030c714610943578063f2fde38b1461096d578063fbcbc0f1146109a0578063ffb2c479146109d35761025c565b8063be10b61414610848578063cd446e221461085d578063d644c36514610872578063dd62ed3e146108a5578063e30443bc146108e05761025c565b8063a8b9d240116100fd578063a8b9d24014610744578063a9059cbb14610777578063aafd847a146107b0578063b0c7ce37146107e3578063bc4c4b371461080d5761025c565b806385a6b3ae1461067d5780638da5cb5b1461069257806391b89fba146106c357806395d89b41146106f6578063a457c2d71461070b5761025c565b8063313ce567116101d25780634e7b827f116101965780634e7b827f146105635780635183d6fd146105965780636a4740021461060b5780636f2789ec1461062057806370a0823114610635578063715018a6146106685761025c565b8063313ce5671461046f57806331e79db01461049a57806339509351146104cd5780633b364da8146105065780633d0c8963146105305761025c565b8063226cfa3d11610219578063226cfa3d1461037e57806323b872dd146103b157806327ce0147146103f45780632a150127146104275780633009a6091461045a5761025c565b806303c833021461026157806306fdde031461026b578063095ea7b3146102f557806309bbedde1461034257806318160ddd146103695761025c565b3661025c57005b600080fd5b610269610a1b565b005b34801561027757600080fd5b50610280610aac565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ba5781810151838201526020016102a2565b50505050905090810190601f1680156102e75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030157600080fd5b5061032e6004803603604081101561031857600080fd5b506001600160a01b038135169060200135610b42565b604080519115158252519081900360200190f35b34801561034e57600080fd5b50610357610b60565b60408051918252519081900360200190f35b34801561037557600080fd5b50610357610b66565b34801561038a57600080fd5b50610357600480360360208110156103a157600080fd5b50356001600160a01b0316610b6c565b3480156103bd57600080fd5b5061032e600480360360608110156103d457600080fd5b506001600160a01b03813581169160208101359091169060400135610b7e565b34801561040057600080fd5b506103576004803603602081101561041757600080fd5b50356001600160a01b0316610c05565b34801561043357600080fd5b506102696004803603602081101561044a57600080fd5b50356001600160a01b0316610c64565b34801561046657600080fd5b50610357610ccf565b34801561047b57600080fd5b50610484610cd5565b6040805160ff9092168252519081900360200190f35b3480156104a657600080fd5b50610269600480360360208110156104bd57600080fd5b50356001600160a01b0316610cde565b3480156104d957600080fd5b5061032e600480360360408110156104f057600080fd5b506001600160a01b038135169060200135610dea565b34801561051257600080fd5b506102696004803603602081101561052957600080fd5b5035610e38565b34801561053c57600080fd5b506102696004803603602081101561055357600080fd5b50356001600160a01b0316610ea9565b34801561056f57600080fd5b5061032e6004803603602081101561058657600080fd5b50356001600160a01b0316610f2d565b3480156105a257600080fd5b506105c0600480360360208110156105b957600080fd5b5035610f42565b604080516001600160a01b0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b34801561061757600080fd5b506102696110a1565b34801561062c57600080fd5b506103576110d8565b34801561064157600080fd5b506103576004803603602081101561065857600080fd5b50356001600160a01b03166110de565b34801561067457600080fd5b506102696110f9565b34801561068957600080fd5b506103576111a5565b34801561069e57600080fd5b506106a76111ab565b604080516001600160a01b039092168252519081900360200190f35b3480156106cf57600080fd5b50610357600480360360208110156106e657600080fd5b50356001600160a01b03166111ba565b34801561070257600080fd5b506102806111c5565b34801561071757600080fd5b5061032e6004803603604081101561072e57600080fd5b506001600160a01b038135169060200135611226565b34801561075057600080fd5b506103576004803603602081101561076757600080fd5b50356001600160a01b031661128e565b34801561078357600080fd5b5061032e6004803603604081101561079a57600080fd5b506001600160a01b0381351690602001356112ba565b3480156107bc57600080fd5b50610357600480360360208110156107d357600080fd5b50356001600160a01b03166112ce565b3480156107ef57600080fd5b506102696004803603602081101561080657600080fd5b50356112e9565b34801561081957600080fd5b5061032e6004803603604081101561083057600080fd5b506001600160a01b03813516906020013515156113b2565b34801561085457600080fd5b50610357611491565b34801561086957600080fd5b506106a7611497565b34801561087e57600080fd5b506102696004803603602081101561089557600080fd5b50356001600160a01b03166114a6565b3480156108b157600080fd5b50610357600480360360408110156108c857600080fd5b506001600160a01b0381358116916020013516611529565b3480156108ec57600080fd5b506102696004803603604081101561090357600080fd5b506001600160a01b038135169060200135611554565b34801561092557600080fd5b506106a761170a565b34801561093a57600080fd5b50610357611719565b34801561094f57600080fd5b506102696004803603602081101561096657600080fd5b503561171f565b34801561097957600080fd5b506102696004803603602081101561099057600080fd5b50356001600160a01b0316611845565b3480156109ac57600080fd5b506105c0600480360360208110156109c357600080fd5b50356001600160a01b0316611948565b3480156109df57600080fd5b506109fd600480360360208110156109f657600080fd5b5035611abb565b60408051938452602084019290925282820152519081900360600190f35b6000610a25610b66565b11610a2f57600080fd5b3415610aaa57610a60610a40610b66565b610a4e34600160801b611bb9565b81610a5557fe5b600654919004611c19565b60065560408051348152905133917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511919081900360200190a2600c54610aa69034611c19565b600c555b565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b385780601f10610b0d57610100808354040283529160200191610b38565b820191906000526020600020905b815481529060010190602001808311610b1b57829003601f168201915b5050505050905090565b6000610b56610b4f611c73565b8484611c77565b5060015b92915050565b600e5490565b60025490565b60146020526000908152604090205481565b6000610b8b848484611d63565b610bfb84610b97611c73565b610bf6856040518060600160405280602881526020016125bb602891396001600160a01b038a16600090815260016020526040812090610bd5611c73565b6001600160a01b031681526020810191909152604001600020549190611d9a565b611c77565b5060019392505050565b6001600160a01b0381166000908152600a6020526040812054600160801b90610c5490610c4f90610c49610c44610c3b886110de565b60065490611bb9565b611e31565b90611e41565b611e74565b81610c5b57fe5b0490505b919050565b6009546001600160a01b03163314610cad5760405162461bcd60e51b815260040180806020018281038252602a815260200180612570602a913960400191505060405180910390fd5b600980546001600160a01b0319166001600160a01b0392909216919091179055565b60125481565b60055460ff1690565b610ce6611c73565b6001600160a01b0316610cf76111ab565b6001600160a01b031614610d40576040805162461bcd60e51b815260206004820181905260248201526000805160206125e3833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152601360205260408120805460ff19166001179055610d6e908290611e87565b6040805163131836e760e21b8152600e60048201526001600160a01b0383166024820152905173839138075084fdb98e88e89112fea3699e04016791634c60db9c916044808301926000929190829003018186803b158015610dcf57600080fd5b505af4158015610de3573d6000803e3d6000fd5b5050505050565b6000610b56610df7611c73565b84610bf68560016000610e08611c73565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490611c19565b610e40611c73565b6001600160a01b0316610e516111ab565b6001600160a01b031614610e9a576040805162461bcd60e51b815260206004820181905260248201526000805160206125e3833981519152604482015290519081900360640190fd5b670de0b6b3a764000002601655565b610eb1611c73565b6001600160a01b0316610ec26111ab565b6001600160a01b031614610f0b576040805162461bcd60e51b815260206004820181905260248201526000805160206125e3833981519152604482015290519081900360640190fd5b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60136020526000908152604090205460ff1681565b600080600080600080600080600e73839138075084fdb98e88e89112fea3699e04016763deb3d89690916040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610fa057600080fd5b505af4158015610fb4573d6000803e3d6000fd5b505050506040513d6020811015610fca57600080fd5b50518910610ff1575060009650600019955085945086935083925082915081905080611096565b6000600e73839138075084fdb98e88e89112fea3699e04016763d1aa9e7e90918c6040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801561104d57600080fd5b505af4158015611061573d6000803e3d6000fd5b505050506040513d602081101561107757600080fd5b5051905061108481611948565b98509850985098509850985098509850505b919395975091939597565b60405162461bcd60e51b81526004018080602001828103825260638152602001806126246063913960800191505060405180910390fd5b60155481565b6001600160a01b031660009081526020819052604090205490565b611101611c73565b6001600160a01b03166111126111ab565b6001600160a01b03161461115b576040805162461bcd60e51b815260206004820181905260248201526000805160206125e3833981519152604482015290519081900360640190fd5b600d546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600d80546001600160a01b0319169055565b600c5481565b600d546001600160a01b031690565b6000610b5a8261128e565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610b385780601f10610b0d57610100808354040283529160200191610b38565b6000610b56611233611c73565b84610bf6856040518060600160405280602581526020016126ab602591396001600061125d611c73565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190611d9a565b6001600160a01b0381166000908152600b6020526040812054610b5a906112b484610c05565b90611ee0565b6000610b566112c7611c73565b8484611d63565b6001600160a01b03166000908152600b602052604090205490565b6009546001600160a01b031633146113325760405162461bcd60e51b815260040180806020018281038252602a815260200180612570602a913960400191505060405180910390fd5b600061133c610b66565b1161134657600080fd5b80156113af57611365611357610b66565b610a4e83600160801b611bb9565b60065560408051828152905133917fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d78454116511919081900360200190a2600c546113ab9082611c19565b600c555b50565b60006113bc611c73565b6001600160a01b03166113cd6111ab565b6001600160a01b031614611416576040805162461bcd60e51b815260206004820181905260248201526000805160206125e3833981519152604482015290519081900360640190fd5b600061142184611f3d565b90508015611487576001600160a01b0384166000818152601460209081526040918290204290558151848152915186151593927fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09292908290030190a36001915050610b5a565b5060009392505050565b60165481565b6009546001600160a01b031681565b6114ae611c73565b6001600160a01b03166114bf6111ab565b6001600160a01b031614611508576040805162461bcd60e51b815260206004820181905260248201526000805160206125e3833981519152604482015290519081900360640190fd5b6001600160a01b03166000908152601360205260409020805460ff19169055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61155c611c73565b6001600160a01b031661156d6111ab565b6001600160a01b0316146115b6576040805162461bcd60e51b815260206004820181905260248201526000805160206125e3833981519152604482015290519081900360640190fd5b6001600160a01b03821660009081526013602052604090205460ff16156115dc57611706565b6016548110611674576115ef8282611e87565b60408051632f0ad01760e21b8152600e60048201526001600160a01b038416602482015260448101839052905173839138075084fdb98e88e89112fea3699e0401679163bc2b405c916064808301926000929190829003018186803b15801561165757600080fd5b505af415801561166b573d6000803e3d6000fd5b505050506116f9565b61167f826000611e87565b6040805163131836e760e21b8152600e60048201526001600160a01b0384166024820152905173839138075084fdb98e88e89112fea3699e04016791634c60db9c916044808301926000929190829003018186803b1580156116e057600080fd5b505af41580156116f4573d6000803e3d6000fd5b505050505b6117048260016113b2565b505b5050565b6008546001600160a01b031681565b60125490565b611727611c73565b6001600160a01b03166117386111ab565b6001600160a01b031614611781576040805162461bcd60e51b815260206004820181905260248201526000805160206125e3833981519152604482015290519081900360640190fd5b610e1081101580156117965750620151808111155b6117d15760405162461bcd60e51b81526004018080602001828103825260498152602001806124586049913960600191505060405180910390fd5b6015548114156118125760405162461bcd60e51b815260040180806020018281038252603b8152602001806124c3603b913960400191505060405180910390fd5b60155460405182907f474ea64804364a1e29a4487ddb63c3342a2dd826ccd8acf48825e680a0e6f20f90600090a3601555565b61184d611c73565b6001600160a01b031661185e6111ab565b6001600160a01b0316146118a7576040805162461bcd60e51b815260206004820181905260248201526000805160206125e3833981519152604482015290519081900360640190fd5b6001600160a01b0381166118ec5760405162461bcd60e51b81526004018080602001828103825260268152602001806124fe6026913960400191505060405180910390fd5b600d546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600080600080600080600080889750600e73839138075084fdb98e88e89112fea3699e0401676317e142d190918a6040518363ffffffff1660e01b815260040180838152602001826001600160a01b031681526020019250505060206040518083038186803b1580156119ba57600080fd5b505af41580156119ce573d6000803e3d6000fd5b505050506040513d60208110156119e457600080fd5b50519650600019955060008712611a4857601254871115611a1457601254611a0d908890612168565b9550611a48565b601254600e5460009110611a29576000611a38565b601254600e54611a3891611ee0565b9050611a448882611e41565b9650505b611a518861128e565b9450611a5c88610c05565b6001600160a01b038916600090815260146020526040902054909450925082611a86576000611a94565b601554611a94908490611c19565b9150428211611aa4576000611aae565b611aae8242611ee0565b9050919395975091939597565b600e546000908190819080611adb57505060125460009250829150611bb2565b6012546000805a90506000805b8984108015611af657508582105b15611ba157600e546001909501948510611b0f57600094505b6000600e6000018681548110611b2157fe5b60009182526020808320909101546001600160a01b03168083526014909152604090912054909150611b529061219c565b15611b6e57611b628160016113b2565b15611b6e576001909101905b60019092019160005a905080851115611b9857611b95611b8e8683611ee0565b8790611c19565b95505b9350611ae89050565b601285905590975095509193505050505b9193909250565b600082611bc857506000610b5a565b82820282848281611bd557fe5b0414611c125760405162461bcd60e51b815260040180806020018281038252602181526020018061259a6021913960400191505060405180910390fd5b9392505050565b600082820183811015611c12576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b038316611cbc5760405162461bcd60e51b81526004018080602001828103825260248152602001806126876024913960400191505060405180910390fd5b6001600160a01b038216611d015760405162461bcd60e51b81526004018080602001828103825260228152602001806125246022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b60405162461bcd60e51b815260040180806020018281038252602a815260200180612546602a913960400191505060405180910390fd5b60008184841115611e295760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611dee578181015183820152602001611dd6565b50505050905090810190601f168015611e1b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008181811215610b5a57600080fd5b6000828201818312801590611e565750838112155b80611e6b5750600083128015611e6b57508381125b611c1257600080fd5b600080821215611e8357600080fd5b5090565b6000611e92836110de565b905080821115611eba576000611ea88383611ee0565b9050611eb484826121c3565b50611704565b80821015611704576000611ece8284611ee0565b9050611eda8482612227565b50505050565b600082821115611f37576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600080611f498361128e565b9050801561215f576001600160a01b0383166000908152600b6020526040902054611f749082611c19565b6001600160a01b038085166000908152600b60205260408120929092556008541661203d576040516000906001600160a01b0386169084908381818185875af1925050503d8060008114611fe4576040519150601f19603f3d011682016040523d82523d6000602084013e611fe9565b606091505b50506008546040805186815290519294508493506001600160a01b0391821692918816917feb063efb53b3790d2bc15284b59af7544466c8787c2883321ee27095647911b69181900360200190a350612109565b6008546040805163a9059cbb60e01b81526001600160a01b038781166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561209357600080fd5b505af11580156120a7573d6000803e3d6000fd5b505050506040513d60208110156120bd57600080fd5b50516008546040805185815290519293506001600160a01b0391821692918716917feb063efb53b3790d2bc15284b59af7544466c8787c2883321ee27095647911b69181900360200190a35b80612157576001600160a01b0384166000908152600b60205260409020546121319083611ee0565b6001600160a01b0385166000908152600b60205260408120919091559250610c5f915050565b509050610c5f565b50600092915050565b600080821215801561217c57508282840313155b806121935750600082128015612193575082828403135b611f3757600080fd5b6000428211156121ae57506000610c5f565b6015546121bb4284611ee0565b101592915050565b6121cd828261226b565b6122076121e8610c4483600654611bb990919063ffffffff16565b6001600160a01b0384166000908152600a602052604090205490612168565b6001600160a01b039092166000908152600a602052604090209190915550565b612231828261235b565b61220761224c610c4483600654611bb990919063ffffffff16565b6001600160a01b0384166000908152600a602052604090205490611e41565b6001600160a01b0382166122c6576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b6122d260008383611704565b6002546122df9082611c19565b6002556001600160a01b0382166000908152602081905260409020546123059082611c19565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b0382166123a05760405162461bcd60e51b81526004018080602001828103825260218152602001806126036021913960400191505060405180910390fd5b6123ac82600083611704565b6123e9816040518060600160405280602281526020016124a1602291396001600160a01b0385166000908152602081905260409020549190611d9a565b6001600160a01b03831660009081526020819052604090205560025461240f9082611ee0565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505056fe4253545f4469766964656e645f547261636b65723a20636c61696d57616974206d757374206265207570646174656420746f206265747765656e203120616e6420323420686f75727345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654253545f4469766964656e645f547261636b65723a2043616e6e6f742075706461746520636c61696d5761697420746f2073616d652076616c75654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734253545f4469766964656e645f547261636b65723a204e6f207472616e736665727320616c6c6f7765644f776e61626c653a2063616c6c6572206973206e6f7420746865206d617374657220636f6e7472616374536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657245524332303a206275726e2066726f6d20746865207a65726f20616464726573734253545f4469766964656e645f547261636b65723a2077697468647261774469766964656e642064697361626c65642e20557365207468652027636c61696d272066756e6374696f6e206f6e20746865206d61696e2042535420636f6e74726163742e45524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204469fd47da36ab3b2456197cb8ed70e40643984947fd62417d77a7a7fc6bb08a64736f6c634300070600334253543a204175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c7565

Deployed Bytecode

0x6080604052600436106106a15760003560e01c80637a41865b1161035f578063c0246668116101d1578063e708a0f911610102578063f11a24d3116100a0578063f63743421161007a578063f6374342146116fa578063f7822e091461170f578063fa280d4414611739578063fce589d814611763576106a8565b8063f11a24d314611688578063f27fd2541461169d578063f2fde38b146116c7576106a8565b8063e7841ec0116100dc578063e7841ec01461160a578063e98030c71461161f578063e9d3d61e14611649578063ecfca89914611673576106a8565b8063e708a0f9146115cb578063e71dc3f5146115e0578063e76ed0e3146115f5576106a8565b8063d4d90c251161016f578063dd62ed3e11610149578063dd62ed3e1461153a578063e2f4560514611575578063e371f7cf1461158a578063e4a1b95f146115b6576106a8565b8063d4d90c25146114dd578063d644c365146114f2578063d85ba06314611525576106a8565b8063c492f046116101ab578063c492f046146113ec578063c55d22871461146b578063c9fa039614611495578063d2630cc3146114aa576106a8565b8063c02466681461134c578063c0a904a214611387578063c18bc195146113c2576106a8565b8063992c58e4116102ab578063a8b9d24011610249578063adb873bd11610223578063adb873bd146112bc578063ae5a17a7146112d1578063afcf2fc414611304578063b62496f514611319576106a8565b8063a8b9d240146111d2578063a9059cbb14611205578063ad56c13c1461123e576106a8565b8063a1dc92bc11610285578063a1dc92bc1461113c578063a26579ad14611151578063a457c2d714611166578063a5afbcb81461119f576106a8565b8063992c58e4146110a45780639a7a23d6146110ec5780639c1b8af514611127576106a8565b80638f7142601161031857806395d89b41116102f257806395d89b4114611032578063974d628c1461104757806398118cb41461105c57806398eac15614611071576106a8565b80638f71426014610fde57806394305f4e14611008578063956236411461101d576106a8565b80637a41865b14610ed357806381dcc26614610f06578063871c128d14610f3957806388bdd9be14610f635780638ae1cf2214610f965780638da5cb5b14610fc9576106a8565b80633d0c8963116105135780635cce86cd11610444578063700bb191116103e2578063715018a6116103bc578063715018a614610e4c57806378109e5414610e61578063783478ad14610e7657806379e02b4414610e8b576106a8565b8063700bb19114610dda57806370a0823114610e0457806370d5ae0514610e37576106a8565b806365b8dbc01161041e57806365b8dbc014610d355780636843cd8414610d685780636a486a8e14610d9b5780636d1b229d14610db0576106a8565b80635cce86cd14610cc3578063616c594614610cf657806364b0f65314610d20576106a8565b80634be8f8b1116104b15780634e83ff6f1161048b5780634e83ff6f14610c145780634fbee19314610c4f57806354503bf714610c825780635aa821a914610cae576106a8565b80634be8f8b114610bd55780634d33b1ef14610bea5780634e71d92d14610bff576106a8565b8063425b682e116104ed578063425b682e14610b5b578063455a439614610b70578063486b6d8614610bab57806349bd5a5e14610bc0576106a8565b80633d0c896314610acb5780633fe9092214610afe578063407e378714610b31576106a8565b80631bc8b18f116105ed57806330bb4cff1161058b57806335b5fb631161056557806335b5fb6314610a3e57806338b7692314610a535780633950935114610a685780633b364da814610aa1576106a8565b806330bb4cff146109cb578063313ce567146109e057806331e79db014610a0b576106a8565b806323b872dd116105c757806323b872dd14610949578063255e9d0a1461098c57806325b61703146109a15780632c1f5216146109b6576106a8565b80631bc8b18f146108b75780631fe70a98146108ea57806322d3e2aa146108ff576106a8565b80630d7f14411161065a57806313114a9d1161063457806313114a9d146108635780631694505e1461087857806318160ddd1461088d5780631a221dbb146108a2576106a8565b80630d7f1441146107ea578063122fe685146107ff5780631283f1ca14610830576106a8565b806302259e9e146106ad57806302df64d6146106d457806306fdde03146106e957806308b2a12c14610773578063095ea7b3146107885780630ccf2156146107d5576106a8565b366106a857005b600080fd5b3480156106b957600080fd5b506106c2611778565b60408051918252519081900360200190f35b3480156106e057600080fd5b506106c261177e565b3480156106f557600080fd5b506106fe611784565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610738578181015183820152602001610720565b50505050905090810190601f1680156107655780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561077f57600080fd5b506106c261181a565b34801561079457600080fd5b506107c1600480360360408110156107ab57600080fd5b506001600160a01b038135169060200135611820565b604080519115158252519081900360200190f35b3480156107e157600080fd5b506106c261183e565b3480156107f657600080fd5b506106c2611844565b34801561080b57600080fd5b5061081461184a565b604080516001600160a01b039092168252519081900360200190f35b34801561083c57600080fd5b506106c26004803603602081101561085357600080fd5b50356001600160a01b0316611859565b34801561086f57600080fd5b506106c261186b565b34801561088457600080fd5b50610814611871565b34801561089957600080fd5b506106c2611880565b3480156108ae57600080fd5b506106c2611886565b3480156108c357600080fd5b506106c2600480360360208110156108da57600080fd5b50356001600160a01b031661188c565b3480156108f657600080fd5b506106c261189e565b34801561090b57600080fd5b50610947600480360360c081101561092257600080fd5b5080359060208101359060408101359060608101359060808101359060a001356118a4565b005b34801561095557600080fd5b506107c16004803603606081101561096c57600080fd5b506001600160a01b03813581169160208101359091169060400135611949565b34801561099857600080fd5b506106c26119d0565b3480156109ad57600080fd5b506106c26119d6565b3480156109c257600080fd5b506108146119dc565b3480156109d757600080fd5b506106c26119eb565b3480156109ec57600080fd5b506109f5611a61565b6040805160ff9092168252519081900360200190f35b348015610a1757600080fd5b5061094760048036036020811015610a2e57600080fd5b50356001600160a01b0316611a6a565b348015610a4a57600080fd5b506106c2611b35565b348015610a5f57600080fd5b50610814611b3b565b348015610a7457600080fd5b506107c160048036036040811015610a8b57600080fd5b506001600160a01b038135169060200135611b4a565b348015610aad57600080fd5b5061094760048036036020811015610ac457600080fd5b5035611b98565b348015610ad757600080fd5b5061094760048036036020811015610aee57600080fd5b50356001600160a01b0316611c47565b348015610b0a57600080fd5b5061094760048036036020811015610b2157600080fd5b50356001600160a01b0316611d5f565b348015610b3d57600080fd5b5061094760048036036020811015610b5457600080fd5b5035611de3565b348015610b6757600080fd5b506107c1611e51565b348015610b7c57600080fd5b5061094760048036036040811015610b9357600080fd5b506001600160a01b0381351690602001351515611e5a565b348015610bb757600080fd5b506107c1611f3d565b348015610bcc57600080fd5b50610814611f4b565b348015610be157600080fd5b506106c2611f6f565b348015610bf657600080fd5b506107c1611f75565b348015610c0b57600080fd5b50610947611f7e565b348015610c2057600080fd5b5061094760048036036040811015610c3757600080fd5b506001600160a01b0381358116916020013516612003565b348015610c5b57600080fd5b506107c160048036036020811015610c7257600080fd5b50356001600160a01b031661218b565b348015610c8e57600080fd5b5061094760048036036020811015610ca557600080fd5b503515156121a9565b348015610cba57600080fd5b506106c261221e565b348015610ccf57600080fd5b506107c160048036036020811015610ce657600080fd5b50356001600160a01b0316612224565b348015610d0257600080fd5b5061094760048036036020811015610d1957600080fd5b5035612242565b348015610d2c57600080fd5b506106c26122a9565b348015610d4157600080fd5b5061094760048036036020811015610d5857600080fd5b50356001600160a01b03166122ee565b348015610d7457600080fd5b506106c260048036036020811015610d8b57600080fd5b50356001600160a01b03166123fa565b348015610da757600080fd5b506106c261247d565b348015610dbc57600080fd5b5061094760048036036020811015610dd357600080fd5b5035612483565b348015610de657600080fd5b5061094760048036036020811015610dfd57600080fd5b5035612514565b348015610e1057600080fd5b506106c260048036036020811015610e2757600080fd5b50356001600160a01b03166125fb565b348015610e4357600080fd5b50610814612616565b348015610e5857600080fd5b50610947612625565b348015610e6d57600080fd5b506106c26126d7565b348015610e8257600080fd5b506108146126dd565b348015610e9757600080fd5b50610947600480360360c0811015610eae57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356126ec565b348015610edf57600080fd5b506106c260048036036020811015610ef657600080fd5b50356001600160a01b031661278b565b348015610f1257600080fd5b506106c260048036036020811015610f2957600080fd5b50356001600160a01b031661279d565b348015610f4557600080fd5b5061094760048036036020811015610f5c57600080fd5b50356127af565b348015610f6f57600080fd5b5061094760048036036020811015610f8657600080fd5b50356001600160a01b03166128d6565b348015610fa257600080fd5b5061094760048036036020811015610fb957600080fd5b50356001600160a01b0316612bc9565b348015610fd557600080fd5b50610814612c65565b348015610fea57600080fd5b506109476004803603602081101561100157600080fd5b5035612c79565b34801561101457600080fd5b506106c2612cef565b34801561102957600080fd5b50610814612cf5565b34801561103e57600080fd5b506106fe612d04565b34801561105357600080fd5b506106c2612d65565b34801561106857600080fd5b506106c2612d6b565b34801561107d57600080fd5b506109476004803603602081101561109457600080fd5b50356001600160a01b0316612d71565b3480156110b057600080fd5b50610947600480360360c08110156110c757600080fd5b5080359060208101359060408101359060608101359060808101359060a00135612df5565b3480156110f857600080fd5b506109476004803603604081101561110f57600080fd5b506001600160a01b0381351690602001351515612e94565b34801561113357600080fd5b506106c2612f71565b34801561114857600080fd5b506106c2612f77565b34801561115d57600080fd5b506106c2612f7d565b34801561117257600080fd5b506107c16004803603604081101561118957600080fd5b506001600160a01b038135169060200135612fc2565b3480156111ab57600080fd5b50610947600480360360208110156111c257600080fd5b50356001600160a01b031661302a565b3480156111de57600080fd5b506106c2600480360360208110156111f557600080fd5b50356001600160a01b03166130c6565b34801561121157600080fd5b506107c16004803603604081101561122857600080fd5b506001600160a01b038135169060200135613117565b34801561124a57600080fd5b506112716004803603602081101561126157600080fd5b50356001600160a01b031661312b565b604080516001600160a01b0390991689526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b3480156112c857600080fd5b506106c261320b565b3480156112dd57600080fd5b50610947600480360360208110156112f457600080fd5b50356001600160a01b0316613211565b34801561131057600080fd5b506108146132ad565b34801561132557600080fd5b506107c16004803603602081101561133c57600080fd5b50356001600160a01b03166132bc565b34801561135857600080fd5b506109476004803603604081101561136f57600080fd5b506001600160a01b03813516906020013515156132d1565b34801561139357600080fd5b50610947600480360360408110156113aa57600080fd5b506001600160a01b038135169060200135151561335e565b3480156113ce57600080fd5b50610947600480360360208110156113e557600080fd5b50356133eb565b3480156113f857600080fd5b506109476004803603604081101561140f57600080fd5b81019060208101813564010000000081111561142a57600080fd5b82018360208201111561143c57600080fd5b8035906020019184602083028401116401000000008311171561145e57600080fd5b9193509150351515613461565b34801561147757600080fd5b506109476004803603602081101561148e57600080fd5b503561358b565b3480156114a157600080fd5b50610814613601565b3480156114b657600080fd5b50610947600480360360208110156114cd57600080fd5b50356001600160a01b0316613610565b3480156114e957600080fd5b50610814613694565b3480156114fe57600080fd5b506109476004803603602081101561151557600080fd5b50356001600160a01b03166136a3565b34801561153157600080fd5b506106c2613753565b34801561154657600080fd5b506106c26004803603604081101561155d57600080fd5b506001600160a01b0381358116916020013516613759565b34801561158157600080fd5b506106c2613784565b34801561159657600080fd5b50610947600480360360208110156115ad57600080fd5b5035151561378a565b3480156115c257600080fd5b506106c2613806565b3480156115d757600080fd5b506106c261380c565b3480156115ec57600080fd5b506106c2613812565b34801561160157600080fd5b50610814613818565b34801561161657600080fd5b506106c2613827565b34801561162b57600080fd5b506109476004803603602081101561164257600080fd5b503561386c565b34801561165557600080fd5b506109476004803603602081101561166c57600080fd5b503561391b565b34801561167f57600080fd5b506106c2613986565b34801561169457600080fd5b506106c261398c565b3480156116a957600080fd5b50611271600480360360208110156116c057600080fd5b5035613992565b3480156116d357600080fd5b50610947600480360360208110156116ea57600080fd5b50356001600160a01b03166139f8565b34801561170657600080fd5b506106c2613b06565b34801561171b57600080fd5b506109476004803603602081101561173257600080fd5b5035613b0c565b34801561174557600080fd5b506109476004803603602081101561175c57600080fd5b5035613b73565b34801561176f57600080fd5b506106c2613bee565b600b5481565b60235481565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156118105780601f106117e557610100808354040283529160200191611810565b820191906000526020600020905b8154815290600101906020018083116117f357829003601f168201915b5050505050905090565b602a5481565b600061183461182d613c55565b8484613c59565b5060015b92915050565b60195481565b60285481565b6039546001600160a01b031681565b600f6020526000908152604090205481565b601f5481565b6006546001600160a01b031681565b60025490565b60295481565b60116020526000908152604090205481565b60225481565b6118ac613c55565b6001600160a01b03166118bd612c65565b6001600160a01b031614611906576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b602a869055602b859055602784905560288390556029829055602c81905561193e81611938848187818a818e8e613bf4565b90613bf4565b602d55505050505050565b6000611956848484613d45565b6119c684611962613c55565b6119c18560405180606001604052806028815260200161594f602891396001600160a01b038a166000908152600160205260408120906119a0613c55565b6001600160a01b031681526020810191909152604001600020549190614737565b613c59565b5060019392505050565b60365481565b603a5481565b6008546001600160a01b031681565b600854604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae916004808301926020929190829003018186803b158015611a3057600080fd5b505afa158015611a44573d6000803e3d6000fd5b505050506040513d6020811015611a5a57600080fd5b5051905090565b60055460ff1690565b611a72613c55565b6001600160a01b0316611a83612c65565b6001600160a01b031614611acc576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6008546040805163031e79db60e41b81526001600160a01b038481166004830152915191909216916331e79db091602480830192600092919082900301818387803b158015611b1a57600080fd5b505af1158015611b2e573d6000803e3d6000fd5b5050505050565b60275481565b6018546001600160a01b031681565b6000611834611b57613c55565b846119c18560016000611b68613c55565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490613bf4565b611ba0613c55565b6001600160a01b0316611bb1612c65565b6001600160a01b031614611bfa576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b60085460408051630766c9b560e31b81526004810184905290516001600160a01b0390921691633b364da89160248082019260009290919082900301818387803b158015611b1a57600080fd5b611c4f613c55565b6001600160a01b0316611c60612c65565b6001600160a01b031614611ca9576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b60085460408051633d0c896360e01b81526001600160a01b03848116600483015291519190921691633d0c896391602480830192600092919082900301818387803b158015611cf757600080fd5b505af1158015611d0b573d6000803e3d6000fd5b5050600780546001600160a01b0319166001600160a01b03858116918217928390556040519216935091507fc50953975bfb7dc05da466bc18236bf737c11097c9cc7ef9d079bc7ed96f03ae90600090a350565b611d67613c55565b6001600160a01b0316611d78612c65565b6001600160a01b031614611dc1576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b601780546001600160a01b0319166001600160a01b0392909216919091179055565b611deb613c55565b6001600160a01b0316611dfc612c65565b6001600160a01b031614611e45576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b611e4e816147ce565b50565b60375460ff1681565b611e62613c55565b6001600160a01b0316611e73612c65565b6001600160a01b031614611ebc576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6001600160a01b038281166000818152603b6020526040808220805460ff1916861515179055600854815163031e79db60e41b8152600481019490945290519316926331e79db092602480820193929182900301818387803b158015611f2157600080fd5b505af1158015611f35573d6000803e3d6000fd5b505050505050565b603754610100900460ff1681565b7f00000000000000000000000049bd97a1d6ac987bb0250150e641bad59c18de8c81565b601b5481565b603a5442101590565b6008546040805163bc4c4b3760e01b815233600482015260006024820181905291516001600160a01b039093169263bc4c4b3792604480840193602093929083900390910190829087803b158015611fd557600080fd5b505af1158015611fe9573d6000803e3d6000fd5b505050506040513d6020811015611fff57600080fd5b5050565b61200b613c55565b6001600160a01b031661201c612c65565b6001600160a01b031614612065576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b603980546001600160a01b0319166001600160a01b03848116918217928390559182166000908152603e6020526040808220805460ff19166001179055600854815163031e79db60e41b8152600481019490945290519316926331e79db092602480820193929182900301818387803b1580156120e157600080fd5b505af11580156120f5573d6000803e3d6000fd5b505050506121048260016132d1565b6001600160a01b038082166000818152603e6020526040808220805460ff19166001179055600854815163031e79db60e41b8152600481019490945290519316926331e79db092602480820193929182900301818387803b15801561216857600080fd5b505af115801561217c573d6000803e3d6000fd5b50505050611fff8160016132d1565b6001600160a01b03166000908152603c602052604090205460ff1690565b6121b1613c55565b6001600160a01b03166121c2612c65565b6001600160a01b03161461220b576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6037805460ff1916911515919091179055565b600a5481565b6001600160a01b03166000908152603d602052604090205460ff1690565b61224a613c55565b6001600160a01b031661225b612c65565b6001600160a01b0316146122a4576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b603a55565b600854604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde916004808301926020929190829003018186803b158015611a3057600080fd5b6122f6613c55565b6001600160a01b0316612307612c65565b6001600160a01b031614612350576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6006546001600160a01b038281169116141561239d5760405162461bcd60e51b81526004018080602001828103825260288152602001806157cb6028913960400191505060405180910390fd5b6006546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600854604080516370a0823160e01b81526001600160a01b038481166004830152915160009392909216916370a0823191602480820192602092909190829003018186803b15801561244b57600080fd5b505afa15801561245f573d6000803e3d6000fd5b505050506040513d602081101561247557600080fd5b505192915050565b602d5481565b61248b613c55565b6001600160a01b031661249c612c65565b6001600160a01b0316146124e5576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b60006124ef611a61565b60095460ff91909116600a0a83029150611fff9030906001600160a01b031683614b14565b600854604080516001624d3b8760e01b03198152600481018490529051600092839283926001600160a01b039092169163ffb2c4799160248082019260609290919082900301818787803b15801561256b57600080fd5b505af115801561257f573d6000803e3d6000fd5b505050506040513d606081101561259557600080fd5b5080516020808301516040938401518451848152928301829052828501819052606083018990529351929650945091925032916000917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a350505050565b6001600160a01b031660009081526020819052604090205490565b6009546001600160a01b031681565b61262d613c55565b6001600160a01b031661263e612c65565b6001600160a01b031614612687576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b60055460405160009161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360058054610100600160a81b0319169055565b600d5481565b6015546001600160a01b031681565b6126f4613c55565b6001600160a01b0316612705612c65565b6001600160a01b03161461274e576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b60238690556024859055602084905560218390556022829055602581905561278081611938848187818a818e8e613bf4565b602655505050505050565b60106020526000908152604090205481565b60126020526000908152604090205481565b6127b7613c55565b6001600160a01b03166127c8612c65565b6001600160a01b031614612811576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b62030d40811015801561282757506207a1208111155b6128625760405162461bcd60e51b81526004018080602001828103825260398152602001806157926039913960400191505060405180910390fd5b6038548114156128a35760405162461bcd60e51b81526004018080602001828103825260318152602001806157616031913960400191505060405180910390fd5b60385460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3603855565b6128de613c55565b6001600160a01b03166128ef612c65565b6001600160a01b031614612938576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6008546001600160a01b03828116911614156129855760405162461bcd60e51b8152600401808060200182810382526032815260200180615a016032913960400191505060405180910390fd5b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129cd57600080fd5b505afa1580156129e1573d6000803e3d6000fd5b505050506040513d60208110156129f757600080fd5b50516001600160a01b031614612a3e5760405162461bcd60e51b81526004018080602001828103825260458152602001806159976045913960600191505060405180910390fd5b806001600160a01b03166331e79db0826040518263ffffffff1660e01b815260040180826001600160a01b03168152602001915050600060405180830381600087803b158015612a8d57600080fd5b505af1158015612aa1573d6000803e3d6000fd5b50506040805163031e79db60e41b815230600482015290516001600160a01b03851693506331e79db09250602480830192600092919082900301818387803b158015612aec57600080fd5b505af1158015612b00573d6000803e3d6000fd5b50506006546040805163031e79db60e41b81526001600160a01b039283166004820152905191851693506331e79db0925060248082019260009290919082900301818387803b158015612b5257600080fd5b505af1158015612b66573d6000803e3d6000fd5b50506008546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600880546001600160a01b0319166001600160a01b039290921691909117905550565b612bd1613c55565b6001600160a01b0316612be2612c65565b6001600160a01b031614612c2b576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b601580546001600160a01b039092166001600160a01b0319909216821790556000908152603c60205260409020805460ff19166001179055565b60055461010090046001600160a01b031690565b612c81613c55565b6001600160a01b0316612c92612c65565b6001600160a01b031614612cdb576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b612ce3611a61565b60ff16600a0a02600b55565b600e5481565b6013546001600160a01b031681565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156118105780601f106117e557610100808354040283529160200191611810565b60355481565b601d5481565b612d79613c55565b6001600160a01b0316612d8a612c65565b6001600160a01b031614612dd3576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b601680546001600160a01b0319166001600160a01b0392909216919091179055565b612dfd613c55565b6001600160a01b0316612e0e612c65565b6001600160a01b031614612e57576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b601c869055601d8590556019849055601a839055601b829055601e819055612e8981611938848187818a818e8e613bf4565b601f55505050505050565b612e9c613c55565b6001600160a01b0316612ead612c65565b6001600160a01b031614612ef6576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b7f00000000000000000000000049bd97a1d6ac987bb0250150e641bad59c18de8c6001600160a01b0316826001600160a01b03161415612f675760405162461bcd60e51b815260040180806020018281038252604a815260200180615819604a913960600191505060405180910390fd5b611fff8282614c6f565b60385481565b60215481565b60085460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec916004808301926020929190829003018186803b158015611a3057600080fd5b6000611834612fcf613c55565b846119c185604051806060016040528060258152602001615a946025913960016000612ff9613c55565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190614737565b613032613c55565b6001600160a01b0316613043612c65565b6001600160a01b03161461308c576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b601380546001600160a01b039092166001600160a01b0319909216821790556000908152603c60205260409020805460ff19166001179055565b600854604080516302a2e74960e61b81526001600160a01b0384811660048301529151600093929092169163a8b9d24091602480820192602092909190829003018186803b15801561244b57600080fd5b6000611834613124613c55565b8484613d45565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b031663fbcbc0f18a6040518263ffffffff1660e01b815260040180826001600160a01b031681526020019150506101006040518083038186803b15801561319a57600080fd5b505afa1580156131ae573d6000803e3d6000fd5b505050506040513d6101008110156131c557600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e090970151959e50939c50919a509850965094509092509050919395975091939597565b602c5481565b613219613c55565b6001600160a01b031661322a612c65565b6001600160a01b031614613273576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b601480546001600160a01b039092166001600160a01b0319909216821790556000908152603c60205260409020805460ff19166001179055565b6014546001600160a01b031681565b603f6020526000908152604090205460ff1681565b6132d9613c55565b6001600160a01b03166132ea612c65565b6001600160a01b031614613333576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152603c60205260409020805460ff1916911515919091179055565b613366613c55565b6001600160a01b0316613377612c65565b6001600160a01b0316146133c0576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152603d60205260409020805460ff1916911515919091179055565b6133f3613c55565b6001600160a01b0316613404612c65565b6001600160a01b03161461344d576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b613455611a61565b60ff16600a0a02600d55565b613469613c55565b6001600160a01b031661347a612c65565b6001600160a01b0316146134c3576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b60005b828110156135185781603c60008686858181106134df57fe5b602090810292909201356001600160a01b0316835250810191909152604001600020805460ff19169115159190911790556001016134c6565b507f7fdaf542373fa84f4ee8d662c642f44e4c2276a217d7d29e548b6eb29a233b35838383604051808060200183151581526020018281038252858582818152602001925060200280828437600083820152604051601f909101601f1916909201829003965090945050505050a1505050565b613593613c55565b6001600160a01b03166135a4612c65565b6001600160a01b0316146135ed576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6135f5611a61565b60ff16600a0a02600c55565b6017546001600160a01b031681565b613618613c55565b6001600160a01b0316613629612c65565b6001600160a01b031614613672576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6016546001600160a01b031681565b6136ab613c55565b6001600160a01b03166136bc612c65565b6001600160a01b031614613705576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6008546040805163d644c36560e01b81526001600160a01b0384811660048301529151919092169163d644c36591602480830192600092919082900301818387803b158015611b1a57600080fd5b60265481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600c5481565b613792613c55565b6001600160a01b03166137a3612c65565b6001600160a01b0316146137ec576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b603780549115156101000261ff0019909216919091179055565b60205481565b601c5481565b60255481565b6007546001600160a01b031681565b6008546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec0916004808301926020929190829003018186803b158015611a3057600080fd5b613874613c55565b6001600160a01b0316613885612c65565b6001600160a01b0316146138ce576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6008546040805163e98030c760e01b81526004810184905290516001600160a01b039092169163e98030c79160248082019260009290919082900301818387803b158015611b1a57600080fd5b613923613c55565b6001600160a01b0316613934612c65565b6001600160a01b03161461397d576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b611e4e81614d9d565b601a5481565b60245481565b600080600080600080600080600860009054906101000a90046001600160a01b03166001600160a01b0316635183d6fd8a6040518263ffffffff1660e01b8152600401808281526020019150506101006040518083038186803b15801561319a57600080fd5b613a00613c55565b6001600160a01b0316613a11612c65565b6001600160a01b031614613a5a576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b6001600160a01b038116613a9f5760405162461bcd60e51b81526004018080602001828103825260268152602001806157196026913960400191505060405180910390fd5b6005546040516001600160a01b0380841692610100900416907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b602b5481565b613b14613c55565b6001600160a01b0316613b25612c65565b6001600160a01b031614613b6e576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b603655565b613b7b613c55565b6001600160a01b0316613b8c612c65565b6001600160a01b031614613bd5576040805162461bcd60e51b81526020600482018190526024820152600080516020615977833981519152604482015290519081900360640190fd5b613bdd611a61565b60ff16600a0a8102600a8190555050565b601e5481565b600082820183811015613c4e576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b3390565b6001600160a01b038316613c9e5760405162461bcd60e51b8152600401808060200182810382526024815260200180615a336024913960400191505060405180910390fd5b6001600160a01b038216613ce35760405162461bcd60e51b815260040180806020018281038252602281526020018061573f6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b0383166000908152603b602052604090205460ff1615613d9d5760405162461bcd60e51b81526004018080602001828103825260248152602001806158a06024913960400191505060405180910390fd5b6001600160a01b0382166000908152603b602052604090205460ff1615613df55760405162461bcd60e51b81526004018080602001828103825260248152602001806158a06024913960400191505060405180910390fd5b6001600160a01b038316613e3a5760405162461bcd60e51b81526004018080602001828103825260238152602001806156f66023913960400191505060405180910390fd5b6001600160a01b038216613e7f5760405162461bcd60e51b81526004018080602001828103825260238152602001806156f66023913960400191505060405180910390fd5b80613e9557613e9083836000614b14565b614732565b6000613e9f612c65565b6001600160a01b0316846001600160a01b031614158015613ec857506001600160a01b03831615155b8015613edf57506001600160a01b03831661dead14155b8015613f0357506001600160a01b0384166000908152603f602052604090205460ff165b15613fc3576001600160a01b0384166000908152603d602052604090205460ff16613f6957600a54821115613f695760405162461bcd60e51b81526004018080602001828103825260288152602001806158c46028913960400191505060405180910390fd5b5060198054602e55601a8054602f55601b8054603055601c8054603155601d80546032819055603355601f805460345560205490955560215490935560225490915560235490556024549055602554601e55602654905560015b6000613fcd611f75565b90508061402b576001600160a01b0385166000908152603e602052604090205460ff1661402b5760405162461bcd60e51b815260040180806020018281038252603d815260200180615a57603d913960400191505060405180910390fd5b614033612c65565b6001600160a01b0316856001600160a01b03161415801561405e5750600754600160a01b900460ff16155b80156140675750805b801561408b57506001600160a01b0384166000908152603f602052604090205460ff165b80156140a557506006546001600160a01b03868116911614155b80156140ca57506001600160a01b0384166000908152603c602052604090205460ff16155b1561425257600e546001600160a01b038616600090815260116020526040902054429101101561410e576001600160a01b0385166000908152601260205260408120555b6001600160a01b0385166000908152603d602052604090205460ff1661418957600b546001600160a01b038616600090815260126020526040902054840111156141895760405162461bcd60e51b81526004018080602001828103825260428152602001806158ec6042913960600191505060405180910390fd5b6001600160a01b038516600090815260126020526040902054156141ca576001600160a01b03851660009081526012602052604090208054840190556141f6565b6001600160a01b0385166000908152601160209081526040808320429055601290915290208054840190555b60198054602e55601a8054602f55601b8054603055601c8054603155601d8054603255601e8054603355601f8054603455602754909655602854909455602954909255602a549055602b549055602c549055602d549055600191505b600061425d306125fb565b600c549091508110158280156142705750805b80156142865750600754600160a01b900460ff16155b80156142ab57506001600160a01b0387166000908152603f602052604090205460ff16155b80156142c557506009546001600160a01b03888116911614155b80156142df57506009546001600160a01b03878116911614155b15614328576007805460ff60a01b1916600160a01b179055600c54614303906147ce565b600061430e306125fb565b905061431981614d9d565b506007805460ff60a01b191690555b60008380156143415750600754600160a01b900460ff16155b6001600160a01b0389166000908152603c602052604090205490915060ff168061438357506001600160a01b0387166000908152603c602052604090205460ff165b806143955750603754610100900460ff165b1561439e575060005b80806143a75750845b15614489576001600160a01b0388166000908152603c602052604090205460ff16806143eb57506001600160a01b0387166000908152603c602052604090205460ff165b156143f557614484565b600061440e601e54601f54614feb90919063ffffffff16565b9050600061442760646144218a85615048565b906150a1565b905060006144456064614421601e548c61504890919063ffffffff16565b905061445b816144558b85614feb565b90614feb565b98506144688b3084614b14565b600954614480908c906001600160a01b031683614b14565b5050505b614517565b6001600160a01b0388166000908152603c602052604090205460ff16806144c857506001600160a01b0387166000908152603c602052604090205460ff165b156144d257614517565b60006144ee6064614421601e548a61504890919063ffffffff16565b90506144fa8782614feb565b600954909750614515908a906001600160a01b031683614b14565b505b614522888888614b14565b841561453057614530615108565b6008546001600160a01b031663e30443bc8961454b816125fb565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561459157600080fd5b505af19250505080156145a2575060015b506008546001600160a01b031663e30443bc886145be816125fb565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561460457600080fd5b505af1925050508015614615575060015b5060355460075442919091101590600160a01b900460ff161580156146375750805b1561472b57603854603654603580549091019055600854604080516001624d3b8760e01b031981526004810184905290516001600160a01b039092169163ffb2c479916024808201926060929091908290030181600087803b15801561469c57600080fd5b505af19250505080156146d057506040513d60608110156146bc57600080fd5b508051602082015160409092015190919060015b6146d957614729565b604080518481526020810184905280820183905260608101869052905132916001917fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989181900360800190a35050505b505b5050505050505b505050565b600081848411156147c65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561478b578181015183820152602001614773565b50505050905090810190601f1680156147b85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b60008060006019546000146147fa576147f760646144216019548761504890919063ffffffff16565b92505b601a541561481f5761481c6064614421601a548761504890919063ffffffff16565b91505b601b5415614844576148416064614421601b548761504890919063ffffffff16565b90505b828403829003819003600061485a8660026150a1565b905060006148698360026150a1565b905060006148778483614feb565b90504761488384615134565b600061488f4783614feb565b905060008060006019546000146148bd576148ba60646144216019548761504890919063ffffffff16565b92505b601a54156148e2576148df6064614421601a548761504890919063ffffffff16565b91505b601b5415614907576149046064614421601b548761504890919063ffffffff16565b90505b8284038290038190038684156149a2576016546001600160a01b03161561494b576016546013546149469187916001600160a01b0391821691166152c7565b6149a2565b6013546040516000916001600160a01b03169087908381818185875af1925050503d8060008114614998576040519150601f19603f3d011682016040523d82523d6000602084013e61499d565b606091505b505050505b8315614a33576017546001600160a01b0316156149dc576017546014546149d79186916001600160a01b0391821691166152c7565b614a33565b6014546040516000916001600160a01b03169086908381818185875af1925050503d8060008114614a29576040519150601f19603f3d011682016040523d82523d6000602084013e614a2e565b606091505b505050505b8215614ab95760375460ff1615614a6257601554614a5d90849030906001600160a01b03166152c7565b614ab9565b6015546040516000916001600160a01b03169085908381818185875af1925050503d8060008114614aaf576040519150601f19603f3d011682016040523d82523d6000602084013e614ab4565b606091505b505050505b614ac38183615460565b604080518a8152602081018490528082018a905290517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a1505050505050505050505050505050565b6001600160a01b038316614b595760405162461bcd60e51b81526004018080602001828103825260258152602001806159dc6025913960400191505060405180910390fd5b6001600160a01b038216614b9e5760405162461bcd60e51b81526004018080602001828103825260238152602001806156f66023913960400191505060405180910390fd5b614ba9838383614732565b614be6816040518060600160405280602681526020016157f3602691396001600160a01b0386166000908152602081905260409020549190614737565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614c159082613bf4565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6001600160a01b0382166000908152603f602052604090205460ff1615158115151415614ccd5760405162461bcd60e51b815260040180806020018281038252603d815260200180615863603d913960400191505060405180910390fd5b6001600160a01b0382166000908152603f60205260409020805460ff19168215801591909117909155614d61576008546040805163031e79db60e41b81526001600160a01b038581166004830152915191909216916331e79db091602480830192600092919082900301818387803b158015614d4857600080fd5b505af1158015614d5c573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab90600090a35050565b6008546007546001600160a01b039182169160009182911615614ec957614dc48430615518565b600754604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015614e0f57600080fd5b505afa158015614e23573d6000803e3d6000fd5b505050506040513d6020811015614e3957600080fd5b50516007546008546040805163a9059cbb60e01b81526001600160a01b03928316600482015260248101859052905193945091169163a9059cbb916044808201926020929091908290030181600087803b158015614e9657600080fd5b505af1158015614eaa573d6000803e3d6000fd5b505050506040513d6020811015614ec057600080fd5b50519150614f3e565b47614ed385615134565b6000614edf4783614feb565b6040519093508391506000906001600160a01b0387169083908381818185875af1925050503d8060008114614f30576040519150601f19603f3d011682016040523d82523d6000602084013e614f35565b606091505b50909550505050505b8115614fe5576008546040805163b0c7ce3760e01b81526004810184905290516001600160a01b039092169163b0c7ce379160248082019260009290919082900301818387803b158015614f9157600080fd5b505af1158015614fa5573d6000803e3d6000fd5b5050604080518781526020810185905281517f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc39450908190039091019150a15b50505050565b600082821115615042576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008261505757506000611838565b8282028284828161506457fe5b0414613c4e5760405162461bcd60e51b815260040180806020018281038252602181526020018061592e6021913960400191505060405180910390fd5b60008082116150f7576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161510057fe5b049392505050565b602e54601955602f54601a55603054601b55603154601c55603254601d55603354601e55603454601f55565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061516357fe5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b1580156151b757600080fd5b505afa1580156151cb573d6000803e3d6000fd5b505050506040513d60208110156151e157600080fd5b50518151829060019081106151f257fe5b6001600160a01b0392831660209182029290920101526006546152189130911684613c59565b60065460405163791ac94760e01b8152600481018481526000602483018190523060648401819052426084850181905260a060448601908152875160a487015287516001600160a01b039097169663791ac947968a968a9594939092909160c40190602080880191028083838b5b8381101561529e578181015183820152602001615286565b505050509050019650505050505050600060405180830381600087803b158015611f2157600080fd5b6040805160028082526060820183526000926020830190803683375050600654604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b15801561532c57600080fd5b505afa158015615340573d6000803e3d6000fd5b505050506040513d602081101561535657600080fd5b50518151829060009061536557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828160018151811061539357fe5b6001600160a01b0392831660209182029290920181019190915260065460405163b6f9de9560e01b815260006004820181815287861660448401524260648401819052608060248501908152885160848601528851959097169663b6f9de95968c9694958a958c95939260a49092019187810191028083838b5b8381101561542557818101518382015260200161540d565b50505050905001955050505050506000604051808303818588803b15801561544c57600080fd5b505af115801561472b573d6000803e3d6000fd5b6006546154789030906001600160a01b031684613c59565b6006546009546040805163f305d71960e01b81523060048201526024810186905260006044820181905260648201526001600160a01b0392831660848201524260a48201529051919092169163f305d71991849160c48082019260609290919082900301818588803b1580156154ed57600080fd5b505af1158015615501573d6000803e3d6000fd5b50505050506040513d6060811015614fe557600080fd5b6040805160038082526080820190925260009160208201606080368337019050509050308160008151811061554957fe5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561559d57600080fd5b505afa1580156155b1573d6000803e3d6000fd5b505050506040513d60208110156155c757600080fd5b50518151829060019081106155d857fe5b6001600160a01b03928316602091820292909201015260075482519116908290600290811061560357fe5b6001600160a01b0392831660209182029290920101526006546156299130911685613c59565b600654604051635c11d79560e01b8152600481018581526000602483018190526001600160a01b038681166064850152426084850181905260a060448601908152875160a487015287519290961695635c11d795958a9589948b9493919260c40190602080880191028083838b5b838110156156af578181015183820152602001615697565b505050509050019650505050505050600060405180830381600087803b1580156156d857600080fd5b505af11580156156ec573d6000803e3d6000fd5b5050505050505056fe45524332303a207472616e7366657220746f20746865207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573734253543a2043616e6e6f742075706461746520676173466f7250726f63657373696e6720746f2073616d652076616c75654253543a20676173466f7250726f63657373696e67206d757374206265206265747765656e203230302c30303020616e64203530302c3030304253543a2054686520726f7574657220616c7265616479206861732074686174206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63654253543a205468652050616e63616b655377617020706169722063616e6e6f742062652072656d6f7665642066726f6d206175746f6d617465644d61726b65744d616b657250616972734253543a204175746f6d61746564206d61726b6574206d616b6572207061697220697320616c72656164792073657420746f20746861742076616c7565426c61636b6c697374656420616464726573732063616e6e6f74207472616e73666572215472616e7366657220616d6f756e74206578636565647320746865206d61785478416d6f756e742e53656c6c207472616e7366657220616d6f756e74206578636565647320746865206d617853656c6c416d6f756e7420666f722074686520676976656e2074696d652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724253543a20546865206e6577206469766964656e6420747261636b6572206d757374206265206f776e6564206279207468652042535420746f6b656e20636f6e747261637445524332303a207472616e736665722066726f6d20746865207a65726f20616464726573734253543a20546865206469766964656e6420747261636b657220616c7265616479206861732074686174206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573734253543a2054686973206163636f756e742063616e6e6f742073656e6420746f6b656e7320756e74696c2074726164696e6720697320656e61626c656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ed2f5182efa2c7fa5c8b64e10a7967c8dab04fedfe41df1aee673128b9cea0af64736f6c63430007060033

Library Used


Deployed Bytecode Sourcemap

48954:32691:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49362:65;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;50586:37;;;;;;;;;;;;;:::i;22999:91::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50992:38;;;;;;;;;;;;;:::i;25145:169::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25145:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;50107:28;;;;;;;;;;;;;:::i;50912:33::-;;;;;;;;;;;;;:::i;51985:42::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;51985:42:0;;;;;;;;;;;;;;49604:46;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49604:46:0;-1:-1:-1;;;;;49604:46:0;;:::i;50326:120::-;;;;;;;;;;;;;:::i;49027:41::-;;;;;;;;;;;;;:::i;24098:108::-;;;;;;;;;;;;;:::i;50952:33::-;;;;;;;;;;;;;:::i;49711:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49711:44:0;-1:-1:-1;;;;;49711:44:0;;:::i;50547:32::-;;;;;;;;;;;;;:::i;60795:546::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60795:546:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25796:321;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;25796:321:0;;;;;;;;;;;;;;;;;:::i;51722:34::-;;;;;;;;;;;;;:::i;52109:51::-;;;;;;;;;;;;;:::i;49202:41::-;;;;;;;;;;;;;:::i;66327:141::-;;;;;;;;;;;;;:::i;23942:91::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;64076:293;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64076:293:0;-1:-1:-1;;;;;64076:293:0;;:::i;50873:32::-;;;;;;;;;;;;;:::i;50038:40::-;;;;;;;;;;;;;:::i;26526:218::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;26526:218:0;;;;;;;;:::i;57854:181::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57854:181:0;;:::i;58051:248::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58051:248:0;-1:-1:-1;;;;;58051:248:0;;:::i;59207:134::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59207:134:0;-1:-1:-1;;;;;59207:134:0;;:::i;55964:107::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55964:107:0;;:::i;51771:34::-;;;;;;;;;;;;;:::i;63715:349::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;63715:349:0;;;;;;;;;;:::i;51812:41::-;;;;;;;;;;;;;:::i;49075:38::-;;;;;;;;;;;;;:::i;50178:29::-;;;;;;;;;;;;;:::i;68389:126::-;;;;;;;;;;;;;:::i;68001:94::-;;;;;;;;;;;;;:::i;61353:504::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;61353:504:0;;;;;;;;;;:::i;66476:125::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66476:125:0;-1:-1:-1;;;;;66476:125:0;;:::i;57411:122::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57411:122:0;;;;:::i;49291:64::-;;;;;;;;;;;;;:::i;66617:129::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66617:129:0;-1:-1:-1;;;;;66617:129:0;;:::i;57704:137::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57704:137:0;;:::i;68240:141::-;;;;;;;;;;;;;:::i;62641:314::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62641:314:0;-1:-1:-1;;;;;62641:314:0;;:::i;66913:139::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66913:139:0;-1:-1:-1;;;;;66913:139:0;;:::i;51116:148::-;;;;;;;;;;;;;:::i;59499:206::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59499:206:0;;:::i;67722:271::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67722:271:0;;:::i;24269:127::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24269:127:0;-1:-1:-1;;;;;24269:127:0;;:::i;49252:26::-;;;;;;;;;;;;;:::i;15368:148::-;;;;;;;;;;;;;:::i;49496:56::-;;;;;;;;;;;;;:::i;49901:37::-;;;;;;;;;;;;;:::i;60241:538::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60241:538:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;49657:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49657:47:0;-1:-1:-1;;;;;49657:47:0;;:::i;49762:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49762:45:0;-1:-1:-1;;;;;49762:45:0;;:::i;65669:402::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;65669:402:0;;:::i;61865:768::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61865:768:0;-1:-1:-1;;;;;61865:768:0;;:::i;58814:237::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58814:237:0;-1:-1:-1;;;;;58814:237:0;;:::i;14717:87::-;;;;;;;;;;;;;:::i;56603:159::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56603:159:0;;:::i;49561:36::-;;;;;;;;;;;;;:::i;49814:::-;;;;;;;;;;;;;:::i;23209:95::-;;;;;;;;;;;;;:::i;51681:34::-;;;;;;;;;;;;;:::i;50255:31::-;;;;;;;;;;;;;:::i;59063:132::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59063:132:0;-1:-1:-1;;;;;59063:132:0;;:::i;59711:514::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59711:514:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;64986:263::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;64986:263:0;;;;;;;;;;:::i;51932:40::-;;;;;;;;;;;;;:::i;50508:32::-;;;;;;;;;;;;;:::i;66211:108::-;;;;;;;;;;;;;:::i;27247:269::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27247:269:0;;;;;;;;:::i;58311:239::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58311:239:0;-1:-1:-1;;;;;58311:239:0;;:::i;66754:151::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66754:151:0;-1:-1:-1;;;;;66754:151:0;;:::i;24609:175::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24609:175:0;;;;;;;;:::i;67060:318::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67060:318:0;-1:-1:-1;;;;;67060:318:0;;:::i;:::-;;;;-1:-1:-1;;;;;67060:318:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51079:30;;;;;;;;;;;;;:::i;58562:237::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58562:237:0;-1:-1:-1;;;;;58562:237:0;;:::i;49857:37::-;;;;;;;;;;;;;:::i;52734:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52734:58:0;-1:-1:-1;;;;;52734:58:0;;:::i;62963:355::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;62963:355:0;;;;;;;;;;:::i;63341:359::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;63341:359:0;;;;;;;;;;:::i;56773:156::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56773:156:0;;:::i;64672:306::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64672:306:0;-1:-1:-1;64672:306:0;;;;:::i;56942:156::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56942:156:0;;:::i;49991:40::-;;;;;;;;;;;;;:::i;59353:134::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59353:134:0;-1:-1:-1;;;;;59353:134:0;;:::i;49945:39::-;;;;;;;;;;;;;:::i;64381:283::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;64381:283:0;-1:-1:-1;;;;;64381:283:0;;:::i;50707:141::-;;;;;;;;;;;;;:::i;24847:151::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;24847:151:0;;;;;;;;;;:::i;49434:55::-;;;;;;;;;;;;;:::i;57549:142::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57549:142:0;;;;:::i;50470:31::-;;;;;;;;;;;;;:::i;50214:34::-;;;;;;;;;;;;;:::i;50671:29::-;;;;;;;;;;;;;:::i;49122:41::-;;;;;;;;;;;;;:::i;68103:129::-;;;;;;;;;;;;;:::i;66079:124::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66079:124:0;;:::i;56087:119::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56087:119:0;;:::i;50142:29::-;;;;;;;;;;;;;:::i;50630:34::-;;;;;;;;;;;;;:::i;67386:328::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67386:328:0;;:::i;15671:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15671:244:0;-1:-1:-1;;;;;15671:244:0;;:::i;51037:35::-;;;;;;;;;;;;;:::i;57276:117::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57276:117:0;;:::i;57111:157::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57111:157:0;;:::i;50293:26::-;;;;;;;;;;;;;:::i;49362:65::-;;;;:::o;50586:37::-;;;;:::o;22999:91::-;23077:5;23070:12;;;;;;;;-1:-1:-1;;23070:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23044:13;;23070:12;;23077:5;;23070:12;;23077:5;23070:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22999:91;:::o;50992:38::-;;;;:::o;25145:169::-;25228:4;25245:39;25254:12;:10;:12::i;:::-;25268:7;25277:6;25245:8;:39::i;:::-;-1:-1:-1;25302:4:0;25145:169;;;;;:::o;50107:28::-;;;;:::o;50912:33::-;;;;:::o;51985:42::-;;;-1:-1:-1;;;;;51985:42:0;;:::o;49604:46::-;;;;;;;;;;;;;:::o;50326:120::-;;;;:::o;49027:41::-;;;-1:-1:-1;;;;;49027:41:0;;:::o;24098:108::-;24186:12;;24098:108;:::o;50952:33::-;;;;:::o;49711:44::-;;;;;;;;;;;;;:::o;50547:32::-;;;;:::o;60795:546::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;60978:19:::1;:38:::0;;;61027:16:::1;:32:::0;;;61070:13:::1;:26:::0;;;61107:14:::1;:28:::0;;;61146:14:::1;:28:::0;;;61185:11:::1;:22:::0;;;61234:99:::1;61199:8:::0;61234:85:::1;61163:11:::0;61234:85;61124:11;61234:85;61086:10;61234:85;61000:16;61046:13;61234:20:::1;:35::i;:::-;:39:::0;::::1;:51::i;:99::-;61218:13;:115:::0;-1:-1:-1;;;;;;60795:546:0:o;25796:321::-;25902:4;25919:36;25929:6;25937:9;25948:6;25919:9;:36::i;:::-;25966:121;25975:6;25983:12;:10;:12::i;:::-;25997:89;26035:6;25997:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25997:19:0;;;;;;:11;:19;;;;;;26017:12;:10;:12::i;:::-;-1:-1:-1;;;;;25997:33:0;;;;;;;;;;;;-1:-1:-1;25997:33:0;;;:89;:37;:89::i;:::-;25966:8;:121::i;:::-;-1:-1:-1;26105:4:0;25796:321;;;;;:::o;51722:34::-;;;;:::o;52109:51::-;;;;:::o;49202:41::-;;;-1:-1:-1;;;;;49202:41:0;;:::o;66327:141::-;66417:15;;:43;;;-1:-1:-1;;;66417:43:0;;;;66390:7;;-1:-1:-1;;;;;66417:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;66417:43:0;;-1:-1:-1;66327:141:0;:::o;23942:91::-;24016:9;;;;23942:91;:::o;64076:293::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;64264:15:::1;::::0;:45:::1;::::0;;-1:-1:-1;;;64264:45:0;;-1:-1:-1;;;;;64264:45:0;;::::1;;::::0;::::1;::::0;;;:15;;;::::1;::::0;:36:::1;::::0;:45;;;;;:15:::1;::::0;:45;;;;;;;:15;;:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64076:293:::0;:::o;50873:32::-;;;;:::o;50038:40::-;;;-1:-1:-1;;;;;50038:40:0;;:::o;26526:218::-;26614:4;26631:83;26640:12;:10;:12::i;:::-;26654:7;26663:50;26702:10;26663:11;:25;26675:12;:10;:12::i;:::-;-1:-1:-1;;;;;26663:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;26663:25:0;;;:34;;;;;;;;;;;:38;:50::i;57854:181::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;57957:15:::1;::::0;:70:::1;::::0;;-1:-1:-1;;;57957:70:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;57957:15:0;;::::1;::::0;:48:::1;::::0;:70;;;;;:15:::1;::::0;:70;;;;;;;;:15;;:70;::::1;;::::0;::::1;;;;::::0;::::1;58051:248:::0;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;58133:15:::1;::::0;:50:::1;::::0;;-1:-1:-1;;;58133:50:0;;-1:-1:-1;;;;;58133:50:0;;::::1;;::::0;::::1;::::0;;;:15;;;::::1;::::0;:38:::1;::::0;:50;;;;;:15:::1;::::0;:50;;;;;;;:15;;:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;58194:13:0::1;:26:::0;;-1:-1:-1;;;;;;58194:26:0::1;-1:-1:-1::0;;;;;58194:26:0;;::::1;::::0;;::::1;::::0;;;;58236:55:::1;::::0;58276:13;::::1;::::0;-1:-1:-1;58194:26:0;-1:-1:-1;58236:55:0::1;::::0;-1:-1:-1;;58236:55:0::1;58051:248:::0;:::o;59207:134::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;59295:25:::1;:38:::0;;-1:-1:-1;;;;;;59295:38:0::1;-1:-1:-1::0;;;;;59295:38:0;;;::::1;::::0;;;::::1;::::0;;59207:134::o;55964:107::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;56040:23:::1;56055:7;56040:14;:23::i;:::-;55964:107:::0;:::o;51771:34::-;;;;;;:::o;63715:349::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;63914:23:0;;::::1;;::::0;;;:14:::1;:23;::::0;;;;;:34;;-1:-1:-1;;63914:34:0::1;::::0;::::1;;;::::0;;63959:15:::1;::::0;:45;;-1:-1:-1;;;63959:45:0;;::::1;::::0;::::1;::::0;;;;;;:15;::::1;::::0;:36:::1;::::0;:45;;;;;63914:23;63959:45;;;;;;63914:23;63959:15;:45;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63715:349:::0;;:::o;51812:41::-;;;;;;;;;:::o;49075:38::-;;;:::o;50178:29::-;;;;:::o;68389:126::-;68484:23;;68465:15;:42;;68389:126;:::o;68001:94::-;68038:15;;:49;;;-1:-1:-1;;;68038:49:0;;68069:10;68038:49;;;;:15;:49;;;;;;;;-1:-1:-1;;;;;68038:15:0;;;;:30;;:49;;;;;;;;;;;;;;;;;;:15;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;68001:94:0:o;61353:504::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;61457:14:::1;:32:::0;;-1:-1:-1;;;;;;61457:32:0::1;-1:-1:-1::0;;;;;61457:32:0;;::::1;::::0;;::::1;::::0;;;;61534:14;;::::1;-1:-1:-1::0;61500:49:0;;;:33:::1;:49;::::0;;;;;:56;;-1:-1:-1;;61500:56:0::1;-1:-1:-1::0;61500:56:0::1;::::0;;61567:15:::1;::::0;:53;;-1:-1:-1;;;61567:53:0;;::::1;::::0;::::1;::::0;;;;;;:15;::::1;::::0;:36:::1;::::0;:53;;;;;-1:-1:-1;61567:53:0;;;;;;-1:-1:-1;61567:15:0;:53;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;61631:38;61647:15;61664:4;61631:15;:38::i;:::-;-1:-1:-1::0;;;;;61682:49:0;;::::1;;::::0;;;:33:::1;:49;::::0;;;;;:56;;-1:-1:-1;;61682:56:0::1;61734:4;61682:56;::::0;;61749:15:::1;::::0;:52;;-1:-1:-1;;;61749:52:0;;::::1;::::0;::::1;::::0;;;;;;:15;::::1;::::0;:36:::1;::::0;:52;;;;;61682:49;61749:52;;;;;;61682:49;61749:15;:52;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;61812:37;61828:14;61844:4;61812:15;:37::i;66476:125::-:0;-1:-1:-1;;;;;66565:28:0;66541:4;66565:28;;;:19;:28;;;;;;;;;66476:125::o;57411:122::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;57491:15:::1;:34:::0;;-1:-1:-1;;57491:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57411:122::o;49291:64::-;;;;:::o;66617:129::-;-1:-1:-1;;;;;66708:30:0;66684:4;66708:30;;;:21;:30;;;;;;;;;66617:129::o;57704:137::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;57793:23:::1;:40:::0;57704:137::o;68240:141::-;68332:15;;:41;;;-1:-1:-1;;;68332:41:0;;;;68305:7;;-1:-1:-1;;;;;68332:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;62641:314;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;62752:15:::1;::::0;-1:-1:-1;;;;;62730:38:0;;::::1;62752:15:::0;::::1;62730:38;;62722:91;;;;-1:-1:-1::0;;;62722:91:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62871:15;::::0;62829:59:::1;::::0;-1:-1:-1;;;;;62871:15:0;;::::1;::::0;62829:59;::::1;::::0;::::1;::::0;62871:15:::1;::::0;62829:59:::1;62899:15;:48:::0;;-1:-1:-1;;;;;;62899:48:0::1;-1:-1:-1::0;;;;;62899:48:0;;;::::1;::::0;;;::::1;::::0;;62641:314::o;66913:139::-;67010:15;;:34;;;-1:-1:-1;;;67010:34:0;;-1:-1:-1;;;;;67010:34:0;;;;;;;;;66983:7;;67010:15;;;;;:25;;:34;;;;;;;;;;;;;;;:15;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67010:34:0;;66913:139;-1:-1:-1;;66913:139:0:o;51116:148::-;;;;:::o;59499:206::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;59575:18:::1;59620:10;:8;:10::i;:::-;59673:11;::::0;59616:14:::1;::::0;;;::::1;:2;:14;59596:35:::0;::::1;::::0;-1:-1:-1;59642:55:0::1;::::0;59666:4:::1;::::0;-1:-1:-1;;;;;59673:11:0::1;59596:35:::0;59642:15:::1;:55::i;67722:271::-:0;67854:15;;:28;;;-1:-1:-1;;;;;;67854:28:0;;;;;;;;;;67788:18;;;;;;-1:-1:-1;;;;;67854:15:0;;;;:23;;:28;;;;;;;;;;;;;;;67788:18;67854:15;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67854:28:0;;;;;;;;;;;;67898:87;;;;;;;;;;;;;;;;;67854:28;67898:87;;;;;;;67854:28;;-1:-1:-1;67854:28:0;-1:-1:-1;67854:28:0;;-1:-1:-1;67975:9:0;;67963:5;;67898:87;;;;;;;;;67722:271;;;;:::o;24269:127::-;-1:-1:-1;;;;;24370:18:0;24343:7;24370:18;;;;;;;;;;;;24269:127::o;49252:26::-;;;-1:-1:-1;;;;;49252:26:0;;:::o;15368:148::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;15459:6:::1;::::0;15438:40:::1;::::0;15475:1:::1;::::0;15459:6:::1;::::0;::::1;-1:-1:-1::0;;;;;15459:6:0::1;::::0;15438:40:::1;::::0;15475:1;;15438:40:::1;15489:6;:19:::0;;-1:-1:-1;;;;;;15489:19:0::1;::::0;;15368:148::o;49496:56::-;;;;:::o;49901:37::-;;;-1:-1:-1;;;;;49901:37:0;;:::o;60241:538::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;60423:18:::1;:37:::0;;;60471:15:::1;:31:::0;;;60513:12:::1;:25:::0;;;60549:13:::1;:27:::0;;;60587:13:::1;:27:::0;;;60625:10:::1;:21:::0;;;60672:99:::1;60638:8:::0;60672:85:::1;60603:11:::0;60672:85;60565:11;60672:85;60528:10;60672:85;60444:16;60489:13;60672:20:::1;:35::i;:99::-;60657:12;:114:::0;-1:-1:-1;;;;;;60241:538:0:o;49657:47::-;;;;;;;;;;;;;:::o;49762:45::-;;;;;;;;;;;;;:::o;65669:402::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;65767:6:::1;65755:8;:18;;:40;;;;;65789:6;65777:8;:18;;65755:40;65747:110;;;;-1:-1:-1::0;;;65747:110:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65888:16;;65876:8;:28;;65868:90;;;;-1:-1:-1::0;;;65868:90:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66008:16;::::0;65974:51:::1;::::0;65998:8;;65974:51:::1;::::0;;;::::1;66036:16;:27:::0;65669:402::o;61865:768::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;61976:15:::1;::::0;-1:-1:-1;;;;;61954:38:0;;::::1;61976:15:::0;::::1;61954:38;;61946:101;;;;-1:-1:-1::0;;;61946:101:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62060:37;62127:10;62060:79;;62198:4;-1:-1:-1::0;;;;;62160:43:0::1;:18;-1:-1:-1::0;;;;;62160:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;62160:26:0;-1:-1:-1;;;;;62160:43:0::1;;62152:125;;;;-1:-1:-1::0;;;62152:125:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62290:18;-1:-1:-1::0;;;;;62290:39:0::1;;62338:18;62290:68;;;;;;;;;;;;;-1:-1:-1::0;;;;;62290:68:0::1;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;62369:54:0::1;::::0;;-1:-1:-1;;;62369:54:0;;62417:4:::1;62369:54;::::0;::::1;::::0;;;-1:-1:-1;;;;;62369:39:0;::::1;::::0;-1:-1:-1;62369:39:0::1;::::0;-1:-1:-1;62369:54:0;;;;;-1:-1:-1;;62369:54:0;;;;;;;-1:-1:-1;62369:39:0;:54;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;62482:15:0::1;::::0;62434:65:::1;::::0;;-1:-1:-1;;;62434:65:0;;-1:-1:-1;;;;;62482:15:0;;::::1;62434:65;::::0;::::1;::::0;;;:39;;::::1;::::0;-1:-1:-1;62434:39:0::1;::::0;-1:-1:-1;62434:65:0;;;;;62482:15:::1;::::0;62434:65;;;;;;;;62482:15;62434:39;:65;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;62559:15:0::1;::::0;62517:59:::1;::::0;-1:-1:-1;;;;;62559:15:0;;::::1;::::0;-1:-1:-1;62517:59:0;;::::1;::::0;-1:-1:-1;62517:59:0::1;::::0;62559:15:::1;::::0;62517:59:::1;62589:15;:36:::0;;-1:-1:-1;;;;;;62589:36:0::1;-1:-1:-1::0;;;;;62589:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;61865:768:0:o;58814:237::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;58902:14:::1;:27:::0;;-1:-1:-1;;;;;58902:27:0;;::::1;-1:-1:-1::0;;;;;;58902:27:0;;::::1;::::0;::::1;::::0;;:14:::1;58940:31:::0;;;:19:::1;:31;::::0;;;;:38;;-1:-1:-1;;58940:38:0::1;58902:27:::0;58940:38:::1;::::0;;58814:237::o;14717:87::-;14790:6;;;;;-1:-1:-1;;;;;14790:6:0;;14717:87::o;56603:159::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;56743:10:::1;:8;:10::i;:::-;56739:14;;:2;:14;56715:39;56688:24;:66:::0;56603:159::o;49561:36::-;;;;:::o;49814:::-;;;-1:-1:-1;;;;;49814:36:0;;:::o;23209:95::-;23289:7;23282:14;;;;;;;;-1:-1:-1;;23282:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23256:13;;23282:14;;23289:7;;23282:14;;23289:7;23282:14;;;;;;;;;;;;;;;;;;;;;;;;51681:34;;;;:::o;50255:31::-;;;;:::o;59063:132::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;59150:24:::1;:37:::0;;-1:-1:-1;;;;;;59150:37:0::1;-1:-1:-1::0;;;;;59150:37:0;;;::::1;::::0;;;::::1;::::0;;59063:132::o;59711:514::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;59890:15:::1;:34:::0;;;59935:12:::1;:28:::0;;;59974:9:::1;:22:::0;;;60007:10:::1;:24:::0;;;60042:10:::1;:24:::0;;;60077:7:::1;:18:::0;;;60118:99:::1;60087:8:::0;60118:85:::1;60055:11:::0;60118:85;60020:11;60118:85;59986:10;60118:85;59908:16;59950:13;60118:20:::1;:35::i;:99::-;60106:9;:111:::0;-1:-1:-1;;;;;;59711:514:0:o;64986:263::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;65095:13:::1;-1:-1:-1::0;;;;;65087:21:0::1;:4;-1:-1:-1::0;;;;;65087:21:0::1;;;65079:108;;;;-1:-1:-1::0;;;65079:108:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65200:41;65229:4;65235:5;65200:28;:41::i;51932:40::-:0;;;;:::o;50508:32::-;;;;:::o;66211:108::-;66284:15;;:27;;;-1:-1:-1;;;66284:27:0;;;;66257:7;;-1:-1:-1;;;;;66284:15:0;;:25;;:27;;;;;;;;;;;;;;:15;:27;;;;;;;;;;27247:269;27340:4;27357:129;27366:12;:10;:12::i;:::-;27380:7;27389:96;27428:15;27389:96;;;;;;;;;;;;;;;;;:11;:25;27401:12;:10;:12::i;:::-;-1:-1:-1;;;;;27389:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;27389:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;58311:239::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;58398:13:::1;:26:::0;;-1:-1:-1;;;;;58398:26:0;;::::1;-1:-1:-1::0;;;;;;58398:26:0;;::::1;::::0;::::1;::::0;;:13:::1;58435:31:::0;;;:19:::1;:31;::::0;;;;:38;;-1:-1:-1;;58435:38:0::1;58398:26:::0;58435:38:::1;::::0;;58311:239::o;66754:151::-;66850:15;;:47;;;-1:-1:-1;;;66850:47:0;;-1:-1:-1;;;;;66850:47:0;;;;;;;;;66823:7;;66850:15;;;;;:38;;:47;;;;;;;;;;;;;;;:15;:47;;;;;;;;;;24609:175;24695:4;24712:42;24722:12;:10;:12::i;:::-;24736:9;24747:6;24712:9;:42::i;67060:318::-;67156:7;67178:6;67199;67220:7;67242;67264;67286;67308;67335:15;;;;;;;;;-1:-1:-1;;;;;67335:15:0;-1:-1:-1;;;;;67335:26:0;;67362:7;67335:35;;;;;;;;;;;;;-1:-1:-1;;;;;67335:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67335:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67335:35:0;;-1:-1:-1;67335:35:0;;-1:-1:-1;67335:35:0;-1:-1:-1;67335:35:0;-1:-1:-1;67335:35:0;-1:-1:-1;67335:35:0;;-1:-1:-1;67335:35:0;-1:-1:-1;67060:318:0;;;;;;;;;:::o;51079:30::-;;;;:::o;58562:237::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;58650:14:::1;:27:::0;;-1:-1:-1;;;;;58650:27:0;;::::1;-1:-1:-1::0;;;;;;58650:27:0;;::::1;::::0;::::1;::::0;;:14:::1;58688:31:::0;;;:19:::1;:31;::::0;;;;:38;;-1:-1:-1;;58688:38:0::1;58650:27:::0;58688:38:::1;::::0;;58562:237::o;49857:37::-;;;-1:-1:-1;;;;;49857:37:0;;:::o;52734:58::-;;;;;;;;;;;;;;;:::o;62963:355::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;63161:28:0;;;::::1;;::::0;;;:19:::1;:28;::::0;;;;:39;;-1:-1:-1;;63161:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;62963:355::o;63341:359::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;63541:30:0;;;::::1;;::::0;;;:21:::1;:30;::::0;;;;:41;;-1:-1:-1;;63541:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;63341:359::o;56773:156::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;56910:10:::1;:8;:10::i;:::-;56906:14;;:2;:14;56882:39;56864:15;:57:::0;56773:156::o;64672:306::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;64791:9:::1;64787:115;64806:19:::0;;::::1;64787:115;;;64882:8;64847:19;:32;64867:8;;64876:1;64867:11;;;;;;;;::::0;;::::1;::::0;;;::::1;;-1:-1:-1::0;;;;;64867:11:0::1;64847:32:::0;;-1:-1:-1;64847:32:0;::::1;::::0;;;;;;-1:-1:-1;64847:32:0;:43;;-1:-1:-1;;64847:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;64827:3:0::1;64787:115;;;;64919:51;64951:8;;64961;64919:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;64919:51:0::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;64919:51:0;;-1:-1:-1;;;;;64919:51:0::1;64672:306:::0;;;:::o;56942:156::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;57079:10:::1;:8;:10::i;:::-;57075:14;;:2;:14;57051:39;57030:18;:60:::0;56942:156::o;49991:40::-;;;-1:-1:-1;;;;;49991:40:0;;:::o;59353:134::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;59441:25:::1;:38:::0;;-1:-1:-1;;;;;;59441:38:0::1;-1:-1:-1::0;;;;;59441:38:0;;;::::1;::::0;;;::::1;::::0;;59353:134::o;49945:39::-;;;-1:-1:-1;;;;;49945:39:0;;:::o;64381:283::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;64564:15:::1;::::0;:40:::1;::::0;;-1:-1:-1;;;64564:40:0;;-1:-1:-1;;;;;64564:40:0;;::::1;;::::0;::::1;::::0;;;:15;;;::::1;::::0;:31:::1;::::0;:40;;;;;:15:::1;::::0;:40;;;;;;;:15;;:40;::::1;;::::0;::::1;;;;::::0;::::1;50707:141:::0;;;;:::o;24847:151::-;-1:-1:-1;;;;;24963:18:0;;;24936:7;24963:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;24847:151::o;49434:55::-;;;;:::o;57549:142::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;57639:22:::1;:44:::0;;;::::1;;;;-1:-1:-1::0;;57639:44:0;;::::1;::::0;;;::::1;::::0;;57549:142::o;50470:31::-;;;;:::o;50214:34::-;;;;:::o;50671:29::-;;;;:::o;49122:41::-;;;-1:-1:-1;;;;;49122:41:0;;:::o;68103:129::-;68185:15;;:39;;;-1:-1:-1;;;68185:39:0;;;;68158:7;;-1:-1:-1;;;;;68185:15:0;;:37;;:39;;;;;;;;;;;;;;:15;:39;;;;;;;;;;66079:124;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;66153:15:::1;::::0;:42:::1;::::0;;-1:-1:-1;;;66153:42:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;66153:15:0;;::::1;::::0;:31:::1;::::0;:42;;;;;:15:::1;::::0;:42;;;;;;;;:15;;:42;::::1;;::::0;::::1;;;;::::0;::::1;56087:119:::0;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;56169:29:::1;56190:7;56169:20;:29::i;50142:::-:0;;;;:::o;50630:34::-;;;;:::o;67386:328::-;67487:7;67509:6;67530;67551:7;67573;67595;67617;67639;67666:15;;;;;;;;;-1:-1:-1;;;;;67666:15:0;-1:-1:-1;;;;;67666:33:0;;67700:5;67666:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15671:244;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;15760:22:0;::::1;15752:73;;;;-1:-1:-1::0;;;15752:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15862:6;::::0;15841:38:::1;::::0;-1:-1:-1;;;;;15841:38:0;;::::1;::::0;15862:6:::1;::::0;::::1;;::::0;15841:38:::1;::::0;;;::::1;15890:6;:17:::0;;-1:-1:-1;;;;;15890:17:0;;::::1;;;-1:-1:-1::0;;;;;;15890:17:0;;::::1;::::0;;;::::1;::::0;;15671:244::o;51037:35::-;;;;:::o;57276:117::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;57357:12:::1;:28:::0;57276:117::o;57111:157::-;14948:12;:10;:12::i;:::-;-1:-1:-1;;;;;14937:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;14937:23:0;;14929:68;;;;;-1:-1:-1;;;14929:68:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14929:68:0;;;;;;;;;;;;;;;57249:10:::1;:8;:10::i;:::-;57245:14;;:2;:14;57221:20;:39;57195:23;:65;;;;57111:157:::0;:::o;50293:26::-;;;;:::o;34632:179::-;34690:7;34722:5;;;34746:6;;;;34738:46;;;;;-1:-1:-1;;;34738:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34802:1;34632:179;-1:-1:-1;;;34632:179:0:o;3352:106::-;3440:10;3352:106;:::o;30394:346::-;-1:-1:-1;;;;;30496:19:0;;30488:68;;;;-1:-1:-1;;;30488:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30575:21:0;;30567:68;;;;-1:-1:-1;;;30567:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30648:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;30700:32;;;;;;;;;;;;;;;;;30394:346;;;:::o;74838:6798::-;-1:-1:-1;;;;;74971:20:0;;;;;;:14;:20;;;;;;;;74970:21;74962:70;;;;-1:-1:-1;;;74962:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;75052:18:0;;;;;;:14;:18;;;;;;;;75051:19;75043:68;;;;-1:-1:-1;;;75043:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;75130:18:0;;75122:66;;;;-1:-1:-1;;;75122:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;75207:16:0;;75199:64;;;;-1:-1:-1;;;75199:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75277:11;75274:92;;75305:28;75321:4;75327:2;75331:1;75305:15;:28::i;:::-;75348:7;;75274:92;75378:14;75437:7;:5;:7::i;:::-;-1:-1:-1;;;;;75429:15:0;:4;-1:-1:-1;;;;;75429:15:0;;;:48;;;;-1:-1:-1;;;;;;75461:16:0;;;;75429:48;:86;;;;-1:-1:-1;;;;;;75494:21:0;;75508:6;75494:21;;75429:86;:134;;;;-1:-1:-1;;;;;;75532:31:0;;;;;;:25;:31;;;;;;;;75429:134;75411:1043;;;-1:-1:-1;;;;;75594:27:0;;;;;;:21;:27;;;;;;;;75590:198;;75673:23;;75663:6;:33;;75637:135;;;;-1:-1:-1;;;75637:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75824:9:0;;;75804:17;:29;75869:10;;;75848:18;:31;75915:10;;;75894:18;:31;75966:15;;;75940:23;:41;76019:12;;;75996:20;:35;;;76046:15;:30;76111:9;;;76091:17;:29;76147:12;;76135:24;;;76187:13;;76174:26;;;76228:13;;76215:26;;;76274:18;;76256:36;;76322:15;;76307:30;;76362:10;;76352:7;:20;76399:12;;76387:24;;-1:-1:-1;75411:1043:0;76494:21;76518;:19;:21::i;:::-;76494:45;;76707:16;76703:162;;-1:-1:-1;;;;;76748:39:0;;;;;;:33;:39;;;;;;;;76740:113;;;;-1:-1:-1;;;76740:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76903:7;:5;:7::i;:::-;-1:-1:-1;;;;;76895:15:0;:4;-1:-1:-1;;;;;76895:15:0;;;:41;;;;-1:-1:-1;76928:8:0;;-1:-1:-1;;;76928:8:0;;;;76927:9;76895:41;:74;;;;;76953:16;76895:74;:120;;;;-1:-1:-1;;;;;;76986:29:0;;;;;;:25;:29;;;;;;;;76895:120;:236;;;;-1:-1:-1;77115:15:0;;-1:-1:-1;;;;;77099:32:0;;;77115:15;;77099:32;;76895:236;:341;;;;-1:-1:-1;;;;;;77213:23:0;;;;;;:19;:23;;;;;;;;77212:24;76895:341;76877:1909;;;77351:13;;-1:-1:-1;;;;;77333:15:0;;;;;;:9;:15;;;;;;77367;77333:31;;:49;77330:108;;;-1:-1:-1;;;;;77402:16:0;;77421:1;77402:16;;;:10;:16;;;;;:20;77330:108;-1:-1:-1;;;;;77458:27:0;;;;;;:21;:27;;;;;;;;77454:292;;77542:24;;-1:-1:-1;;;;;77522:16:0;;;;;;:10;:16;;;;;;77513:25;;:53;;77505:132;;;;-1:-1:-1;;;77505:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;77817:16:0;;77836:1;77817:16;;;:10;:16;;;;;;:20;77813:277;;-1:-1:-1;;;;;77858:16:0;;;;;;:10;:16;;;;;:26;;;;;;77813:277;;;-1:-1:-1;;;;;77923:15:0;;;;;;:9;:15;;;;;;;;77941;77923:33;;78048:10;:16;;;;;:26;;;;;;77813:277;78140:9;;;78120:17;:29;78185:10;;;78164:18;:31;78231:10;;;78210:18;:31;78282:15;;;78256:23;:41;78335:12;;;78312:20;:35;78380:7;;;78362:15;:25;78422:9;;;78402:17;:29;78458:13;;78446:25;;;78499:14;;78486:27;;;78541:14;;78528:27;;;78588:19;;78570:37;;78637:16;;78622:31;;78678:11;;78668:21;;78716:13;;78704:25;;-1:-1:-1;;;76877:1909:0;78798:28;78829:24;78847:4;78829:9;:24::i;:::-;78913:18;;78798:55;;-1:-1:-1;78889:42:0;;;78961:16;:41;;;;;78995:7;78961:41;:67;;;;-1:-1:-1;79020:8:0;;-1:-1:-1;;;79020:8:0;;;;79019:9;78961:67;:116;;;;-1:-1:-1;;;;;;79046:31:0;;;;;;:25;:31;;;;;;;;79045:32;78961:116;:152;;;;-1:-1:-1;79102:11:0;;-1:-1:-1;;;;;79094:19:0;;;79102:11;;79094:19;;78961:152;:186;;;;-1:-1:-1;79136:11:0;;-1:-1:-1;;;;;79130:17:0;;;79136:11;;79130:17;;78961:186;78944:667;;;79174:8;:15;;-1:-1:-1;;;;79174:15:0;-1:-1:-1;;;79174:15:0;;;79438:18;;79423:34;;:14;:34::i;:::-;79474:18;79495:24;79513:4;79495:9;:24::i;:::-;79474:45;;79534:32;79555:10;79534:20;:32::i;:::-;-1:-1:-1;79583:8:0;:16;;-1:-1:-1;;;;79583:16:0;;;78944:667;79625:12;79640:16;:29;;;;-1:-1:-1;79661:8:0;;-1:-1:-1;;;79661:8:0;;;;79660:9;79640:29;-1:-1:-1;;;;;79770:25:0;;;;;;:19;:25;;;;;;79625:44;;-1:-1:-1;79770:25:0;;;:52;;-1:-1:-1;;;;;;79799:23:0;;;;;;:19;:23;;;;;;;;79770:52;:78;;;-1:-1:-1;79826:22:0;;;;;;;79770:78;79767:125;;;-1:-1:-1;79875:5:0;79767:125;79907:7;:20;;;;79918:9;79907:20;79904:940;;;-1:-1:-1;;;;;79948:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;79977:23:0;;;;;;:19;:23;;;;;;;;79948:52;79945:538;;;;;;80119:15;80137:22;80151:7;;80137:9;;:13;;:22;;;;:::i;:::-;80119:40;-1:-1:-1;80174:17:0;80194:28;80218:3;80194:19;:6;80119:40;80194:10;:19::i;:::-;:23;;:28::i;:::-;80174:48;;80237:15;80255:28;80279:3;80255:19;80266:7;;80255:6;:10;;:19;;;;:::i;:28::-;80237:46;-1:-1:-1;80307:37:0;80237:46;80307:21;:6;80318:9;80307:10;:21::i;:::-;:25;;:37::i;:::-;80298:46;;80359:47;80375:4;80389;80396:9;80359:15;:47::i;:::-;80443:11;;80421:46;;80437:4;;-1:-1:-1;;;;;80443:11:0;80456:10;80421:15;:46::i;:::-;79945:538;;;;79904:940;;;-1:-1:-1;;;;;80516:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;80545:23:0;;;;;;:19;:23;;;;;;;;80516:52;80513:320;;;;;;80664:15;80682:28;80706:3;80682:19;80693:7;;80682:6;:10;;:19;;;;:::i;:28::-;80664:46;-1:-1:-1;80734:22:0;:6;80664:46;80734:10;:22::i;:::-;80793:11;;80725:31;;-1:-1:-1;80771:46:0;;80787:4;;-1:-1:-1;;;;;80793:11:0;80806:10;80771:15;:46::i;:::-;80513:320;;80866:33;80882:4;80888:2;80892:6;80866:15;:33::i;:::-;80915:9;80912:49;;;80936:13;:11;:13::i;:::-;80977:15;;-1:-1:-1;;;;;80977:15:0;:26;81012:4;81019:15;81012:4;81019:9;:15::i;:::-;80977:58;;;;;;;;;;;;;-1:-1:-1;;;;;80977:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80973:74;81061:15;;-1:-1:-1;;;;;81061:15:0;:26;81096:2;81101:13;81096:2;81101:9;:13::i;:::-;81061:54;;;;;;;;;;;;;-1:-1:-1;;;;;81061:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;81057:70;81177:19;;81213:8;;81158:15;:38;;;;;;-1:-1:-1;;;81213:8:0;;;;81212:9;:24;;;;;81225:11;81212:24;81209:420;;;81267:16;;81321:12;;81298:19;:35;;;;;;;81352:15;;:28;;;-1:-1:-1;;;;;;81352:28:0;;;;;;;;;;-1:-1:-1;;;;;81352:15:0;;;;:23;;:28;;;;;;;;;;;;;;;81253:11;81352:15;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;81352:28:0;;;;;;;;;;;;;;;;81348:270;;;;;81478:86;;;;;;;;;;;;;;;;;;;;;;;;;;81554:9;;81543:4;;81478:86;;;;;;;;;81381:199;;;81348:270;81209:420;;74838:6798;;;;;;;;;;:::o;37459:166::-;37545:7;37581:12;37573:6;;;;37565:29;;;;-1:-1:-1;;;37565:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37612:5:0;;;37459:166::o;68523:2952::-;68583:21;68615:22;68648;68694:9;;68707:1;68694:14;68691:91;;68740:30;68766:3;68740:21;68751:9;;68740:6;:10;;:21;;;;:::i;:30::-;68724:46;;68691:91;68795:10;;:15;68792:94;;68843:31;68870:3;68843:22;68854:10;;68843:6;:10;;:22;;;;:::i;:31::-;68826:48;;68792:94;68899:10;;:15;68896:94;;68947:31;68974:3;68947:22;68958:10;;68947:6;:10;;:22;;;;:::i;:31::-;68930:48;;68896:94;69027:22;;;:39;;;:56;;;69002:22;69164:13;69027:6;69175:1;69164:10;:13::i;:::-;69145:32;-1:-1:-1;69188:12:0;69203:21;:14;69222:1;69203:18;:21::i;:::-;69188:36;-1:-1:-1;69235:17:0;69255:24;:14;69188:36;69255:18;:24::i;:::-;69235:44;-1:-1:-1;69582:21:0;69648:26;69665:8;69648:16;:26::i;:::-;69803:18;69824:41;:21;69850:14;69824:25;:41::i;:::-;69803:62;;69878:24;69913:25;69949;69990:9;;70003:1;69990:14;69987:98;;70039:34;70069:3;70039:25;70054:9;;70039:10;:14;;:25;;;;:::i;:34::-;70020:53;;69987:98;70098:10;;:15;70095:101;;70149:35;70180:3;70149:26;70164:10;;70149;:14;;:26;;;;:::i;:35::-;70129:55;;70095:101;70209:10;;:15;70206:101;;70260:35;70291:3;70260:26;70275:10;;70260;:14;;:26;;;;:::i;:35::-;70240:55;;70206:101;70350:29;;;:49;;;:69;;;70450:9;70475:21;;70472:274;;70511:24;;-1:-1:-1;;;;;70511:24:0;:38;70508:237;;70600:24;;70626:13;;70565:75;;70582:16;;-1:-1:-1;;;;;70600:24:0;;;;70626:13;70565:16;:75::i;:::-;70508:237;;;70686:13;;:47;;70672:9;;-1:-1:-1;;;;;70686:13:0;;70712:16;;70672:9;70686:47;70672:9;70686:47;70712:16;70686:13;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;70508:237:0;70761:22;;70758:289;;70806:25;;-1:-1:-1;;;;;70806:25:0;:39;70803:243;;70897:25;;70924:14;;70861:78;;70878:17;;-1:-1:-1;;;;;70897:25:0;;;;70924:14;70861:16;:78::i;:::-;70803:243;;;70985:14;;:49;;70971:9;;-1:-1:-1;;;;;70985:14:0;;71012:17;;70971:9;70985:49;70971:9;70985:49;71012:17;70985:14;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;70803:243:0;71070:22;;71067:253;;71115:15;;;;71112:207;;;71197:14;;71146:66;;71163:17;;71190:4;;-1:-1:-1;;;;;71197:14:0;71146:16;:66::i;:::-;71112:207;;;71258:14;;:49;;71244:9;;-1:-1:-1;;;;;71258:14:0;;71285:17;;71244:9;71258:49;71244:9;71258:49;71285:17;71258:14;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;71112:207:0;71369:37;71382:9;71393:12;71369;:37::i;:::-;71422:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68523:2952;;;;;;;;;;;;;;;:::o;28006:539::-;-1:-1:-1;;;;;28112:20:0;;28104:70;;;;-1:-1:-1;;;28104:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28193:23:0;;28185:71;;;;-1:-1:-1;;;28185:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28269:47;28290:6;28298:9;28309:6;28269:20;:47::i;:::-;28349:71;28371:6;28349:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28349:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;28329:17:0;;;:9;:17;;;;;;;;;;;:91;;;;28454:20;;;;;;;:32;;28479:6;28454:24;:32::i;:::-;-1:-1:-1;;;;;28431:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;28502:35;;;;;;;28431:20;;28502:35;;;;;;;;;;;;;28006:539;;;:::o;65257:404::-;-1:-1:-1;;;;;65348:31:0;;;;;;:25;:31;;;;;;;;:40;;;;;;;65340:114;;;;-1:-1:-1;;;65340:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;65465:31:0;;;;;;:25;:31;;;;;:39;;-1:-1:-1;;65465:39:0;;;;;;;;;;;;65517:79;;65542:15;;:42;;;-1:-1:-1;;;65542:42:0;;-1:-1:-1;;;;;65542:42:0;;;;;;;;;:15;;;;;:36;;:42;;;;;:15;;:42;;;;;;;:15;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65517:79;65613:40;;;;;;-1:-1:-1;;;;;65613:40:0;;;;;;;;65257:404;;:::o;71522:942::-;71625:15;;71714:13;;-1:-1:-1;;;;;71625:15:0;;;;71587:27;;;;71714:13;:27;71711:593;;71757:42;71777:6;71793:4;71757:19;:42::i;:::-;71833:13;;71826:46;;;-1:-1:-1;;;71826:46:0;;71866:4;71826:46;;;;;;-1:-1:-1;;;;;71833:13:0;;;;71826:31;;:46;;;;;;;;;;;;;;;71833:13;71826:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71826:46:0;71904:13;;71936:15;;71897:67;;;-1:-1:-1;;;71897:67:0;;-1:-1:-1;;;;;71936:15:0;;;71897:67;;;;;;;;;;;;71826:46;;-1:-1:-1;71904:13:0;;;71897:30;;:67;;;;;71826:46;;71897:67;;;;;;;;71904:13;;71897:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71897:67:0;;-1:-1:-1;71711:593:0;;;72020:21;72056:24;72073:6;72056:16;:24::i;:::-;72095:18;72116:41;:21;72142:14;72116:25;:41::i;:::-;72224:39;;72095:62;;-1:-1:-1;72095:62:0;;-1:-1:-1;72210:9:0;;-1:-1:-1;;;;;72224:16:0;;;72095:62;;72210:9;72224:39;72210:9;72224:39;72095:62;72224:16;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72209:54:0;;-1:-1:-1;;;;;71711:593:0;72318:7;72314:143;;;72342:15;;:51;;;-1:-1:-1;;;72342:51:0;;;;;;;;;;-1:-1:-1;;;;;72342:15:0;;;;:40;;:51;;;;;:15;;:51;;;;;;;;:15;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72413:32:0;;;;;;;;;;;;;;;;-1:-1:-1;72413:32:0;;;;;;;;-1:-1:-1;72413:32:0;72314:143;71522:942;;;;:::o;35094:158::-;35152:7;35185:1;35180;:6;;35172:49;;;;;-1:-1:-1;;;35172:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35239:5:0;;;35094:158::o;35511:220::-;35569:7;35593:6;35589:20;;-1:-1:-1;35608:1:0;35601:8;;35589:20;35632:5;;;35636:1;35632;:5;:1;35656:5;;;;;:10;35648:56;;;;-1:-1:-1;;;35648:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36209:153;36267:7;36299:1;36295;:5;36287:44;;;;;-1:-1:-1;;;36287:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36353:1;36349;:5;;;;;;;36209:153;-1:-1:-1;;;36209:153:0:o;56212:372::-;56271:17;;56259:9;:29;56316:18;;56303:10;:31;56362:18;;56349:10;:31;56413:23;;56395:15;:41;56466:20;;56451:12;:35;56511:15;;56501:7;:25;56553:17;;56541:9;:29;56212:372::o;73015:603::-;73169:16;;;73183:1;73169:16;;;;;;;;73145:21;;73169:16;;;;;;;;;;-1:-1:-1;73169:16:0;73145:40;;73214:4;73196;73201:1;73196:7;;;;;;;;-1:-1:-1;;;;;73196:23:0;;;:7;;;;;;;;;;:23;;;;73240:15;;:22;;;-1:-1:-1;;;73240:22:0;;;;:15;;;;;:20;;:22;;;;;73196:7;;73240:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73240:22:0;73230:7;;:4;;73235:1;;73230:7;;;;;;-1:-1:-1;;;;;73230:32:0;;;:7;;;;;;;;;:32;73307:15;;73275:62;;73292:4;;73307:15;73325:11;73275:8;:62::i;:::-;73376:15;;:224;;-1:-1:-1;;;73376:224:0;;;;;;;;:15;:224;;;;;;73554:4;73376:224;;;;;;73574:15;73376:224;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;73376:15:0;;;;:66;;73457:11;;73527:4;;73554;73574:15;73376:224;;;;;;;;;;;;;;;;:15;:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72471:538;72659:16;;;72673:1;72659:16;;;;;;;;72635:21;;72659:16;;;;;;;;-1:-1:-1;;72696:15:0;;:22;;;-1:-1:-1;;;72696:22:0;;;;72635:40;;-1:-1:-1;;;;;;72696:15:0;;;;:20;;-1:-1:-1;72696:22:0;;;;;;;;;;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72696:22:0;72686:7;;:4;;72691:1;;72686:7;;;;;;;;;:32;-1:-1:-1;;;;;72686:32:0;;;-1:-1:-1;;;;;72686:32:0;;;;;72739:12;72729:4;72734:1;72729:7;;;;;;;;-1:-1:-1;;;;;72729:22:0;;;:7;;;;;;;;;;:22;;;;72790:15;;:211;;-1:-1:-1;;;72790:211:0;;:15;:211;;;;;;;;;;;;;72975:15;72790:211;;;;;;;;;;;;;;;;;;;;;:15;;;;;:66;;72864:9;;72790:15;;72933:4;;72952:8;;72790:211;;;;;;;;;;;;;;;:15;:211;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74293:537;74484:15;;74452:62;;74469:4;;-1:-1:-1;;;;;74484:15:0;74502:11;74452:8;:62::i;:::-;74556:15;;74760:11;;74556:256;;;-1:-1:-1;;;74556:256:0;;74628:4;74556:256;;;;;;;;;;:15;:256;;;;;;;;;;-1:-1:-1;;;;;74760:11:0;;;74556:256;;;;74786:15;74556:256;;;;;;:15;;;;;:31;;74595:9;;74556:256;;;;;;;;;;;;;;;74595:9;74556:15;:256;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73624:663;73804:16;;;73818:1;73804:16;;;;;;;;;73780:21;;73804:16;;;;;;;;;;-1:-1:-1;73804:16:0;73780:40;;73849:4;73831;73836:1;73831:7;;;;;;;;-1:-1:-1;;;;;73831:23:0;;;:7;;;;;;;;;;:23;;;;73875:15;;:22;;;-1:-1:-1;;;73875:22:0;;;;:15;;;;;:20;;:22;;;;;73831:7;;73875:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73875:22:0;73865:7;;:4;;73870:1;;73865:7;;;;;;-1:-1:-1;;;;;73865:32:0;;;:7;;;;;;;;;:32;73918:13;;73908:7;;73918:13;;;73908:4;;73913:1;;73908:7;;;;;;-1:-1:-1;;;;;73908:23:0;;;:7;;;;;;;;;:23;73976:15;;73944:62;;73961:4;;73976:15;73994:11;73944:8;:62::i;:::-;74045:15;;:224;;-1:-1:-1;;;74045:224:0;;;;;;;;:15;:224;;;;;;-1:-1:-1;;;;;74045:224:0;;;;;;;74243:15;74045:224;;;;;;;;;;;;;;;;;;;;;:15;;;;;:69;;74129:11;;74200:4;;74219:9;;74243:15;74045:224;;;;;;;;;;;;;;:15;:224;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73624:663;;;:::o

Swarm Source

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