ETH Price: $3,412.37 (+3.39%)

Token

BuffettBank (BBANK)
 

Overview

Max Total Supply

69,000,000,000 BBANK

Holders

107

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
61,410,000 BBANK

Value
$0.00
0xe94c31a5ddbab752f694214dff832ee38955e4d6
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BuffettBank

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-16
*/

//import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0-solc-0.7/contracts/token/ERC20/ERC20.sol";
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

/*
 * @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) {
        return payable(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;
    }
}

/**
 * @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;
    }
}


/**
 * @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);
}


/**
 * @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 { }
}


contract Ownable {
    address public _owner;
    event onOwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor() {
        _owner = msg.sender;
    }
    modifier onlyOwner() {
        require(msg.sender == _owner);
        _;
    }

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

    function transferOwnership(address _newOwner) public onlyOwner {
        require(_newOwner != address(0));
        emit onOwnershipTransferred(_owner, _newOwner);
        _owner = _newOwner;
    }
}



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


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

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



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

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

contract DividendDistributor is IDividendDistributor {
    using SafeMath for uint256;

    address _token;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }

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

    mapping (address => Share) public shares;

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

    uint256 public minPeriod = 1 hours;
    uint256 public minDividendForReward;

    uint256 currentIndex;

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

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

    constructor () {
        _token = msg.sender;
    }

    function notifyJustBuyRecently(address buyer) public onlyToken {
        lastBought[buyer] = block.timestamp;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDividendForReward) external override onlyToken {
        minPeriod = _minPeriod;
        minDividendForReward = _minDividendForReward;
    }

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

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

        totalShares = totalShares.sub(shares[shareholder].amount).add(dividendAmount);
        shares[shareholder].amount = dividendAmount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }
    receive() external payable { 
        deposit();
    }

    function deposit() public payable override {
        totalDividends = totalDividends.add(msg.value);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(msg.value).div(totalShares));
    }

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

        if(shareholderCount == 0) { return; }

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

        uint256 iterations = 0;

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

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

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

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

        uint256 amount = getUnpaidEarnings(shareholder);
        if(amount > 0){
            (bool success,) = payable(shareholder).call{value: amount, gas: 3000}("");
            if(success){
                totalDistributed = totalDistributed.add(amount);
                shareholderClaims[shareholder] = block.timestamp;
                shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);
                shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
            }
        }
    }
    
    function claimDividend(address shareholder) external {
        if(shouldDistribute(shareholder)){
            distributeDividend(shareholder);
        }
    }

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

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

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

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

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

    function getLastTimeClaim(address shareholder)public view returns (uint256) {
        return shareholderClaims[shareholder];
    }

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

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

// File: @openzeppelin/contracts/utils/ReentrancyGuard.sol
/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


contract Staking is Ownable, ReentrancyGuard {
    using SafeMath for uint256;

    IERC20 public token;
    IERC20 public USDT = IERC20(0xdAC17F958D2ee523a2206206994597C13D831ec7);

    uint256 public totalRewardUsdtDistributed;
    uint256 public amountUsdtForReward;
    uint256 public limitRewardUsdtPerSecond;
    uint256 public accUsdtPerShare;

    uint256 public totalRewardEthDistributed;
    uint256 public amountEthForReward;
    uint256 public accEthPerShare;

    uint256 public requiredTimeForReward;
    uint256 public lastRewardTime;
    uint256 public PRECISION_FACTOR;
    uint256 public totalStakedAmount;

    uint256 public currentUsdtPerSecond;
    uint256 public currentEthPerSecond;

    uint256 lastEthBalance;

    mapping(address => UserInfo) public userInfo;

    struct UserInfo {
        uint256 amount;
        uint256 depositTime;
        uint256 rewardUsdtDebt;
        uint256 pendingUsdtReward;

        uint256 rewardEthDebt;
        uint256 pendingEthReward;
    }

    IUniswapV2Router02 uniswapV2Router;

    event Deposit(address indexed user, uint256 amount);
    event EmergencyWithdraw(address indexed user, uint256 amount);
    event Withdraw(address indexed user, uint256 amount);
    event Harvest(address indexed user, uint256 amount);

    constructor () {
        uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

        token = IERC20(msg.sender);
        PRECISION_FACTOR = uint256(10**36);
        limitRewardUsdtPerSecond = 20000; // 50000 USDT/month - Warning: USDT decimals = 6
        requiredTimeForReward = 30 days;
        lastRewardTime = block.timestamp;
    }

    receive() external payable {}

    function distributeUsdtToStaking() public payable {
        uint256 balanceBefore = USDT.balanceOf(address(this));

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

        uniswapV2Router.swapExactETHForTokens{value: msg.value}(
            0,
            path,
            address(this),
            block.timestamp
        );
        uint256 amount = USDT.balanceOf(address(this)).sub(balanceBefore);

        amountUsdtForReward = amountUsdtForReward.add(amount);
    }    
    
    function setLimitRewardUsdtPerSecond(uint256 _limitRewardEthPerSecond) public onlyOwner{
        limitRewardUsdtPerSecond = _limitRewardEthPerSecond;
    }

    function deposit(uint256 _amount) external nonReentrant {
        UserInfo storage user = userInfo[msg.sender];
        require(_amount > 0, "Can't deposit zero amount");

        _updatePool();

        if (user.amount > 0) {
            user.pendingUsdtReward = user.pendingUsdtReward.add(user.amount.mul(accUsdtPerShare).div(PRECISION_FACTOR).sub(user.rewardUsdtDebt));
            user.pendingEthReward = user.pendingEthReward.add(user.amount.mul(accEthPerShare).div(PRECISION_FACTOR).sub(user.rewardEthDebt));
        }

        user.depositTime = user.depositTime > 0 ? user.depositTime : block.timestamp;
        
        user.amount = user.amount.add(_amount);
        token.transferFrom(address(msg.sender), address(this), _amount);

        totalStakedAmount = totalStakedAmount.add(_amount);
        user.rewardUsdtDebt = user.amount.mul(accUsdtPerShare).div(PRECISION_FACTOR);
        user.rewardEthDebt = user.amount.mul(accEthPerShare).div(PRECISION_FACTOR);

        emit Deposit(msg.sender, _amount);
    }

    function setTimeRequireForRewardStaking(uint256 _second) public onlyOwner{
        require(_second <= 90 days);
        requiredTimeForReward = _second;
    }

    function withdraw() external nonReentrant {
        UserInfo storage user = userInfo[msg.sender];
        require(user.amount >= 0, "You havent invested yet");

        _updatePool();

        uint256 pendingUsdt = user.pendingUsdtReward.add(user.amount.mul(accUsdtPerShare).div(PRECISION_FACTOR).sub(user.rewardUsdtDebt));
        uint256 pendingEth = user.pendingEthReward.add(user.amount.mul(accEthPerShare).div(PRECISION_FACTOR).sub(user.rewardEthDebt));

        token.transfer(address(msg.sender), user.amount);

        if(block.timestamp > user.depositTime.add(requiredTimeForReward)){
            if (pendingUsdt > 0) {
                USDT.transfer(address(msg.sender), pendingUsdt);
            }
            if(pendingEth > 0){
                payable(msg.sender).transfer(pendingEth);
                lastEthBalance = address(this).balance;
            }
        }else {
            amountUsdtForReward = amountUsdtForReward.add(pendingUsdt);
            amountEthForReward = amountEthForReward.add(pendingEth);
        }
        totalStakedAmount = totalStakedAmount.sub(user.amount);
        user.amount = 0;
        user.depositTime = 0;
        user.rewardUsdtDebt = 0;
        user.pendingUsdtReward = 0;
        user.rewardEthDebt = 0;
        user.pendingEthReward = 0;

        emit Withdraw(msg.sender, user.amount);
    }

    function harvest() external nonReentrant {
        UserInfo storage user = userInfo[msg.sender];
        require(user.amount >= 0, "You havent invested yet");
        require(block.timestamp > user.depositTime.add(requiredTimeForReward), "Check locking time require");

        _updatePool();

        uint256 pendingUsdt = user.pendingUsdtReward.add(user.amount.mul(accUsdtPerShare).div(PRECISION_FACTOR).sub(user.rewardUsdtDebt));
        if (pendingUsdt > 0) {
            USDT.transfer(address(msg.sender), pendingUsdt);
            user.pendingUsdtReward = 0;
            user.rewardUsdtDebt = user.amount.mul(accUsdtPerShare).div(PRECISION_FACTOR);
            emit Harvest(msg.sender, pendingUsdt);
        }

        uint256 pendingEth = user.pendingEthReward.add(user.amount.mul(accEthPerShare).div(PRECISION_FACTOR).sub(user.rewardEthDebt));
        if (pendingEth > 0) {
            payable(msg.sender).transfer(pendingEth);
            user.pendingEthReward = 0;
            user.rewardEthDebt = user.amount.mul(accEthPerShare).div(PRECISION_FACTOR);

            lastEthBalance = address(this).balance;
            emit Harvest(msg.sender, pendingEth);
        }
    }

    function emergencyWithdraw() external nonReentrant {
        UserInfo storage user = userInfo[msg.sender];
        uint256 amountToTransfer = user.amount;
        user.amount = 0;
        user.depositTime = 0;
        totalStakedAmount = totalStakedAmount.sub(amountToTransfer);

        user.rewardUsdtDebt = 0;
        amountUsdtForReward = amountUsdtForReward.add(user.pendingUsdtReward);
        user.pendingUsdtReward = 0;

        user.rewardEthDebt = 0;
        amountEthForReward = amountEthForReward.add(user.pendingEthReward);
        user.pendingEthReward = 0;

        if (amountToTransfer > 0) {
            token.transfer(address(msg.sender), amountToTransfer);
        }

        emit EmergencyWithdraw(msg.sender, amountToTransfer);
    }

    function pendingReward(address _user) public view returns (uint256, uint256) {
        UserInfo storage user = userInfo[_user];
        uint256 pendingUsdt;
        uint256 pendingEth;
        
        if (block.timestamp > lastRewardTime && totalStakedAmount != 0) {
            uint256 multiplier = block.timestamp.sub(lastRewardTime);
            uint256 usdtReward = multiplier.mul(limitRewardUsdtPerSecond);
            if(usdtReward > amountUsdtForReward){
                usdtReward = amountUsdtForReward;
            }
            uint256 adjustedUsdtPerShare = accUsdtPerShare.add(usdtReward.mul(PRECISION_FACTOR).div(totalStakedAmount));
            pendingUsdt =  user.pendingUsdtReward.add(user.amount.mul(adjustedUsdtPerShare).div(PRECISION_FACTOR).sub(user.rewardUsdtDebt));

            // ETH reflection
            uint256 additionEthReflection = address(this).balance.sub(lastEthBalance);
            uint256 currentEthForReward = amountEthForReward.add(additionEthReflection);
            uint256 adjustedEthPerShare = accEthPerShare.add(currentEthForReward.mul(PRECISION_FACTOR).div(totalStakedAmount));
            pendingEth =  user.pendingEthReward.add(user.amount.mul(adjustedEthPerShare).div(PRECISION_FACTOR).sub(user.rewardEthDebt));
        } else {
            pendingUsdt = user.pendingUsdtReward.add(user.amount.mul(accUsdtPerShare).div(PRECISION_FACTOR).sub(user.rewardUsdtDebt));
            pendingEth = user.pendingEthReward.add(user.amount.mul(accEthPerShare).div(PRECISION_FACTOR).sub(user.rewardEthDebt));
        }

        return (pendingUsdt, pendingEth);
    }

    function ableToHarvestReward(address _user) public view returns (bool) {
        UserInfo storage user = userInfo[_user];
        (uint256 usdtAmount, ) = pendingReward(_user);
        if(block.timestamp > user.depositTime.add(requiredTimeForReward) && usdtAmount > 0){
            return true;
        }else
            return false;
    }

    function _updatePool() internal {
        if (block.timestamp <= lastRewardTime) {
            return;
        }

        if (totalStakedAmount == 0) {
            lastRewardTime = block.timestamp;
            return;
        }
        
        uint256 multiplier = block.timestamp.sub(lastRewardTime);
        uint256 usdtReward = multiplier.mul(limitRewardUsdtPerSecond);
        if(usdtReward > amountUsdtForReward){
            usdtReward = amountUsdtForReward;
        }
        currentUsdtPerSecond = usdtReward.div(multiplier);

        accUsdtPerShare = accUsdtPerShare.add(usdtReward.mul(PRECISION_FACTOR).div(totalStakedAmount));
        amountUsdtForReward = amountUsdtForReward.sub(usdtReward);
        totalRewardUsdtDistributed = totalRewardUsdtDistributed.add(usdtReward);

        // ETH reflection
        uint256 additionEthReflection = address(this).balance.sub(lastEthBalance);
        amountEthForReward = amountEthForReward.add(additionEthReflection);
        lastEthBalance = address(this).balance;

        accEthPerShare = accEthPerShare.add(amountEthForReward.mul(PRECISION_FACTOR).div(totalStakedAmount));
        totalRewardEthDistributed = totalRewardEthDistributed.add(amountEthForReward);
        currentEthPerSecond = amountEthForReward.div(multiplier);
        amountEthForReward = 0;

        lastRewardTime = block.timestamp;
    }
}


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

    IUniswapV2Router02 public uniswapV2Router;
    address public uniswapV2Pair;

    bool private swapping;

    uint256 public _liquidityFee;
    uint256 public _ethReflectionFee;
    uint256 public _stakingFee;
    uint256 public _marketingFee;

    // exlcude from fees and max transaction amount
    mapping (address => bool) public _isFeesExempt;
    mapping (address => bool) public _isDividendExempt;
    mapping (address => bool) public _isMaxPerWalletExempt;
    mapping (address => bool) public _isMaxBuyExempt;
    mapping (address => bool) public isInBlacklist;

    mapping (address => uint256) public _lastSellingTime;

    uint256 private _totalSupply = 69000000000 * (10**18);
    uint256 public numTokensSellToAddToLiquidity = _totalSupply / 10000;
    uint256 public numMaxPerWalletPercent = 15; // 1.5%
    uint256 public numMaxPerBuyPercent = 1; // 0.1%
    uint256 public maxrouterpercent = 10;

    

    bool inSwapAndLiquify;
    bool public swapAndLiquifyEnabled = true;
    bool public maxrouterlimitenabled = true;

    DividendDistributor public distributor;
    uint256 distributorGas = 300000;

    Staking public staking;

    address public marketingWallet = 0xa6b441E882c02f665afCA7650FA1F228232C166E;
    address public developmentWallet = 0x93eEFc4862D0f2d1b131221808713392c96CFD28;

    modifier lockTheSwap {
        inSwapAndLiquify = true;
        _;
        inSwapAndLiquify = false;
    }

    constructor () ERC20("BuffettBank", "BBANK") {

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);

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

        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
        
        distributor = new DividendDistributor();
        setDistributionCriteria(3600, _totalSupply/10000);

        staking = new Staking();
        staking.transferOwnership(owner());

        updateTaxFees(15, 65, 0, 30);

        setIsFeeExempt(owner(), true);
        setIsFeeExempt(address(this), true);
        setIsFeeExempt(address(staking), true);

        setMaxPerWalletExempt(address(this), true);
        setMaxPerWalletExempt(address(uniswapV2Pair), true);
        setMaxPerWalletExempt(owner(), true);
        setMaxPerWalletExempt(address(staking), true);

        setIsDividendExempt(address(this), true);
        setIsDividendExempt(uniswapV2Pair, true);

        _mint(owner(), _totalSupply);
    }

    receive() external payable {}

    function setMarketingWallet(address _marketingWallet) external onlyOwner() {
        require(_marketingWallet != address(0), "Marketing wallet can't be the zero address");
        marketingWallet = _marketingWallet;
    }

    function setDevelopmentgWallet(address _developmentWallet) external onlyOwner() {
        require(_developmentWallet != address(0), "Development wallet can't be the zero address");
        developmentWallet = _developmentWallet;
    }
    
    function setMaxPerWalletPercent(uint256 _percentTime10) public onlyOwner {
        require(_percentTime10 >= 10, "Minimum is 1%");
        numMaxPerWalletPercent = _percentTime10;
    }

    function setRouterSellLimitpercent(uint256 amount) public onlyOwner() {
        maxrouterpercent = amount;
    }

    function setMaxPerBuyPercent(uint256 _percentTime10) public onlyOwner {
        require(_percentTime10 >= 1, "Minimum is 0.1%");
        numMaxPerBuyPercent = _percentTime10;
    }

    function setMaxPerWalletExempt(address account, bool exempt) public onlyOwner {
        _isMaxPerWalletExempt[account] = exempt;
    }

    function setMaxPerBuyExempt(address account, bool exempt) public onlyOwner {
        _isMaxBuyExempt[account] = exempt;
    }

    function setIsFeeExempt(address account, bool exempt) public onlyOwner {
        _isFeesExempt[account] = exempt;
    }

    function setIsDividendExempt(address account, bool exempt) public onlyOwner() {
        _isDividendExempt[account] = exempt;
        if(exempt){
            distributor.setShare(account, 0);
        }else {
            distributor.setShare(account, balanceOf(account));
        }
    }

    function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner {
        swapAndLiquifyEnabled = _enabled;
    }

    function setmaxrouterlimitenabled(bool _enabled) public onlyOwner {
        maxrouterlimitenabled = _enabled;
    }

    function manualswap() external lockTheSwap  onlyOwner() {
        uint256 contractBalance = balanceOf(address(this));
        swapTokensForEth(contractBalance);
    }

    function manualsend() external onlyOwner() {
        uint256 amount = address(this).balance;

        uint256 ethMarketing = amount.mul(7).div(10);
        uint256 ethDev = amount.mul(3).div(10);

        //Send out fees
        if(ethDev > 0)
            payable(developmentWallet).transfer(ethDev);
        if(ethMarketing > 0)
            payable(marketingWallet).transfer(ethMarketing);
    }

    function manualswapcustom(uint256 percentage) external lockTheSwap  onlyOwner() {
        uint256 contractBalance = balanceOf(address(this));
        uint256 swapbalance = contractBalance.div(10**5).mul(percentage);
        swapTokensForEth(swapbalance);
    }
    function setBlacklistWallet(address account, bool blacklisted) public onlyOwner {
        isInBlacklist[account] = blacklisted;
    }

    function updateTaxFees(uint256 _liquid, uint256 _ethReflection, uint256 _staking, uint256 _marketing) public onlyOwner {
        require(_liquid + _ethReflection + _staking + _marketing <= 900, "Total tax must less then 90");
        _liquidityFee = _liquid;
        _ethReflectionFee = _ethReflection;
        _stakingFee = _staking;
        _marketingFee = _marketing;
    }

    function getUnpaidEth(address account)  public view returns (uint256){
        return distributor.getUnpaidEarnings(account);
    }

    function getLastTimeClaim(address account)  public view returns (uint256){
        return distributor.getLastTimeClaim(account);
    }

    function claimEthReward() public {
        distributor.claimDividend(msg.sender);
    }

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {

        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(isInBlacklist[from] == false, "You're in blacklist");

        // Check max buy amount
        if(from == address(uniswapV2Pair) && !_isMaxBuyExempt[to]){
            require(amount <= _totalSupply.mul(numMaxPerBuyPercent).div(1000), "Check max per buy percent");
        }

        if(from != owner() && from != address(this) && to == address(uniswapV2Pair)){
            require(block.timestamp >= _lastSellingTime[from].add(1 hours), "Only sell once ");
            _lastSellingTime[from] = block.timestamp;
        }

        if(from == address(uniswapV2Pair)){
            distributor.notifyJustBuyRecently(to);
        }

        bool swapped = false;
        uint256 contractTokenBalance = balanceOf(address(this));
        bool overMinTokenBalance = contractTokenBalance >= numTokensSellToAddToLiquidity;
        if (
            overMinTokenBalance &&
            !inSwapAndLiquify &&
            from != uniswapV2Pair &&
            swapAndLiquifyEnabled
        ) {
            //add liquidity
            swapAndSend();
            swapped = true;
        }

        bool takeFee = true;
        if(_isFeesExempt[from] || _isFeesExempt[to]) {
            takeFee = false;
        }

        if(takeFee) {
        	uint256 fees = amount.mul(_liquidityFee.add(_ethReflectionFee).add(_stakingFee).add(_marketingFee)).div(1000);
        	amount = amount.sub(fees);
            super._transfer(from, address(this), fees);
        }

        if(!_isMaxPerWalletExempt[to]){
            require(balanceOf(to).add(amount) <= _totalSupply.mul(numMaxPerWalletPercent).div(1000), "Check max per wallet percent");
        }

        super._transfer(from, to, amount);

        if(!_isDividendExempt[from]){ try distributor.setShare(from, balanceOf(from)) {} catch {} }
        if(!_isDividendExempt[to]){ try distributor.setShare(to, balanceOf(to)) {} catch {} }

        if(!swapped)
            try distributor.process(distributorGas) {} catch {}
    }

    function swapAndSend() private lockTheSwap {
        uint256 contractTokenBalance = balanceOf(address(this));
        
        uint256 maxroutersell = _totalSupply.div(1000).mul(maxrouterpercent);

        if(contractTokenBalance > maxroutersell && maxrouterlimitenabled) {
          contractTokenBalance = contractTokenBalance.div(10);
        }
        
        uint256 _totalFee = _liquidityFee.add(_ethReflectionFee).add(_stakingFee).add(_marketingFee);

        uint256 amountForLiquidity = contractTokenBalance.mul(_liquidityFee).div(_totalFee);
        uint256 amountForEthReflection = contractTokenBalance.mul(_ethReflectionFee).div(_totalFee);
        uint256 amountForStaking = contractTokenBalance.mul(_stakingFee).div(_totalFee);
        uint256 amountForMarketingAndDev = contractTokenBalance.sub(amountForLiquidity).sub(amountForEthReflection).sub(amountForStaking);

        // split the contract balance into halves
        uint256 half = amountForLiquidity.div(2);
        uint256 otherHalf = amountForLiquidity.sub(half);

        // swap
        uint256 swapAmount = half.add(amountForEthReflection).add(amountForStaking).add(amountForMarketingAndDev);
        swapTokensForEth(swapAmount);
        uint256 ethBalance = address(this).balance;

        // send out
        uint256 ethLiquid = ethBalance.mul(half).div(swapAmount);
        uint256 ethReflection = ethBalance.mul(amountForEthReflection).div(swapAmount);
        uint256 ethStaking = ethBalance.mul(amountForStaking).div(swapAmount);
        uint256 ethMarketingAndDev = ethBalance.sub(ethLiquid).sub(ethReflection).sub(ethStaking);

        if(ethMarketingAndDev > 0){
            payable(marketingWallet).transfer(ethMarketingAndDev.mul(70).div(100));
            payable(developmentWallet).transfer(ethMarketingAndDev.mul(30).div(100));
        }

        if(ethReflection > 0)
            try distributor.deposit{value: ethReflection}() {} catch {}
        
        if(ethStaking > 0){
            try staking.distributeUsdtToStaking{value: ethStaking}() {} catch {}
        }

        if(ethLiquid > 0)
            addLiquidity(otherHalf, ethLiquid);
    }

    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 addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

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

}

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":"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"onOwnershipTransferred","type":"event"},{"inputs":[],"name":"_ethReflectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isDividendExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isFeesExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isMaxBuyExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isMaxPerWalletExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_lastSellingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_liquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_marketingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_stakingFee","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimEthReward","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":"developmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"contract DividendDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLastTimeClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getUnpaidEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isInBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualsend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualswap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage","type":"uint256"}],"name":"manualswapcustom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxrouterlimitenabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxrouterpercent","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":"numMaxPerBuyPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numMaxPerWalletPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numTokensSellToAddToLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"blacklisted","type":"bool"}],"name":"setBlacklistWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_developmentWallet","type":"address"}],"name":"setDevelopmentgWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minTokenForReceiveReward","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsDividendExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setMaxPerBuyExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentTime10","type":"uint256"}],"name":"setMaxPerBuyPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setMaxPerWalletExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentTime10","type":"uint256"}],"name":"setMaxPerWalletPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRouterSellLimitpercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setmaxrouterlimitenabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"staking","outputs":[{"internalType":"contract Staking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapAndLiquifyEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"uint256","name":"_liquid","type":"uint256"},{"internalType":"uint256","name":"_ethReflection","type":"uint256"},{"internalType":"uint256","name":"_staking","type":"uint256"},{"internalType":"uint256","name":"_marketing","type":"uint256"}],"name":"updateTaxFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526bdef376571332906a8800000060125561271060125462000026919062000a7a565b601355600f6014556001601555600a601655601780546201010062ffff0019909116179055620493e0601855601a80546001600160a01b031990811673a6b441e882c02f665afca7650fa1f228232c166e17909155601b80549091167393eefc4862d0f2d1b131221808713392c96cfd28179055348015620000a757600080fd5b50604080518082018252600b81526a4275666665747442616e6b60a81b6020808301918252835180850190945260058452644242414e4b60d81b908401528151919291620000f8916003916200096a565b5080516200010e9060049060208401906200096a565b50506005805433610100026001600160a81b0319909116176012179055506040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d91600091839163c45a0155916004808301926020929190829003018186803b1580156200017d57600080fd5b505afa15801562000192573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b8919062000a2c565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200020157600080fd5b505afa15801562000216573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200023c919062000a2c565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200028557600080fd5b505af11580156200029a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002c0919062000a2c565b600680546001600160a01b038086166001600160a01b03199283161790925560078054928416929091169190911790556040519091506200030190620009f9565b604051809103906000f0801580156200031e573d6000803e3d6000fd5b50601760036101000a8154816001600160a01b0302191690836001600160a01b0316021790555062000364610e106127106012546200035e919062000a7a565b6200053f565b604051620003729062000a07565b604051809103906000f0801580156200038f573d6000803e3d6000fd5b50601980546001600160a01b0319166001600160a01b0392909216918217905563f2fde38b620003cc60055461010090046001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200040e57600080fd5b505af115801562000423573d6000803e3d6000fd5b505050506200043f600f60416000601e620005ce60201b60201c565b620004636200045b60055461010090046001600160a01b031690565b60016200067c565b620004703060016200067c565b60195462000489906001600160a01b031660016200067c565b62000496306001620006c4565b600754620004af906001600160a01b03166001620006c4565b620004d3620004cb60055461010090046001600160a01b031690565b6001620006c4565b601954620004ec906001600160a01b03166001620006c4565b620004f93060016200070c565b60075462000512906001600160a01b031660016200070c565b620005376200052e60055461010090046001600160a01b031690565b60125462000804565b505062000ad8565b60055461010090046001600160a01b031633146200055c57600080fd5b6017546040516316a4744b60e11b8152600481018490526024810183905263010000009091046001600160a01b031690632d48e896906044015b600060405180830381600087803b158015620005b157600080fd5b505af1158015620005c6573d6000803e3d6000fd5b505050505050565b60055461010090046001600160a01b03163314620005eb57600080fd5b6103848183620005fc868862000a55565b62000608919062000a55565b62000614919062000a55565b1115620006685760405162461bcd60e51b815260206004820152601b60248201527f546f74616c20746178206d757374206c657373207468656e203930000000000060448201526064015b60405180910390fd5b600893909355600991909155600a55600b55565b60055461010090046001600160a01b031633146200069957600080fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b60055461010090046001600160a01b03163314620006e157600080fd5b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b60055461010090046001600160a01b031633146200072957600080fd5b6001600160a01b0382166000908152600d60205260409020805460ff191682158015919091179091556200079957601754604051630a5b654b60e11b81526001600160a01b038481166004830152600060248301526301000000909204909116906314b6ca969060440162000596565b601754630100000090046001600160a01b03166314b6ca9683620007d2816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015260440162000596565b6001600160a01b0382166200085c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200065f565b62000878816002546200090060201b620015aa1790919060201c565b6002556001600160a01b03821660009081526020818152604090912054620008ab918390620015aa62000900821b17901c565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6000806200090f838562000a55565b905083811015620009635760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016200065f565b9392505050565b828054620009789062000a9b565b90600052602060002090601f0160209004810192826200099c5760008555620009e7565b82601f10620009b757805160ff1916838001178555620009e7565b82800160010185558215620009e7579182015b82811115620009e7578251825591602001919060010190620009ca565b50620009f592915062000a15565b5090565b610dc080620034f383390190565b611a0680620042b383390190565b5b80821115620009f5576000815560010162000a16565b60006020828403121562000a3e578081fd5b81516001600160a01b038116811462000963578182fd5b6000821982111562000a7557634e487b7160e01b81526011600452602481fd5b500190565b60008262000a9657634e487b7160e01b81526012600452602481fd5b500490565b600181811c9082168062000ab057607f821691505b6020821081141562000ad257634e487b7160e01b600052602260045260246000fd5b50919050565b612a0b8062000ae86000396000f3fe60806040526004361061036f5760003560e01c806375f0a874116101c6578063bfe10928116100f7578063d12a768811610095578063eace0e011161006f578063eace0e0114610a2a578063ed2cdab714610a5a578063f2fde38b14610a8a578063f708a64f14610aaa57600080fd5b8063d12a7688146109ae578063d14d1e95146109c4578063dd62ed3e146109e457600080fd5b8063c2f0263f116100d1578063c2f0263f1461091c578063c3c8cd8014610949578063c49b9a801461095e578063cc4c2e791461097e57600080fd5b8063bfe10928146108b5578063c04a5414146108dc578063c0e56afe146108fc57600080fd5b80639caf9b0011610164578063a9059cbb1161013e578063a9059cbb1461083a578063ae8502811461085a578063b2bdfa7b14610870578063b41c9eda1461089557600080fd5b80639caf9b00146107d5578063a0a0c46514610805578063a457c2d71461081a57600080fd5b806389e7b81b116101a057806389e7b81b1461075d5780638da5cb5b1461077d57806395d89b41146107a057806396cc6c06146107b557600080fd5b806375f0a874146107075780637bcd8ab814610727578063878d5e421461073d57600080fd5b806349bd5a5e116102a05780635d098b381161023e5780636a44a0e2116102185780636a44a0e21461068c5780636bc87c3a146106bc5780636fc3eaec146106d257806370a08231146106e757600080fd5b80635d098b381461062c5780635f88bd2d1461064c578063658d4b7f1461066c57600080fd5b80634ebcce451161027a5780634ebcce45146105b6578063519d216a146105cc5780635b3bf3b9146105ec5780635bc0c7ca1461060c57600080fd5b806349bd5a5e146105575780634a74bb02146105775780634cf088d91461059657600080fd5b806323b872dd1161030d578063313ce567116102e7578063313ce567146104df5780633817d9211461050157806338e8c57214610517578063395093511461053757600080fd5b806323b872dd1461047f57806326c1f69a1461049f5780632d48e896146104bf57600080fd5b806316426a2e1161034957806316426a2e146103f85780631694505e1461041c57806318160ddd1461045457806322976e0d1461046957600080fd5b806302a503be1461037b57806306fdde031461039d578063095ea7b3146103c857600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5061039b610396366004612618565b610aca565b005b3480156103a957600080fd5b506103b2610b11565b6040516103bf9190612740565b60405180910390f35b3480156103d457600080fd5b506103e86103e336600461264c565b610ba3565b60405190151581526020016103bf565b34801561040457600080fd5b5061040e60145481565b6040519081526020016103bf565b34801561042857600080fd5b5060065461043c906001600160a01b031681565b6040516001600160a01b0390911681526020016103bf565b34801561046057600080fd5b5060025461040e565b34801561047557600080fd5b5061040e600b5481565b34801561048b57600080fd5b506103e861049a3660046125d8565b610bba565b3480156104ab57600080fd5b5061039b6104ba366004612691565b610c23565b3480156104cb57600080fd5b5061039b6104da3660046126c1565b610c8a565b3480156104eb57600080fd5b5060055460405160ff90911681526020016103bf565b34801561050d57600080fd5b5061040e60095481565b34801561052357600080fd5b5061039b610532366004612618565b610d16565b34801561054357600080fd5b506103e861055236600461264c565b610d5d565b34801561056357600080fd5b5060075461043c906001600160a01b031681565b34801561058357600080fd5b506017546103e890610100900460ff1681565b3480156105a257600080fd5b5060195461043c906001600160a01b031681565b3480156105c257600080fd5b5061040e60165481565b3480156105d857600080fd5b5061040e6105e7366004612568565b610d93565b3480156105f857600080fd5b5061039b61060736600461270f565b610e19565b34801561061857600080fd5b5061039b610627366004612568565b610eba565b34801561063857600080fd5b5061039b610647366004612568565b610f63565b34801561065857600080fd5b506017546103e89062010000900460ff1681565b34801561067857600080fd5b5061039b610687366004612618565b61100a565b34801561069857600080fd5b506103e86106a7366004612568565b600f6020526000908152604090205460ff1681565b3480156106c857600080fd5b5061040e60085481565b3480156106de57600080fd5b5061039b611051565b3480156106f357600080fd5b5061040e610702366004612568565b611125565b34801561071357600080fd5b50601a5461043c906001600160a01b031681565b34801561073357600080fd5b5061040e60155481565b34801561074957600080fd5b5061039b610758366004612691565b611140565b34801561076957600080fd5b5061039b610778366004612691565b6111a4565b34801561078957600080fd5b5060055461010090046001600160a01b031661043c565b3480156107ac57600080fd5b506103b261120f565b3480156107c157600080fd5b5061039b6107d0366004612691565b61121e565b3480156107e157600080fd5b506103e86107f0366004612568565b60106020526000908152604090205460ff1681565b34801561081157600080fd5b5061039b61123f565b34801561082657600080fd5b506103e861083536600461264c565b61129e565b34801561084657600080fd5b506103e861085536600461264c565b6112ed565b34801561086657600080fd5b5061040e600a5481565b34801561087c57600080fd5b5060055461043c9061010090046001600160a01b031681565b3480156108a157600080fd5b5061039b6108b0366004612618565b6112fa565b3480156108c157600080fd5b5060175461043c90630100000090046001600160a01b031681565b3480156108e857600080fd5b50601b5461043c906001600160a01b031681565b34801561090857600080fd5b5061039b610917366004612677565b611341565b34801561092857600080fd5b5061040e610937366004612568565b60116020526000908152604090205481565b34801561095557600080fd5b5061039b611379565b34801561096a57600080fd5b5061039b610979366004612677565b6113c7565b34801561098a57600080fd5b506103e8610999366004612568565b600d6020526000908152604090205460ff1681565b3480156109ba57600080fd5b5061040e60135481565b3480156109d057600080fd5b5061040e6109df366004612568565b6113fd565b3480156109f057600080fd5b5061040e6109ff3660046125a0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a3657600080fd5b506103e8610a45366004612568565b600e6020526000908152604090205460ff1681565b348015610a6657600080fd5b506103e8610a75366004612568565b600c6020526000908152604090205460ff1681565b348015610a9657600080fd5b5061039b610aa5366004612568565b611437565b348015610ab657600080fd5b5061039b610ac5366004612618565b6114cd565b60055461010090046001600160a01b03163314610ae657600080fd5b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b606060038054610b20906128f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4c906128f9565b8015610b995780601f10610b6e57610100808354040283529160200191610b99565b820191906000526020600020905b815481529060010190602001808311610b7c57829003601f168201915b5050505050905090565b6000610bb0338484611610565b5060015b92915050565b6000610bc7848484611735565b610c198433610c1485604051806060016040528060288152602001612989602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611d8c565b611610565b5060019392505050565b60055461010090046001600160a01b03163314610c3f57600080fd5b600a811015610c855760405162461bcd60e51b815260206004820152600d60248201526c4d696e696d756d20697320312560981b60448201526064015b60405180910390fd5b601455565b60055461010090046001600160a01b03163314610ca657600080fd5b6017546040516316a4744b60e11b8152600481018490526024810183905263010000009091046001600160a01b031690632d48e896906044015b600060405180830381600087803b158015610cfa57600080fd5b505af1158015610d0e573d6000803e3d6000fd5b505050505050565b60055461010090046001600160a01b03163314610d3257600080fd5b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610bb0918590610c1490866115aa565b6017546040516328ce90b560e11b81526001600160a01b03838116600483015260009263010000009004169063519d216a906024015b60206040518083038186803b158015610de157600080fd5b505afa158015610df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb491906126a9565b60055461010090046001600160a01b03163314610e3557600080fd5b6103848183610e44868861288b565b610e4e919061288b565b610e58919061288b565b1115610ea65760405162461bcd60e51b815260206004820152601b60248201527f546f74616c20746178206d757374206c657373207468656e20393000000000006044820152606401610c7c565b600893909355600991909155600a55600b55565b60055461010090046001600160a01b03163314610ed657600080fd5b6001600160a01b038116610f415760405162461bcd60e51b815260206004820152602c60248201527f446576656c6f706d656e742077616c6c65742063616e2774206265207468652060448201526b7a65726f206164647265737360a01b6064820152608401610c7c565b601b80546001600160a01b0319166001600160a01b0392909216919091179055565b60055461010090046001600160a01b03163314610f7f57600080fd5b6001600160a01b038116610fe85760405162461bcd60e51b815260206004820152602a60248201527f4d61726b6574696e672077616c6c65742063616e277420626520746865207a65604482015269726f206164647265737360b01b6064820152608401610c7c565b601a80546001600160a01b0319166001600160a01b0392909216919091179055565b60055461010090046001600160a01b0316331461102657600080fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b60055461010090046001600160a01b0316331461106d57600080fd5b476000611086600a611080846007611dc3565b90611e42565b9050600061109a600a611080856003611dc3565b905080156110de57601b546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156110dc573d6000803e3d6000fd5b505b811561112057601a546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561111e573d6000803e3d6000fd5b505b505050565b6001600160a01b031660009081526020819052604090205490565b60055461010090046001600160a01b0316331461115c57600080fd5b600181101561119f5760405162461bcd60e51b815260206004820152600f60248201526e4d696e696d756d20697320302e312560881b6044820152606401610c7c565b601555565b60178054600160ff1990911617905560055461010090046001600160a01b031633146111cf57600080fd5b60006111da30611125565b905060006111f5836111ef84620186a0611e42565b90611dc3565b905061120081611e9d565b50506017805460ff1916905550565b606060048054610b20906128f9565b60055461010090046001600160a01b0316331461123a57600080fd5b601655565b601754604051630afbf02f60e11b815233600482015263010000009091046001600160a01b0316906315f7e05e90602401600060405180830381600087803b15801561128a57600080fd5b505af115801561111e573d6000803e3d6000fd5b6000610bb03384610c14856040518060600160405280602581526020016129b1602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611d8c565b6000610bb0338484611735565b60055461010090046001600160a01b0316331461131657600080fd5b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b60055461010090046001600160a01b0316331461135d57600080fd5b60178054911515620100000262ff000019909216919091179055565b60178054600160ff1990911617905560055461010090046001600160a01b031633146113a457600080fd5b60006113af30611125565b90506113ba81611e9d565b506017805460ff19169055565b60055461010090046001600160a01b031633146113e357600080fd5b601780549115156101000261ff0019909216919091179055565b60175460405163051fa63360e31b81526001600160a01b0383811660048301526000926301000000900416906328fd319890602401610dc9565b60055461010090046001600160a01b0316331461145357600080fd5b6001600160a01b03811661146657600080fd5b6005546040516001600160a01b0380841692610100900416907f2e3feca4334579203cd183fe1ced9524940047e5586fe13e8cc5dd1babaf6e8290600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60055461010090046001600160a01b031633146114e957600080fd5b6001600160a01b0382166000908152600d60205260409020805460ff1916821580159190911790915561155757601754604051630a5b654b60e11b81526001600160a01b038481166004830152600060248301526301000000909204909116906314b6ca9690604401610ce0565b601754630100000090046001600160a01b03166314b6ca968361157981611125565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610ce0565b6000806115b7838561288b565b9050838110156116095760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c7c565b9392505050565b6001600160a01b0383166116725760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c7c565b6001600160a01b0382166116d35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c7c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661175b5760405162461bcd60e51b8152600401610c7c906127d6565b6001600160a01b0382166117815760405162461bcd60e51b8152600401610c7c90612793565b600081116117e35760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610c7c565b6001600160a01b03831660009081526010602052604090205460ff16156118425760405162461bcd60e51b8152602060048201526013602482015272165bdd49dc99481a5b88189b1858dadb1a5cdd606a1b6044820152606401610c7c565b6007546001600160a01b03848116911614801561187857506001600160a01b0382166000908152600f602052604090205460ff16155b156118e95761189a6103e8611080601554601254611dc390919063ffffffff16565b8111156118e95760405162461bcd60e51b815260206004820152601960248201527f436865636b206d617820706572206275792070657263656e74000000000000006044820152606401610c7c565b6005546001600160a01b03848116610100909204161480159061191557506001600160a01b0383163014155b801561192e57506007546001600160a01b038381169116145b156119b5576001600160a01b03831660009081526011602052604090205461195890610e106115aa565b4210156119995760405162461bcd60e51b815260206004820152600f60248201526e027b7363c9039b2b6361037b731b29608d1b6044820152606401610c7c565b6001600160a01b03831660009081526011602052604090204290555b6007546001600160a01b0384811691161415611a3357601754604051636c8e777560e01b81526001600160a01b038481166004830152630100000090920490911690636c8e777590602401600060405180830381600087803b158015611a1a57600080fd5b505af1158015611a2e573d6000803e3d6000fd5b505050505b600080611a3f30611125565b60135490915081108015908190611a59575060175460ff16155b8015611a7357506007546001600160a01b03878116911614155b8015611a865750601754610100900460ff165b15611a9857611a93611fec565b600192505b6001600160a01b0386166000908152600c602052604090205460019060ff1680611ada57506001600160a01b0386166000908152600c602052604090205460ff165b15611ae3575060005b8015611b3f576000611b246103e8611080611b1d600b54611b17600a54611b176009546008546115aa90919063ffffffff16565b906115aa565b8990611dc3565b9050611b308682612304565b9550611b3d883083612360565b505b6001600160a01b0386166000908152600e602052604090205460ff16611bd757611b7c6103e8611080601454601254611dc390919063ffffffff16565b611b8986611b1789611125565b1115611bd75760405162461bcd60e51b815260206004820152601c60248201527f436865636b206d6178207065722077616c6c65742070657263656e74000000006044820152606401610c7c565b611be2878787612360565b6001600160a01b0387166000908152600d602052604090205460ff16611c7d57601754630100000090046001600160a01b03166314b6ca9688611c2481611125565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611c6a57600080fd5b505af1925050508015611c7b575060015b505b6001600160a01b0386166000908152600d602052604090205460ff16611d1857601754630100000090046001600160a01b03166314b6ca9687611cbf81611125565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611d0557600080fd5b505af1925050508015611d16575060015b505b83611d83576017546018546040516001624d3b8760e01b03198152600481019190915263010000009091046001600160a01b03169063ffb2c47990602401600060405180830381600087803b158015611d7057600080fd5b505af1925050508015611d81575060015b505b50505050505050565b60008184841115611db05760405162461bcd60e51b8152600401610c7c9190612740565b50611dbb83856128e2565b949350505050565b600082611dd257506000610bb4565b6000611dde83856128c3565b905082611deb85836128a3565b146116095760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c7c565b6000808211611e935760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610c7c565b61160982846128a3565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611ee057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015611f3457600080fd5b505afa158015611f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6c9190612584565b81600181518110611f8d57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654611fb39130911684611610565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790610ce090859060009086903090429060040161281b565b6017805460ff19166001179055600061200430611125565b905060006120256016546111ef6103e8601254611e4290919063ffffffff16565b9050808211801561203e575060175462010000900460ff165b156120515761204e82600a611e42565b91505b6000612076600b54611b17600a54611b176009546008546115aa90919063ffffffff16565b905060006120938261108060085487611dc390919063ffffffff16565b905060006120b08361108060095488611dc390919063ffffffff16565b905060006120cd84611080600a5489611dc390919063ffffffff16565b905060006120e7826120e185818b89612304565b90612304565b905060006120f6856002611e42565b905060006121048683612304565b9050600061211884611b178781878b6115aa565b905061212381611e9d565b476000612134836110808488611dc3565b9050600061214684611080858c611dc3565b9050600061215885611080868c611dc3565b9050600061216c826120e185818989612304565b9050801561220557601a546001600160a01b03166108fc6121936064611080856046611dc3565b6040518115909202916000818181858888f193505050501580156121bb573d6000803e3d6000fd5b50601b546001600160a01b03166108fc6121db606461108085601e611dc3565b6040518115909202916000818181858888f19350505050158015612203573d6000803e3d6000fd5b505b821561226f57601760039054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561225b57600080fd5b505af19350505050801561226d575060015b505b81156122d957601960009054906101000a90046001600160a01b03166001600160a01b031663eb41d3af836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122c557600080fd5b505af1935050505080156122d7575060015b505b83156122e9576122e98785612469565b50506017805460ff1916905550505050505050505050505050565b6000828211156123565760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610c7c565b61160982846128e2565b6001600160a01b0383166123865760405162461bcd60e51b8152600401610c7c906127d6565b6001600160a01b0382166123ac5760405162461bcd60e51b8152600401610c7c90612793565b6123e981604051806060016040528060268152602001612963602691396001600160a01b0386166000908152602081905260409020549190611d8c565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461241890826115aa565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611728565b6006546124819030906001600160a01b031684611610565b6006546001600160a01b031663f305d7198230856000806124b06005546001600160a01b036101009091041690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b15801561251357600080fd5b505af1158015612527573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061254c91906126e2565b5050505050565b8035801515811461256357600080fd5b919050565b600060208284031215612579578081fd5b81356116098161294a565b600060208284031215612595578081fd5b81516116098161294a565b600080604083850312156125b2578081fd5b82356125bd8161294a565b915060208301356125cd8161294a565b809150509250929050565b6000806000606084860312156125ec578081fd5b83356125f78161294a565b925060208401356126078161294a565b929592945050506040919091013590565b6000806040838503121561262a578182fd5b82356126358161294a565b915061264360208401612553565b90509250929050565b6000806040838503121561265e578182fd5b82356126698161294a565b946020939093013593505050565b600060208284031215612688578081fd5b61160982612553565b6000602082840312156126a2578081fd5b5035919050565b6000602082840312156126ba578081fd5b5051919050565b600080604083850312156126d3578182fd5b50508035926020909101359150565b6000806000606084860312156126f6578283fd5b8351925060208401519150604084015190509250925092565b60008060008060808587031215612724578081fd5b5050823594602084013594506040840135936060013592509050565b6000602080835283518082850152825b8181101561276c57858101830151858201604001528201612750565b8181111561277d5783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561286a5784516001600160a01b031683529383019391830191600101612845565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561289e5761289e612934565b500190565b6000826128be57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156128dd576128dd612934565b500290565b6000828210156128f4576128f4612934565b500390565b600181811c9082168061290d57607f821691505b6020821081141561292e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461295f57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220cad3cfed1e0a823c6c658f8aef56d87a50c3fa4c0ab117a4ffaa5deef3ab21f864736f6c6343000804003360806040526ec097ce7bc90715b34b9f1000000000600a55610e10600b5534801561002957600080fd5b50600080546001600160a01b03191633179055610d758061004b6000396000f3fe6080604052600436106101185760003560e01c80636c8e7775116100a0578063d4fda1f211610064578063d4fda1f214610326578063e2d2e21914610353578063efca2eed14610369578063ffb2c4791461037f578063ffd49c841461039f57600080fd5b80636c8e777514610264578063997664d7146102845780639a31ab6d1461029a578063ce7c2ac2146102c7578063d0e30db01461031e57600080fd5b80632d48e896116100e75780632d48e896146101b55780633a98ef39146101d5578063519d216a146101eb5780635b3c74c01461022157806366817df51461023757600080fd5b806311ce023d1461012c57806314b6ca961461015557806315f7e05e1461017557806328fd31981461019557600080fd5b36610127576101256103b5565b005b600080fd5b34801561013857600080fd5b50610142600a5481565b6040519081526020015b60405180910390f35b34801561016157600080fd5b50610125610170366004610c3e565b6103f1565b34801561018157600080fd5b50610125610190366004610c24565b61056e565b3480156101a157600080fd5b506101426101b0366004610c24565b610588565b3480156101c157600080fd5b506101256101d0366004610c7f565b610611565b3480156101e157600080fd5b5061014260065481565b3480156101f757600080fd5b50610142610206366004610c24565b6001600160a01b031660009081526003602052604090205490565b34801561022d57600080fd5b50610142600c5481565b34801561024357600080fd5b50610142610252366004610c24565b60036020526000908152604090205481565b34801561027057600080fd5b5061012561027f366004610c24565b610633565b34801561029057600080fd5b5061014260075481565b3480156102a657600080fd5b506101426102b5366004610c24565b60046020526000908152604090205481565b3480156102d357600080fd5b506103036102e2366004610c24565b60056020526000908152604090208054600182015460029092015490919083565b6040805193845260208401929092529082015260600161014c565b6101256103b5565b34801561033257600080fd5b50610142610341366004610c24565b60026020526000908152604090205481565b34801561035f57600080fd5b5061014260095481565b34801561037557600080fd5b5061014260085481565b34801561038b57600080fd5b5061012561039a366004610c67565b610666565b3480156103ab57600080fd5b50610142600b5481565b6007546103c29034610782565b600755600654600a546103ec916103e3916103dd90346107ef565b9061086e565b60095490610782565b600955565b6000546001600160a01b0316331461040857600080fd5b6001600160a01b0382166000908152600560205260409020541561042f5761042f826108c9565b600c548190811080159061045957506001600160a01b038316600090815260056020526040902054155b156104c057600180546001600160a01b03851660008181526002602052604081208390558284018455929092527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b031916909117905550806104f2565b600c548210156104f257506001600160a01b038216600090815260056020526040812054156104f2576104f2836109d0565b6001600160a01b03831660009081526005602052604090205460065461052391839161051d91610b1b565b90610782565b6006556001600160a01b038316600090815260056020526040902081905561054a81610b77565b6001600160a01b039093166000908152600560205260409020600101929092555050565b61057781610b94565b1561058557610585816108c9565b50565b6001600160a01b0381166000908152600560205260408120546105ad57506000919050565b6001600160a01b0382166000908152600560205260408120546105cf90610b77565b6001600160a01b0384166000908152600560205260409020600101549091508082116105ff575060009392505050565b6106098282610b1b565b949350505050565b6000546001600160a01b0316331461062857600080fd5b600b91909155600c55565b6000546001600160a01b0316331461064a57600080fd5b6001600160a01b03166000908152600460205260409020429055565b6000546001600160a01b0316331461067d57600080fd5b60015480610689575050565b6000805a905060005b84831080156106a057508381105b1561077b5783600d54106106b4576000600d555b6106f46001600d54815481106106da57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b0316610b94565b15610739576107396001600d548154811061071f57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b03166108c9565b61074e6107475a8490610b1b565b8490610782565b92505a600d8054919350600061076383610d0e565b9190505550808061077390610d0e565b915050610692565b5050505050565b60008061078f8385610ca0565b9050838110156107e65760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b90505b92915050565b6000826107fe575060006107e9565b600061080a8385610cd8565b9050826108178583610cb8565b146107e65760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016107dd565b60008082116108bf5760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f00000000000060448201526064016107dd565b6107e68284610cb8565b6001600160a01b0381166000908152600560205260409020546108e95750565b60006108f482610588565b905080156109cc576000826001600160a01b031682610bb890604051600060405180830381858888f193505050503d806000811461094e576040519150601f19603f3d011682016040523d82523d6000602084013e610953565b606091505b5050905080156109ca5760085461096a9083610782565b6008556001600160a01b038316600090815260036020908152604080832042905560059091529020600201546109a09083610782565b6001600160a01b038416600090815260056020526040902060028101919091555461054a90610b77565b505b5050565b600180546109df908290610cf7565b815481106109fd57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0384811684526002909252604090922054600180549290931692918110610a4957634e487b7160e01b600052603260045260246000fd5b600091825260208083209190910180546001600160a01b0319166001600160a01b03948516179055918316815260029182905260408120546001805491939291610a94908290610cf7565b81548110610ab257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020556001805480610af657634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b031916905501905550565b600082821115610b6d5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f77000060448201526064016107dd565b6107e68284610cf7565b60006107e9600a546103dd600954856107ef90919063ffffffff16565b600b546001600160a01b03821660009081526003602052604081205490914291610bbe9190610ca0565b108015610bd357506000610bd183610588565b115b80156107e957506001600160a01b0382166000908152600460205260409020544290610c019061a8c0610ca0565b1092915050565b80356001600160a01b0381168114610c1f57600080fd5b919050565b600060208284031215610c35578081fd5b6107e682610c08565b60008060408385031215610c50578081fd5b610c5983610c08565b946020939093013593505050565b600060208284031215610c78578081fd5b5035919050565b60008060408385031215610c91578182fd5b50508035926020909101359150565b60008219821115610cb357610cb3610d29565b500190565b600082610cd357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615610cf257610cf2610d29565b500290565b600082821015610d0957610d09610d29565b500390565b6000600019821415610d2257610d22610d29565b5060010190565b634e487b7160e01b600052601160045260246000fdfea26469706673582212206ab89e9d0fb6c6660ca256b63c81c6ac4dacec171333046e7bf33ef301f3c09e64736f6c634300080400336080604052600380546001600160a01b03191673dac17f958d2ee523a2206206994597c13d831ec717905534801561003657600080fd5b5060008054336001600160a01b0319918216811783556001805560138054737a250d5630b4cf539739df2c5dacb4c659f2488d908416179055600280549092161790556ec097ce7bc90715b34b9f1000000000600d55614e2060065562278d00600b5542600c556119599081906100ad90396000f3fe6080604052600436106101bb5760003560e01c80639231cf74116100ec578063ccd34cd51161008a578063f137716411610064578063f1377164146104aa578063f2fde38b146104c0578063f40f0f52146104e0578063fc0c546a1461051557600080fd5b8063ccd34cd514610477578063db2e21bc1461048d578063eb41d3af146104a257600080fd5b8063b6b55f25116100c6578063b6b55f251461040b578063bae339801461042b578063c292933e14610441578063c54e44eb1461045757600080fd5b80639231cf74146103bf578063b1d03d76146103d5578063b2bdfa7b146103eb57600080fd5b80636b606cbf11610159578063888ba16811610133578063888ba168146103375780638aacd3611461034d5780638ae248991461036d5780638da5cb5b1461038d57600080fd5b80636b606cbf146102f55780636e6de2cc1461030b5780637c099f9d1461032157600080fd5b80633ccfd60b116101955780633ccfd60b1461029d57806341638fe8146102b45780634641257d146102ca578063567e98f9146102df57600080fd5b806307867b7d146101c75780631959a002146101f05780632bab047f1461026d57600080fd5b366101c257005b600080fd5b3480156101d357600080fd5b506101dd600a5481565b6040519081526020015b60405180910390f35b3480156101fc57600080fd5b5061024061020b366004611689565b601260205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909186565b604080519687526020870195909552938501929092526060840152608083015260a082015260c0016101e7565b34801561027957600080fd5b5061028d610288366004611689565b610535565b60405190151581526020016101e7565b3480156102a957600080fd5b506102b261059a565b005b3480156102c057600080fd5b506101dd60055481565b3480156102d657600080fd5b506102b2610862565b3480156102eb57600080fd5b506101dd600e5481565b34801561030157600080fd5b506101dd60065481565b34801561031757600080fd5b506101dd60105481565b34801561032d57600080fd5b506101dd600b5481565b34801561034357600080fd5b506101dd60095481565b34801561035957600080fd5b506102b26103683660046117a1565b610ad6565b34801561037957600080fd5b506102b26103883660046117a1565b610af2565b34801561039957600080fd5b506000546001600160a01b03165b6040516001600160a01b0390911681526020016101e7565b3480156103cb57600080fd5b506101dd600c5481565b3480156103e157600080fd5b506101dd60075481565b3480156103f757600080fd5b506000546103a7906001600160a01b031681565b34801561041757600080fd5b506102b26104263660046117a1565b610b1e565b34801561043757600080fd5b506101dd60045481565b34801561044d57600080fd5b506101dd600f5481565b34801561046357600080fd5b506003546103a7906001600160a01b031681565b34801561048357600080fd5b506101dd600d5481565b34801561049957600080fd5b506102b2610d5c565b6102b2610eb6565b3480156104b657600080fd5b506101dd60085481565b3480156104cc57600080fd5b506102b26104db366004611689565b61116b565b3480156104ec57600080fd5b506105006104fb366004611689565b6111f0565b604080519283526020830191909152016101e7565b34801561052157600080fd5b506002546103a7906001600160a01b031681565b6001600160a01b038116600090815260126020526040812081610557846111f0565b509050610573600b5483600101546113d390919063ffffffff16565b421180156105815750600081115b15610590575060019392505050565b5060009392505050565b600260015414156105c65760405162461bcd60e51b81526004016105bd9061183a565b60405180910390fd5b60026001553360009081526012602052604090206105e261143b565b600061062561061a8360020154610614600d5461060e600754886000015461155390919063ffffffff16565b906115d2565b9061162d565b6003840154906113d3565b9050600061065e6106538460040154610614600d5461060e600a54896000015461155390919063ffffffff16565b6005850154906113d3565b600254845460405163a9059cbb60e01b815233600482015260248101919091529192506001600160a01b03169063a9059cbb90604401602060405180830381600087803b1580156106ae57600080fd5b505af11580156106c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e69190611781565b50600b5460018401546106f8916113d3565b4211156107c957811561078b5760035460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561075157600080fd5b505af1158015610765573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107899190611781565b505b80156107c457604051339082156108fc029083906000818181858888f193505050501580156107be573d6000803e3d6000fd5b50476011555b6107ea565b6005546107d690836113d3565b6005556009546107e690826113d3565b6009555b8254600e546107f89161162d565b600e556000808455600184018190556002840181905560038401819055600484018190556005840181905560405190815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a250506001805550565b600260015414156108855760405162461bcd60e51b81526004016105bd9061183a565b6002600155336000908152601260205260409020600b5460018201546108aa916113d3565b42116108f85760405162461bcd60e51b815260206004820152601a60248201527f436865636b206c6f636b696e672074696d65207265717569726500000000000060448201526064016105bd565b61090061143b565b600061092c61061a8360020154610614600d5461060e600754886000015461155390919063ffffffff16565b90508015610a125760035460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b15801561098057600080fd5b505af1158015610994573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b89190611781565b5060006003830155600d5460075483546109d7929161060e9190611553565b600283015560405181815233907fc9695243a805adb74c91f28311176c65b417e842d5699893cef56d18bfa48cba9060200160405180910390a25b6000610a3e6106538460040154610614600d5461060e600a54896000015461155390919063ffffffff16565b90508015610acd57604051339082156108fc029083906000818181858888f19350505050158015610a73573d6000803e3d6000fd5b5060006005840155600d54600a548454610a92929161060e9190611553565b60048401554760115560405181815233907fc9695243a805adb74c91f28311176c65b417e842d5699893cef56d18bfa48cba90602001610851565b50506001805550565b6000546001600160a01b03163314610aed57600080fd5b600655565b6000546001600160a01b03163314610b0957600080fd5b6276a700811115610b1957600080fd5b600b55565b60026001541415610b415760405162461bcd60e51b81526004016105bd9061183a565b600260015533600090815260126020526040902081610ba25760405162461bcd60e51b815260206004820152601960248201527f43616e2774206465706f736974207a65726f20616d6f756e740000000000000060448201526064016105bd565b610baa61143b565b805415610c2057610be6610bdb8260020154610614600d5461060e600754876000015461155390919063ffffffff16565b6003830154906113d3565b60038201556004810154600d54600a548354610c1a93610c0f9390926106149261060e91611553565b6005830154906113d3565b60058201555b6000816001015411610c325742610c38565b80600101545b60018201558054610c4990836113d3565b81556002546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd90606401602060405180830381600087803b158015610c9d57600080fd5b505af1158015610cb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd59190611781565b50600e54610ce390836113d3565b600e55600d546007548254610cfd929161060e9190611553565b6002820155600d54600a548254610d19929161060e9190611553565b600482015560405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c906020015b60405180910390a2505060018055565b60026001541415610d7f5760405162461bcd60e51b81526004016105bd9061183a565b60026001908155336000908152601260205260408120805482825592810191909155600e54909190610db1908261162d565b600e55600060028301556003820154600554610dcc916113d3565b60059081556000600384018190556004840155820154600954610dee916113d3565b600955600060058301558015610e845760025460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b158015610e4a57600080fd5b505af1158015610e5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e829190611781565b505b60405181815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd969590602001610d4c565b6003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610efa57600080fd5b505afa158015610f0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3291906117b9565b60408051600280825260608201835292935060009290916020830190803683375050601354604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c464892506004808301926020929190829003018186803b158015610f9c57600080fd5b505afa158015610fb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd491906116a5565b81600081518110610ff557634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201015260035482519116908290600190811061103457634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152601354604051637ff36ab560e01b8152911690637ff36ab590349061107a906000908690309042906004016117d1565b6000604051808303818588803b15801561109357600080fd5b505af11580156110a7573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526110d091908101906116c1565b506003546040516370a0823160e01b81523060048201526000916111539185916001600160a01b0316906370a082319060240160206040518083038186803b15801561111b57600080fd5b505afa15801561112f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061061491906117b9565b60055490915061116390826113d3565b600555505050565b6000546001600160a01b0316331461118257600080fd5b6001600160a01b03811661119557600080fd5b600080546040516001600160a01b03808516939216917f2e3feca4334579203cd183fe1ced9524940047e5586fe13e8cc5dd1babaf6e8291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152601260205260408120600c5482919082908190421180156112215750600e5415155b1561136457600061123d600c544261162d90919063ffffffff16565b905060006112566006548361155390919063ffffffff16565b905060055481111561126757506005545b6000611290611287600e5461060e600d548661155390919063ffffffff16565b600754906113d3565b90506112c56112ba8760020154610614600d5461060e868c6000015461155390919063ffffffff16565b6003880154906113d3565b945060006112de6011544761162d90919063ffffffff16565b905060006112f7826009546113d390919063ffffffff16565b90506000611322611319600e5461060e600d548661155390919063ffffffff16565b600a54906113d3565b905061135761134c8a60040154610614600d5461060e868f6000015461155390919063ffffffff16565b60058b0154906113d3565b96505050505050506113c8565b61139961138e8460020154610614600d5461060e600754896000015461155390919063ffffffff16565b6003850154906113d3565b91506113c56106538460040154610614600d5461060e600a54896000015461155390919063ffffffff16565b90505b909590945092505050565b6000806113e08385611871565b9050838110156114325760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016105bd565b90505b92915050565b600c54421161144657565b600e546114535742600c55565b600061146a600c544261162d90919063ffffffff16565b905060006114836006548361155390919063ffffffff16565b905060055481111561149457506005545b61149e81836115d2565b600f55600e54600d546114ba916112879161060e908590611553565b6007556005546114ca908261162d565b6005556004546114da90826113d3565b6004556011546000906114ee90479061162d565b6009549091506114fe90826113d3565b600981905547601155600e54600d5461152092611319929161060e9190611553565b600a55600954600854611532916113d3565b60085560095461154290846115d2565b601055505060006009555042600c55565b60008261156257506000611435565b600061156e83856118a9565b90508261157b8583611889565b146114325760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016105bd565b60008082116116235760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f00000000000060448201526064016105bd565b6114328284611889565b60008282111561167f5760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f77000060448201526064016105bd565b61143282846118c8565b60006020828403121561169a578081fd5b81356114328161190b565b6000602082840312156116b6578081fd5b81516114328161190b565b600060208083850312156116d3578182fd5b825167ffffffffffffffff808211156116ea578384fd5b818501915085601f8301126116fd578384fd5b81518181111561170f5761170f6118f5565b8060051b604051601f19603f83011681018181108582111715611734576117346118f5565b604052828152858101935084860182860187018a1015611752578788fd5b8795505b83861015611774578051855260019590950194938601938601611756565b5098975050505050505050565b600060208284031215611792578081fd5b81518015158114611432578182fd5b6000602082840312156117b2578081fd5b5035919050565b6000602082840312156117ca578081fd5b5051919050565b600060808201868352602060808185015281875180845260a0860191508289019350845b8181101561181a5784516001600160a01b0316835293830193918301916001016117f5565b50506001600160a01b039690961660408501525050506060015292915050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115611884576118846118df565b500190565b6000826118a457634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156118c3576118c36118df565b500290565b6000828210156118da576118da6118df565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461192057600080fd5b5056fea264697066735822122090646d5833bc4aff094013872473e84f24c782851dee99c9663f4b956231d59864736f6c63430008040033

Deployed Bytecode

0x60806040526004361061036f5760003560e01c806375f0a874116101c6578063bfe10928116100f7578063d12a768811610095578063eace0e011161006f578063eace0e0114610a2a578063ed2cdab714610a5a578063f2fde38b14610a8a578063f708a64f14610aaa57600080fd5b8063d12a7688146109ae578063d14d1e95146109c4578063dd62ed3e146109e457600080fd5b8063c2f0263f116100d1578063c2f0263f1461091c578063c3c8cd8014610949578063c49b9a801461095e578063cc4c2e791461097e57600080fd5b8063bfe10928146108b5578063c04a5414146108dc578063c0e56afe146108fc57600080fd5b80639caf9b0011610164578063a9059cbb1161013e578063a9059cbb1461083a578063ae8502811461085a578063b2bdfa7b14610870578063b41c9eda1461089557600080fd5b80639caf9b00146107d5578063a0a0c46514610805578063a457c2d71461081a57600080fd5b806389e7b81b116101a057806389e7b81b1461075d5780638da5cb5b1461077d57806395d89b41146107a057806396cc6c06146107b557600080fd5b806375f0a874146107075780637bcd8ab814610727578063878d5e421461073d57600080fd5b806349bd5a5e116102a05780635d098b381161023e5780636a44a0e2116102185780636a44a0e21461068c5780636bc87c3a146106bc5780636fc3eaec146106d257806370a08231146106e757600080fd5b80635d098b381461062c5780635f88bd2d1461064c578063658d4b7f1461066c57600080fd5b80634ebcce451161027a5780634ebcce45146105b6578063519d216a146105cc5780635b3bf3b9146105ec5780635bc0c7ca1461060c57600080fd5b806349bd5a5e146105575780634a74bb02146105775780634cf088d91461059657600080fd5b806323b872dd1161030d578063313ce567116102e7578063313ce567146104df5780633817d9211461050157806338e8c57214610517578063395093511461053757600080fd5b806323b872dd1461047f57806326c1f69a1461049f5780632d48e896146104bf57600080fd5b806316426a2e1161034957806316426a2e146103f85780631694505e1461041c57806318160ddd1461045457806322976e0d1461046957600080fd5b806302a503be1461037b57806306fdde031461039d578063095ea7b3146103c857600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5061039b610396366004612618565b610aca565b005b3480156103a957600080fd5b506103b2610b11565b6040516103bf9190612740565b60405180910390f35b3480156103d457600080fd5b506103e86103e336600461264c565b610ba3565b60405190151581526020016103bf565b34801561040457600080fd5b5061040e60145481565b6040519081526020016103bf565b34801561042857600080fd5b5060065461043c906001600160a01b031681565b6040516001600160a01b0390911681526020016103bf565b34801561046057600080fd5b5060025461040e565b34801561047557600080fd5b5061040e600b5481565b34801561048b57600080fd5b506103e861049a3660046125d8565b610bba565b3480156104ab57600080fd5b5061039b6104ba366004612691565b610c23565b3480156104cb57600080fd5b5061039b6104da3660046126c1565b610c8a565b3480156104eb57600080fd5b5060055460405160ff90911681526020016103bf565b34801561050d57600080fd5b5061040e60095481565b34801561052357600080fd5b5061039b610532366004612618565b610d16565b34801561054357600080fd5b506103e861055236600461264c565b610d5d565b34801561056357600080fd5b5060075461043c906001600160a01b031681565b34801561058357600080fd5b506017546103e890610100900460ff1681565b3480156105a257600080fd5b5060195461043c906001600160a01b031681565b3480156105c257600080fd5b5061040e60165481565b3480156105d857600080fd5b5061040e6105e7366004612568565b610d93565b3480156105f857600080fd5b5061039b61060736600461270f565b610e19565b34801561061857600080fd5b5061039b610627366004612568565b610eba565b34801561063857600080fd5b5061039b610647366004612568565b610f63565b34801561065857600080fd5b506017546103e89062010000900460ff1681565b34801561067857600080fd5b5061039b610687366004612618565b61100a565b34801561069857600080fd5b506103e86106a7366004612568565b600f6020526000908152604090205460ff1681565b3480156106c857600080fd5b5061040e60085481565b3480156106de57600080fd5b5061039b611051565b3480156106f357600080fd5b5061040e610702366004612568565b611125565b34801561071357600080fd5b50601a5461043c906001600160a01b031681565b34801561073357600080fd5b5061040e60155481565b34801561074957600080fd5b5061039b610758366004612691565b611140565b34801561076957600080fd5b5061039b610778366004612691565b6111a4565b34801561078957600080fd5b5060055461010090046001600160a01b031661043c565b3480156107ac57600080fd5b506103b261120f565b3480156107c157600080fd5b5061039b6107d0366004612691565b61121e565b3480156107e157600080fd5b506103e86107f0366004612568565b60106020526000908152604090205460ff1681565b34801561081157600080fd5b5061039b61123f565b34801561082657600080fd5b506103e861083536600461264c565b61129e565b34801561084657600080fd5b506103e861085536600461264c565b6112ed565b34801561086657600080fd5b5061040e600a5481565b34801561087c57600080fd5b5060055461043c9061010090046001600160a01b031681565b3480156108a157600080fd5b5061039b6108b0366004612618565b6112fa565b3480156108c157600080fd5b5060175461043c90630100000090046001600160a01b031681565b3480156108e857600080fd5b50601b5461043c906001600160a01b031681565b34801561090857600080fd5b5061039b610917366004612677565b611341565b34801561092857600080fd5b5061040e610937366004612568565b60116020526000908152604090205481565b34801561095557600080fd5b5061039b611379565b34801561096a57600080fd5b5061039b610979366004612677565b6113c7565b34801561098a57600080fd5b506103e8610999366004612568565b600d6020526000908152604090205460ff1681565b3480156109ba57600080fd5b5061040e60135481565b3480156109d057600080fd5b5061040e6109df366004612568565b6113fd565b3480156109f057600080fd5b5061040e6109ff3660046125a0565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610a3657600080fd5b506103e8610a45366004612568565b600e6020526000908152604090205460ff1681565b348015610a6657600080fd5b506103e8610a75366004612568565b600c6020526000908152604090205460ff1681565b348015610a9657600080fd5b5061039b610aa5366004612568565b611437565b348015610ab657600080fd5b5061039b610ac5366004612618565b6114cd565b60055461010090046001600160a01b03163314610ae657600080fd5b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b606060038054610b20906128f9565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4c906128f9565b8015610b995780601f10610b6e57610100808354040283529160200191610b99565b820191906000526020600020905b815481529060010190602001808311610b7c57829003601f168201915b5050505050905090565b6000610bb0338484611610565b5060015b92915050565b6000610bc7848484611735565b610c198433610c1485604051806060016040528060288152602001612989602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611d8c565b611610565b5060019392505050565b60055461010090046001600160a01b03163314610c3f57600080fd5b600a811015610c855760405162461bcd60e51b815260206004820152600d60248201526c4d696e696d756d20697320312560981b60448201526064015b60405180910390fd5b601455565b60055461010090046001600160a01b03163314610ca657600080fd5b6017546040516316a4744b60e11b8152600481018490526024810183905263010000009091046001600160a01b031690632d48e896906044015b600060405180830381600087803b158015610cfa57600080fd5b505af1158015610d0e573d6000803e3d6000fd5b505050505050565b60055461010090046001600160a01b03163314610d3257600080fd5b6001600160a01b03919091166000908152600e60205260409020805460ff1916911515919091179055565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610bb0918590610c1490866115aa565b6017546040516328ce90b560e11b81526001600160a01b03838116600483015260009263010000009004169063519d216a906024015b60206040518083038186803b158015610de157600080fd5b505afa158015610df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb491906126a9565b60055461010090046001600160a01b03163314610e3557600080fd5b6103848183610e44868861288b565b610e4e919061288b565b610e58919061288b565b1115610ea65760405162461bcd60e51b815260206004820152601b60248201527f546f74616c20746178206d757374206c657373207468656e20393000000000006044820152606401610c7c565b600893909355600991909155600a55600b55565b60055461010090046001600160a01b03163314610ed657600080fd5b6001600160a01b038116610f415760405162461bcd60e51b815260206004820152602c60248201527f446576656c6f706d656e742077616c6c65742063616e2774206265207468652060448201526b7a65726f206164647265737360a01b6064820152608401610c7c565b601b80546001600160a01b0319166001600160a01b0392909216919091179055565b60055461010090046001600160a01b03163314610f7f57600080fd5b6001600160a01b038116610fe85760405162461bcd60e51b815260206004820152602a60248201527f4d61726b6574696e672077616c6c65742063616e277420626520746865207a65604482015269726f206164647265737360b01b6064820152608401610c7c565b601a80546001600160a01b0319166001600160a01b0392909216919091179055565b60055461010090046001600160a01b0316331461102657600080fd5b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b60055461010090046001600160a01b0316331461106d57600080fd5b476000611086600a611080846007611dc3565b90611e42565b9050600061109a600a611080856003611dc3565b905080156110de57601b546040516001600160a01b039091169082156108fc029083906000818181858888f193505050501580156110dc573d6000803e3d6000fd5b505b811561112057601a546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561111e573d6000803e3d6000fd5b505b505050565b6001600160a01b031660009081526020819052604090205490565b60055461010090046001600160a01b0316331461115c57600080fd5b600181101561119f5760405162461bcd60e51b815260206004820152600f60248201526e4d696e696d756d20697320302e312560881b6044820152606401610c7c565b601555565b60178054600160ff1990911617905560055461010090046001600160a01b031633146111cf57600080fd5b60006111da30611125565b905060006111f5836111ef84620186a0611e42565b90611dc3565b905061120081611e9d565b50506017805460ff1916905550565b606060048054610b20906128f9565b60055461010090046001600160a01b0316331461123a57600080fd5b601655565b601754604051630afbf02f60e11b815233600482015263010000009091046001600160a01b0316906315f7e05e90602401600060405180830381600087803b15801561128a57600080fd5b505af115801561111e573d6000803e3d6000fd5b6000610bb03384610c14856040518060600160405280602581526020016129b1602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611d8c565b6000610bb0338484611735565b60055461010090046001600160a01b0316331461131657600080fd5b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b60055461010090046001600160a01b0316331461135d57600080fd5b60178054911515620100000262ff000019909216919091179055565b60178054600160ff1990911617905560055461010090046001600160a01b031633146113a457600080fd5b60006113af30611125565b90506113ba81611e9d565b506017805460ff19169055565b60055461010090046001600160a01b031633146113e357600080fd5b601780549115156101000261ff0019909216919091179055565b60175460405163051fa63360e31b81526001600160a01b0383811660048301526000926301000000900416906328fd319890602401610dc9565b60055461010090046001600160a01b0316331461145357600080fd5b6001600160a01b03811661146657600080fd5b6005546040516001600160a01b0380841692610100900416907f2e3feca4334579203cd183fe1ced9524940047e5586fe13e8cc5dd1babaf6e8290600090a3600580546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60055461010090046001600160a01b031633146114e957600080fd5b6001600160a01b0382166000908152600d60205260409020805460ff1916821580159190911790915561155757601754604051630a5b654b60e11b81526001600160a01b038481166004830152600060248301526301000000909204909116906314b6ca9690604401610ce0565b601754630100000090046001600160a01b03166314b6ca968361157981611125565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401610ce0565b6000806115b7838561288b565b9050838110156116095760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610c7c565b9392505050565b6001600160a01b0383166116725760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610c7c565b6001600160a01b0382166116d35760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610c7c565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b03831661175b5760405162461bcd60e51b8152600401610c7c906127d6565b6001600160a01b0382166117815760405162461bcd60e51b8152600401610c7c90612793565b600081116117e35760405162461bcd60e51b815260206004820152602960248201527f5472616e7366657220616d6f756e74206d7573742062652067726561746572206044820152687468616e207a65726f60b81b6064820152608401610c7c565b6001600160a01b03831660009081526010602052604090205460ff16156118425760405162461bcd60e51b8152602060048201526013602482015272165bdd49dc99481a5b88189b1858dadb1a5cdd606a1b6044820152606401610c7c565b6007546001600160a01b03848116911614801561187857506001600160a01b0382166000908152600f602052604090205460ff16155b156118e95761189a6103e8611080601554601254611dc390919063ffffffff16565b8111156118e95760405162461bcd60e51b815260206004820152601960248201527f436865636b206d617820706572206275792070657263656e74000000000000006044820152606401610c7c565b6005546001600160a01b03848116610100909204161480159061191557506001600160a01b0383163014155b801561192e57506007546001600160a01b038381169116145b156119b5576001600160a01b03831660009081526011602052604090205461195890610e106115aa565b4210156119995760405162461bcd60e51b815260206004820152600f60248201526e027b7363c9039b2b6361037b731b29608d1b6044820152606401610c7c565b6001600160a01b03831660009081526011602052604090204290555b6007546001600160a01b0384811691161415611a3357601754604051636c8e777560e01b81526001600160a01b038481166004830152630100000090920490911690636c8e777590602401600060405180830381600087803b158015611a1a57600080fd5b505af1158015611a2e573d6000803e3d6000fd5b505050505b600080611a3f30611125565b60135490915081108015908190611a59575060175460ff16155b8015611a7357506007546001600160a01b03878116911614155b8015611a865750601754610100900460ff165b15611a9857611a93611fec565b600192505b6001600160a01b0386166000908152600c602052604090205460019060ff1680611ada57506001600160a01b0386166000908152600c602052604090205460ff165b15611ae3575060005b8015611b3f576000611b246103e8611080611b1d600b54611b17600a54611b176009546008546115aa90919063ffffffff16565b906115aa565b8990611dc3565b9050611b308682612304565b9550611b3d883083612360565b505b6001600160a01b0386166000908152600e602052604090205460ff16611bd757611b7c6103e8611080601454601254611dc390919063ffffffff16565b611b8986611b1789611125565b1115611bd75760405162461bcd60e51b815260206004820152601c60248201527f436865636b206d6178207065722077616c6c65742070657263656e74000000006044820152606401610c7c565b611be2878787612360565b6001600160a01b0387166000908152600d602052604090205460ff16611c7d57601754630100000090046001600160a01b03166314b6ca9688611c2481611125565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611c6a57600080fd5b505af1925050508015611c7b575060015b505b6001600160a01b0386166000908152600d602052604090205460ff16611d1857601754630100000090046001600160a01b03166314b6ca9687611cbf81611125565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611d0557600080fd5b505af1925050508015611d16575060015b505b83611d83576017546018546040516001624d3b8760e01b03198152600481019190915263010000009091046001600160a01b03169063ffb2c47990602401600060405180830381600087803b158015611d7057600080fd5b505af1925050508015611d81575060015b505b50505050505050565b60008184841115611db05760405162461bcd60e51b8152600401610c7c9190612740565b50611dbb83856128e2565b949350505050565b600082611dd257506000610bb4565b6000611dde83856128c3565b905082611deb85836128a3565b146116095760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610c7c565b6000808211611e935760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f0000000000006044820152606401610c7c565b61160982846128a3565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611ee057634e487b7160e01b600052603260045260246000fd5b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015611f3457600080fd5b505afa158015611f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f6c9190612584565b81600181518110611f8d57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600654611fb39130911684611610565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790610ce090859060009086903090429060040161281b565b6017805460ff19166001179055600061200430611125565b905060006120256016546111ef6103e8601254611e4290919063ffffffff16565b9050808211801561203e575060175462010000900460ff165b156120515761204e82600a611e42565b91505b6000612076600b54611b17600a54611b176009546008546115aa90919063ffffffff16565b905060006120938261108060085487611dc390919063ffffffff16565b905060006120b08361108060095488611dc390919063ffffffff16565b905060006120cd84611080600a5489611dc390919063ffffffff16565b905060006120e7826120e185818b89612304565b90612304565b905060006120f6856002611e42565b905060006121048683612304565b9050600061211884611b178781878b6115aa565b905061212381611e9d565b476000612134836110808488611dc3565b9050600061214684611080858c611dc3565b9050600061215885611080868c611dc3565b9050600061216c826120e185818989612304565b9050801561220557601a546001600160a01b03166108fc6121936064611080856046611dc3565b6040518115909202916000818181858888f193505050501580156121bb573d6000803e3d6000fd5b50601b546001600160a01b03166108fc6121db606461108085601e611dc3565b6040518115909202916000818181858888f19350505050158015612203573d6000803e3d6000fd5b505b821561226f57601760039054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b15801561225b57600080fd5b505af19350505050801561226d575060015b505b81156122d957601960009054906101000a90046001600160a01b03166001600160a01b031663eb41d3af836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156122c557600080fd5b505af1935050505080156122d7575060015b505b83156122e9576122e98785612469565b50506017805460ff1916905550505050505050505050505050565b6000828211156123565760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f7700006044820152606401610c7c565b61160982846128e2565b6001600160a01b0383166123865760405162461bcd60e51b8152600401610c7c906127d6565b6001600160a01b0382166123ac5760405162461bcd60e51b8152600401610c7c90612793565b6123e981604051806060016040528060268152602001612963602691396001600160a01b0386166000908152602081905260409020549190611d8c565b6001600160a01b03808516600090815260208190526040808220939093559084168152205461241890826115aa565b6001600160a01b038381166000818152602081815260409182902094909455518481529092918616917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611728565b6006546124819030906001600160a01b031684611610565b6006546001600160a01b031663f305d7198230856000806124b06005546001600160a01b036101009091041690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c4016060604051808303818588803b15801561251357600080fd5b505af1158015612527573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061254c91906126e2565b5050505050565b8035801515811461256357600080fd5b919050565b600060208284031215612579578081fd5b81356116098161294a565b600060208284031215612595578081fd5b81516116098161294a565b600080604083850312156125b2578081fd5b82356125bd8161294a565b915060208301356125cd8161294a565b809150509250929050565b6000806000606084860312156125ec578081fd5b83356125f78161294a565b925060208401356126078161294a565b929592945050506040919091013590565b6000806040838503121561262a578182fd5b82356126358161294a565b915061264360208401612553565b90509250929050565b6000806040838503121561265e578182fd5b82356126698161294a565b946020939093013593505050565b600060208284031215612688578081fd5b61160982612553565b6000602082840312156126a2578081fd5b5035919050565b6000602082840312156126ba578081fd5b5051919050565b600080604083850312156126d3578182fd5b50508035926020909101359150565b6000806000606084860312156126f6578283fd5b8351925060208401519150604084015190509250925092565b60008060008060808587031215612724578081fd5b5050823594602084013594506040840135936060013592509050565b6000602080835283518082850152825b8181101561276c57858101830151858201604001528201612750565b8181111561277d5783604083870101525b50601f01601f1916929092016040019392505050565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b600060a082018783526020878185015260a0604085015281875180845260c0860191508289019350845b8181101561286a5784516001600160a01b031683529383019391830191600101612845565b50506001600160a01b03969096166060850152505050608001529392505050565b6000821982111561289e5761289e612934565b500190565b6000826128be57634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156128dd576128dd612934565b500290565b6000828210156128f4576128f4612934565b500390565b600181811c9082168061290d57607f821691505b6020821081141561292e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461295f57600080fd5b5056fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220cad3cfed1e0a823c6c658f8aef56d87a50c3fa4c0ab117a4ffaa5deef3ab21f864736f6c63430008040033

Deployed Bytecode Sourcemap

49838:12420:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53774:127;;;;;;;;;;-1:-1:-1;53774:127:0;;;;;:::i;:::-;;:::i;:::-;;13227:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15373:169;;;;;;;;;;-1:-1:-1;15373:169:0;;;;;:::i;:::-;;:::i;:::-;;;5365:14:1;;5358:22;5340:41;;5328:2;5313:18;15373:169:0;5295:92:1;50707:42:0;;;;;;;;;;;;;;;;;;;13626:25:1;;;13614:2;13599:18;50707:42:0;13581:76:1;49919:41:0;;;;;;;;;;-1:-1:-1;49919:41:0;;;;-1:-1:-1;;;;;49919:41:0;;;;;;-1:-1:-1;;;;;3978:32:1;;;3960:51;;3948:2;3933:18;49919:41:0;3915:102:1;14326:108:0;;;;;;;;;;-1:-1:-1;14414:12:0;;14326:108;;50141:28;;;;;;;;;;;;;;;;16024:321;;;;;;;;;;-1:-1:-1;16024:321:0;;;;;:::i;:::-;;:::i;53121:188::-;;;;;;;;;;-1:-1:-1;53121:188:0;;;;;:::i;:::-;;:::i;56365:197::-;;;;;;;;;;-1:-1:-1;56365:197:0;;;;;:::i;:::-;;:::i;14170:91::-;;;;;;;;;;-1:-1:-1;14244:9:0;;14170:91;;14244:9;;;;15045:36:1;;15033:2;15018:18;14170:91:0;15000:87:1;50069:32:0;;;;;;;;;;;;;;;;53630:136;;;;;;;;;;-1:-1:-1;53630:136:0;;;;;:::i;:::-;;:::i;16754:218::-;;;;;;;;;;-1:-1:-1;16754:218:0;;;;;:::i;:::-;;:::i;49967:28::-;;;;;;;;;;-1:-1:-1;49967:28:0;;;;-1:-1:-1;;;;;49967:28:0;;;50898:40;;;;;;;;;;-1:-1:-1;50898:40:0;;;;;;;;;;;51079:22;;;;;;;;;;-1:-1:-1;51079:22:0;;;;-1:-1:-1;;;;;51079:22:0;;;50817:36;;;;;;;;;;;;;;;;56124:136;;;;;;;;;;-1:-1:-1;56124:136:0;;;;;:::i;:::-;;:::i;55593:382::-;;;;;;;;;;-1:-1:-1;55593:382:0;;;;;:::i;:::-;;:::i;52872:237::-;;;;;;;;;;-1:-1:-1;52872:237:0;;;;;:::i;:::-;;:::i;52640:224::-;;;;;;;;;;-1:-1:-1;52640:224:0;;;;;:::i;:::-;;:::i;50945:40::-;;;;;;;;;;-1:-1:-1;50945:40:0;;;;;;;;;;;53909:121;;;;;;;;;;-1:-1:-1;53909:121:0;;;;;:::i;:::-;;:::i;50402:48::-;;;;;;;;;;-1:-1:-1;50402:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;50034:28;;;;;;;;;;;;;;;;54765:407;;;;;;;;;;;;;:::i;14497:127::-;;;;;;;;;;-1:-1:-1;14497:127:0;;;;;:::i;:::-;;:::i;51110:75::-;;;;;;;;;;-1:-1:-1;51110:75:0;;;;-1:-1:-1;;;;;51110:75:0;;;50764:38;;;;;;;;;;;;;;;;53439:183;;;;;;;;;;-1:-1:-1;53439:183:0;;;;;:::i;:::-;;:::i;55180:264::-;;;;;;;;;;-1:-1:-1;55180:264:0;;;;;:::i;:::-;;:::i;22393:87::-;;;;;;;;;;-1:-1:-1;22466:6:0;;;;;-1:-1:-1;;;;;22466:6:0;22393:87;;13437:95;;;;;;;;;;;;;:::i;53317:114::-;;;;;;;;;;-1:-1:-1;53317:114:0;;;;;:::i;:::-;;:::i;50457:46::-;;;;;;;;;;-1:-1:-1;50457:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;56268:89;;;;;;;;;;;;;:::i;17475:269::-;;;;;;;;;;-1:-1:-1;17475:269:0;;;;;:::i;:::-;;:::i;14837:175::-;;;;;;;;;;-1:-1:-1;14837:175:0;;;;;:::i;:::-;;:::i;50108:26::-;;;;;;;;;;;;;;;;22126:21;;;;;;;;;;-1:-1:-1;22126:21:0;;;;;;;-1:-1:-1;;;;;22126:21:0;;;55450:135;;;;;;;;;;-1:-1:-1;55450:135:0;;;;;:::i;:::-;;:::i;50994:38::-;;;;;;;;;;-1:-1:-1;50994:38:0;;;;;;;-1:-1:-1;;;;;50994:38:0;;;51192:77;;;;;;;;;;-1:-1:-1;51192:77:0;;;;-1:-1:-1;;;;;51192:77:0;;;54463:117;;;;;;;;;;-1:-1:-1;54463:117:0;;;;;:::i;:::-;;:::i;50512:52::-;;;;;;;;;;-1:-1:-1;50512:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;54588:169;;;;;;;;;;;;;:::i;54338:117::-;;;;;;;;;;-1:-1:-1;54338:117:0;;;;;:::i;:::-;;:::i;50284:50::-;;;;;;;;;;-1:-1:-1;50284:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;50633:67;;;;;;;;;;;;;;;;55983:133;;;;;;;;;;-1:-1:-1;55983:133:0;;;;;:::i;:::-;;:::i;15075:151::-;;;;;;;;;;-1:-1:-1;15075:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;15191:18:0;;;15164:7;15191:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15075:151;50341:54;;;;;;;;;;-1:-1:-1;50341:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;50231:46;;;;;;;;;;-1:-1:-1;50231:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;22488:200;;;;;;;;;;-1:-1:-1;22488:200:0;;;;;:::i;:::-;;:::i;54038:292::-;;;;;;;;;;-1:-1:-1;54038:292:0;;;;;:::i;:::-;;:::i;53774:127::-;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;-1:-1:-1;;;;;53860:24:0;;;::::1;;::::0;;;:15:::1;:24;::::0;;;;:33;;-1:-1:-1;;53860:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53774:127::o;13227:91::-;13272:13;13305:5;13298:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13227:91;:::o;15373:169::-;15456:4;15473:39;814:10;15496:7;15505:6;15473:8;:39::i;:::-;-1:-1:-1;15530:4:0;15373:169;;;;;:::o;16024:321::-;16130:4;16147:36;16157:6;16165:9;16176:6;16147:9;:36::i;:::-;16194:121;16203:6;814:10;16225:89;16263:6;16225:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16225:19:0;;;;;;:11;:19;;;;;;;;814:10;16225:33;;;;;;;;;;:37;:89::i;:::-;16194:8;:121::i;:::-;-1:-1:-1;16333:4:0;16024:321;;;;;:::o;53121:188::-;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;53231:2:::1;53213:14;:20;;53205:46;;;::::0;-1:-1:-1;;;53205:46:0;;13340:2:1;53205:46:0::1;::::0;::::1;13322:21:1::0;13379:2;13359:18;;;13352:30;-1:-1:-1;;;13398:18:1;;;13391:43;13451:18;;53205:46:0::1;;;;;;;;;53262:22;:39:::0;53121:188::o;56365:197::-;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;56480:11:::1;::::0;:74:::1;::::0;-1:-1:-1;;;56480:74:0;;::::1;::::0;::::1;14824:25:1::0;;;14865:18;;;14858:34;;;56480:11:0;;;::::1;-1:-1:-1::0;;;;;56480:11:0::1;::::0;:35:::1;::::0;14797:18:1;;56480:74:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;56365:197:::0;;:::o;53630:136::-;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;-1:-1:-1;;;;;53719:30:0;;;::::1;;::::0;;;:21:::1;:30;::::0;;;;:39;;-1:-1:-1;;53719:39:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53630:136::o;16754:218::-;814:10;16842:4;16891:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;16891:34:0;;;;;;;;;;16842:4;;16859:83;;16882:7;;16891:50;;16930:10;16891:38;:50::i;56124:136::-;56215:11;;:37;;-1:-1:-1;;;56215:37:0;;-1:-1:-1;;;;;3978:32:1;;;56215:37:0;;;3960:51:1;56189:7:0;;56215:11;;;;;:28;;3933:18:1;;56215:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;55593:382::-;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;55783:3:::1;55769:10:::0;55758:8;55731:24:::1;55741:14:::0;55731:7;:24:::1;:::i;:::-;:35;;;;:::i;:::-;:48;;;;:::i;:::-;:55;;55723:95;;;::::0;-1:-1:-1;;;55723:95:0;;12984:2:1;55723:95:0::1;::::0;::::1;12966:21:1::0;13023:2;13003:18;;;12996:30;13062:29;13042:18;;;13035:57;13109:18;;55723:95:0::1;12956:177:1::0;55723:95:0::1;55829:13;:23:::0;;;;55863:17:::1;:34:::0;;;;55908:11:::1;:22:::0;55941:13:::1;:26:::0;55593:382::o;52872:237::-;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;-1:-1:-1;;;;;52971:32:0;::::1;52963:89;;;::::0;-1:-1:-1;;;52963:89:0;;10996:2:1;52963:89:0::1;::::0;::::1;10978:21:1::0;11035:2;11015:18;;;11008:30;11074:34;11054:18;;;11047:62;-1:-1:-1;;;11125:18:1;;;11118:42;11177:19;;52963:89:0::1;10968:234:1::0;52963:89:0::1;53063:17;:38:::0;;-1:-1:-1;;;;;;53063:38:0::1;-1:-1:-1::0;;;;;53063:38:0;;;::::1;::::0;;;::::1;::::0;;52872:237::o;52640:224::-;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;-1:-1:-1;;;;;52734:30:0;::::1;52726:85;;;::::0;-1:-1:-1;;;52726:85:0;;9826:2:1;52726:85:0::1;::::0;::::1;9808:21:1::0;9865:2;9845:18;;;9838:30;9904:34;9884:18;;;9877:62;-1:-1:-1;;;9955:18:1;;;9948:40;10005:19;;52726:85:0::1;9798:232:1::0;52726:85:0::1;52822:15;:34:::0;;-1:-1:-1;;;;;;52822:34:0::1;-1:-1:-1::0;;;;;52822:34:0;;;::::1;::::0;;;::::1;::::0;;52640:224::o;53909:121::-;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;-1:-1:-1;;;;;53991:22:0;;;::::1;;::::0;;;:13:::1;:22;::::0;;;;:31;;-1:-1:-1;;53991:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53909:121::o;54765:407::-;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;54836:21:::1;54819:14;54893:21;54911:2;54893:13;54836:21:::0;54904:1:::1;54893:10;:13::i;:::-;:17:::0;::::1;:21::i;:::-;54870:44:::0;-1:-1:-1;54925:14:0::1;54942:21;54960:2;54942:13;:6:::0;54953:1:::1;54942:10;:13::i;:21::-;54925:38:::0;-1:-1:-1;55004:10:0;;55001:71:::1;;55037:17;::::0;55029:43:::1;::::0;-1:-1:-1;;;;;55037:17:0;;::::1;::::0;55029:43;::::1;;;::::0;55065:6;;55037:17:::1;55029:43:::0;55037:17;55029:43;55065:6;55037:17;55029:43;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;55001:71;55086:16:::0;;55083:81:::1;;55125:15;::::0;55117:47:::1;::::0;-1:-1:-1;;;;;55125:15:0;;::::1;::::0;55117:47;::::1;;;::::0;55151:12;;55125:15:::1;55117:47:::0;55125:15;55117:47;55151:12;55125:15;55117:47;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;55083:81;22376:1;;;54765:407::o:0;14497:127::-;-1:-1:-1;;;;;14598:18:0;14571:7;14598:18;;;;;;;;;;;;14497:127::o;53439:183::-;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;53546:1:::1;53528:14;:19;;53520:47;;;::::0;-1:-1:-1;;;53520:47:0;;7661:2:1;53520:47:0::1;::::0;::::1;7643:21:1::0;7700:2;7680:18;;;7673:30;-1:-1:-1;;;7719:18:1;;;7712:45;7774:18;;53520:47:0::1;7633:165:1::0;53520:47:0::1;53578:19;:36:::0;53439:183::o;55180:264::-;51310:16;:23;;51329:4;-1:-1:-1;;51310:23:0;;;;;;22358:6:::1;::::0;51310:23;22358:6;::::1;-1:-1:-1::0;;;;;22358:6:0::1;22344:10;:20;22336:29;;;::::0;::::1;;55271:23:::2;55297:24;55315:4;55297:9;:24::i;:::-;55271:50:::0;-1:-1:-1;55332:19:0::2;55354:42;55385:10:::0;55354:26:::2;55271:50:::0;55374:5:::2;55354:19;:26::i;:::-;:30:::0;::::2;:42::i;:::-;55332:64;;55407:29;55424:11;55407:16;:29::i;:::-;-1:-1:-1::0;;51356:16:0;:24;;-1:-1:-1;;51356:24:0;;;-1:-1:-1;55180:264:0:o;13437:95::-;13484:13;13517:7;13510:14;;;;;:::i;53317:114::-;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;53398:16:::1;:25:::0;53317:114::o;56268:89::-;56312:11;;:37;;-1:-1:-1;;;56312:37:0;;56338:10;56312:37;;;3960:51:1;56312:11:0;;;;-1:-1:-1;;;;;56312:11:0;;:25;;3933:18:1;;56312:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17475:269;17568:4;17585:129;814:10;17608:7;17617:96;17656:15;17617:96;;;;;;;;;;;;;;;;;814:10;17617:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;17617:34:0;;;;;;;;;;;;:38;:96::i;14837:175::-;14923:4;14940:42;814:10;14964:9;14975:6;14940:9;:42::i;55450:135::-;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;-1:-1:-1;;;;;55541:22:0;;;::::1;;::::0;;;:13:::1;:22;::::0;;;;:36;;-1:-1:-1;;55541:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55450:135::o;54463:117::-;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;54540:21:::1;:32:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;54540:32:0;;::::1;::::0;;;::::1;::::0;;54463:117::o;54588:169::-;51310:16;:23;;51329:4;-1:-1:-1;;51310:23:0;;;;;;22358:6:::1;::::0;51310:23;22358:6;::::1;-1:-1:-1::0;;;;;22358:6:0::1;22344:10;:20;22336:29;;;::::0;::::1;;54655:23:::2;54681:24;54699:4;54681:9;:24::i;:::-;54655:50;;54716:33;54733:15;54716:16;:33::i;:::-;-1:-1:-1::0;51356:16:0;:24;;-1:-1:-1;;51356:24:0;;;54588:169::o;54338:117::-;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;54415:21:::1;:32:::0;;;::::1;;;;-1:-1:-1::0;;54415:32:0;;::::1;::::0;;;::::1;::::0;;54338:117::o;55983:133::-;56070:11;;:38;;-1:-1:-1;;;56070:38:0;;-1:-1:-1;;;;;3978:32:1;;;56070:38:0;;;3960:51:1;56044:7:0;;56070:11;;;;;:29;;3933:18:1;;56070:38:0;3915:102:1;22488:200:0;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;-1:-1:-1;;;;;22570:23:0;::::1;22562:32;;;::::0;::::1;;22633:6;::::0;22610:41:::1;::::0;-1:-1:-1;;;;;22610:41:0;;::::1;::::0;22633:6:::1;::::0;::::1;;::::0;22610:41:::1;::::0;;;::::1;22662:6;:18:::0;;-1:-1:-1;;;;;22662:18:0;;::::1;;;-1:-1:-1::0;;;;;;22662:18:0;;::::1;::::0;;;::::1;::::0;;22488:200::o;54038:292::-;22358:6;;;;;-1:-1:-1;;;;;22358:6:0;22344:10;:20;22336:29;;;;;;-1:-1:-1;;;;;54127:26:0;::::1;;::::0;;;:17:::1;:26;::::0;;;;:35;;-1:-1:-1;;54127:35:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;54173:150:::1;;54198:11;::::0;:32:::1;::::0;-1:-1:-1;;;54198:32:0;;-1:-1:-1;;;;;4222:32:1;;;54198::0::1;::::0;::::1;4204:51:1::0;54228:1:0::1;4271:18:1::0;;;4264:34;54198:11:0;;;::::1;::::0;;::::1;::::0;:20:::1;::::0;4177:18:1;;54198:32:0::1;4159:145:1::0;54173:150:0::1;54262:11;::::0;;;::::1;-1:-1:-1::0;;;;;54262:11:0::1;:20;54283:7:::0;54292:18:::1;54283:7:::0;54292:9:::1;:18::i;:::-;54262:49;::::0;-1:-1:-1;;;;;;54262:49:0::1;::::0;;;;;;-1:-1:-1;;;;;4222:32:1;;;54262:49:0::1;::::0;::::1;4204:51:1::0;4271:18;;;4264:34;4177:18;;54262:49:0::1;4159:145:1::0;3785:179:0;3843:7;;3875:5;3879:1;3875;:5;:::i;:::-;3863:17;;3904:1;3899;:6;;3891:46;;;;-1:-1:-1;;;3891:46:0;;8408:2:1;3891:46:0;;;8390:21:1;8447:2;8427:18;;;8420:30;8486:29;8466:18;;;8459:57;8533:18;;3891:46:0;8380:177:1;3891:46:0;3955:1;3785:179;-1:-1:-1;;;3785:179:0:o;20622:346::-;-1:-1:-1;;;;;20724:19:0;;20716:68;;;;-1:-1:-1;;;20716:68:0;;12225:2:1;20716:68:0;;;12207:21:1;12264:2;12244:18;;;12237:30;12303:34;12283:18;;;12276:62;-1:-1:-1;;;12354:18:1;;;12347:34;12398:19;;20716:68:0;12197:226:1;20716:68:0;-1:-1:-1;;;;;20803:21:0;;20795:68;;;;-1:-1:-1;;;20795:68:0;;8005:2:1;20795:68:0;;;7987:21:1;8044:2;8024:18;;;8017:30;8083:34;8063:18;;;8056:62;-1:-1:-1;;;8134:18:1;;;8127:32;8176:19;;20795:68:0;7977:224:1;20795:68:0;-1:-1:-1;;;;;20876:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;20928:32;;13626:25:1;;;20928:32:0;;13599:18:1;20928:32:0;;;;;;;;20622:346;;;:::o;56570:2369::-;-1:-1:-1;;;;;56704:18:0;;56696:68;;;;-1:-1:-1;;;56696:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56783:16:0;;56775:64;;;;-1:-1:-1;;;56775:64:0;;;;;;;:::i;:::-;56867:1;56858:6;:10;56850:64;;;;-1:-1:-1;;;56850:64:0;;11409:2:1;56850:64:0;;;11391:21:1;11448:2;11428:18;;;11421:30;11487:34;11467:18;;;11460:62;-1:-1:-1;;;11538:18:1;;;11531:39;11587:19;;56850:64:0;11381:231:1;56850:64:0;-1:-1:-1;;;;;56933:19:0;;;;;;:13;:19;;;;;;;;:28;56925:60;;;;-1:-1:-1;;;56925:60:0;;8764:2:1;56925:60:0;;;8746:21:1;8803:2;8783:18;;;8776:30;-1:-1:-1;;;8822:18:1;;;8815:49;8881:18;;56925:60:0;8736:169:1;56925:60:0;57050:13;;-1:-1:-1;;;;;57034:30:0;;;57050:13;;57034:30;:54;;;;-1:-1:-1;;;;;;57069:19:0;;;;;;:15;:19;;;;;;;;57068:20;57034:54;57031:180;;;57122:47;57164:4;57122:37;57139:19;;57122:12;;:16;;:37;;;;:::i;:47::-;57112:6;:57;;57104:95;;;;-1:-1:-1;;;57104:95:0;;12630:2:1;57104:95:0;;;12612:21:1;12669:2;12649:18;;;12642:30;12708:27;12688:18;;;12681:55;12753:18;;57104:95:0;12602:175:1;57104:95:0;22466:6;;-1:-1:-1;;;;;57226:15:0;;;22466:6;;;;;57226:15;;;;:40;;-1:-1:-1;;;;;;57245:21:0;;57261:4;57245:21;;57226:40;:72;;;;-1:-1:-1;57284:13:0;;-1:-1:-1;;;;;57270:28:0;;;57284:13;;57270:28;57226:72;57223:240;;;-1:-1:-1;;;;;57341:22:0;;;;;;:16;:22;;;;;;:35;;57368:7;57341:26;:35::i;:::-;57322:15;:54;;57314:82;;;;-1:-1:-1;;;57314:82:0;;7317:2:1;57314:82:0;;;7299:21:1;7356:2;7336:18;;;7329:30;-1:-1:-1;;;7375:18:1;;;7368:45;7430:18;;57314:82:0;7289:165:1;57314:82:0;-1:-1:-1;;;;;57411:22:0;;;;;;:16;:22;;;;;57436:15;57411:40;;57223:240;57494:13;;-1:-1:-1;;;;;57478:30:0;;;57494:13;;57478:30;57475:98;;;57524:11;;:37;;-1:-1:-1;;;57524:37:0;;-1:-1:-1;;;;;3978:32:1;;;57524:37:0;;;3960:51:1;57524:11:0;;;;;;;;:33;;3933:18:1;;57524:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57475:98;57585:12;57616:28;57647:24;57665:4;57647:9;:24::i;:::-;57733:29;;57616:55;;-1:-1:-1;57709:53:0;;;;;;;57791;;-1:-1:-1;57828:16:0;;;;57827:17;57791:53;:91;;;;-1:-1:-1;57869:13:0;;-1:-1:-1;;;;;57861:21:0;;;57869:13;;57861:21;;57791:91;:129;;;;-1:-1:-1;57899:21:0;;;;;;;57791:129;57773:257;;;57976:13;:11;:13::i;:::-;58014:4;58004:14;;57773:257;-1:-1:-1;;;;;58075:19:0;;58042:12;58075:19;;;:13;:19;;;;;;58057:4;;58075:19;;;:40;;-1:-1:-1;;;;;;58098:17:0;;;;;;:13;:17;;;;;;;;58075:40;58072:87;;;-1:-1:-1;58142:5:0;58072:87;58174:7;58171:239;;;58195:12;58210:94;58299:4;58210:84;58221:72;58279:13;;58221:53;58262:11;;58221:36;58239:17;;58221:13;;:17;;:36;;;;:::i;:::-;:40;;:53::i;:72::-;58210:6;;:10;:84::i;:94::-;58195:109;-1:-1:-1;58325:16:0;:6;58195:109;58325:10;:16::i;:::-;58316:25;;58356:42;58372:4;58386;58393;58356:15;:42::i;:::-;58171:239;;-1:-1:-1;;;;;58426:25:0;;;;;;:21;:25;;;;;;;;58422:177;;58504:50;58549:4;58504:40;58521:22;;58504:12;;:16;;:40;;;;:::i;:50::-;58475:25;58493:6;58475:13;58485:2;58475:9;:13::i;:25::-;:79;;58467:120;;;;-1:-1:-1;;;58467:120:0;;10237:2:1;58467:120:0;;;10219:21:1;10276:2;10256:18;;;10249:30;10315;10295:18;;;10288:58;10363:18;;58467:120:0;10209:178:1;58467:120:0;58611:33;58627:4;58633:2;58637:6;58611:15;:33::i;:::-;-1:-1:-1;;;;;58661:23:0;;;;;;:17;:23;;;;;;;;58657:91;;58691:11;;;;;-1:-1:-1;;;;;58691:11:0;:20;58712:4;58718:15;58712:4;58718:9;:15::i;:::-;58691:43;;-1:-1:-1;;;;;;58691:43:0;;;;;;;-1:-1:-1;;;;;4222:32:1;;;58691:43:0;;;4204:51:1;4271:18;;;4264:34;4177:18;;58691:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58687:59;;-1:-1:-1;;;;;58762:21:0;;;;;;:17;:21;;;;;;;;58758:85;;58790:11;;;;;-1:-1:-1;;;;;58790:11:0;:20;58811:2;58815:13;58811:2;58815:9;:13::i;:::-;58790:39;;-1:-1:-1;;;;;;58790:39:0;;;;;;;-1:-1:-1;;;;;4222:32:1;;;58790:39:0;;;4204:51:1;4271:18;;;4264:34;4177:18;;58790:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58786:55;;58859:7;58855:77;;58885:11;;58905:14;;58885:35;;-1:-1:-1;;;;;;58885:35:0;;;;;13626:25:1;;;;58885:11:0;;;;-1:-1:-1;;;;;58885:11:0;;:19;;13599:18:1;;58885:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58881:51;;56570:2369;;;;;;;:::o;6612:166::-;6698:7;6734:12;6726:6;;;;6718:29;;;;-1:-1:-1;;;6718:29:0;;;;;;;;:::i;:::-;-1:-1:-1;6765:5:0;6769:1;6765;:5;:::i;:::-;6758:12;6612:166;-1:-1:-1;;;;6612:166:0:o;4664:220::-;4722:7;4746:6;4742:20;;-1:-1:-1;4761:1:0;4754:8;;4742:20;4773:9;4785:5;4789:1;4785;:5;:::i;:::-;4773:17;-1:-1:-1;4818:1:0;4809:5;4813:1;4773:17;4809:5;:::i;:::-;:10;4801:56;;;;-1:-1:-1;;;4801:56:0;;10594:2:1;4801:56:0;;;10576:21:1;10633:2;10613:18;;;10606:30;10672:34;10652:18;;;10645:62;-1:-1:-1;;;10723:18:1;;;10716:31;10764:19;;4801:56:0;10566:223:1;5362:153:0;5420:7;5452:1;5448;:5;5440:44;;;;-1:-1:-1;;;5440:44:0;;9471:2:1;5440:44:0;;;9453:21:1;9510:2;9490:18;;;9483:30;9549:28;9529:18;;;9522:56;9595:18;;5440:44:0;9443:176:1;5440:44:0;5502:5;5506:1;5502;:5;:::i;61143:589::-;61293:16;;;61307:1;61293:16;;;;;;;;61269:21;;61293:16;;;;;;;;;;-1:-1:-1;61293:16:0;61269:40;;61338:4;61320;61325:1;61320:7;;;;;;-1:-1:-1;;;61320:7:0;;;;;;;;;-1:-1:-1;;;;;61320:23:0;;;:7;;;;;;;;;;:23;;;;61364:15;;:22;;;-1:-1:-1;;;61364:22:0;;;;:15;;;;;:20;;:22;;;;;61320:7;;61364:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61354:4;61359:1;61354:7;;;;;;-1:-1:-1;;;61354:7:0;;;;;;;;;-1:-1:-1;;;;;61354:32:0;;;:7;;;;;;;;;:32;61431:15;;61399:62;;61416:4;;61431:15;61449:11;61399:8;:62::i;:::-;61500:15;;:224;;-1:-1:-1;;;61500:224:0;;-1:-1:-1;;;;;61500:15:0;;;;:66;;:224;;61581:11;;61500:15;;61651:4;;61678;;61698:15;;61500:224;;;:::i;58947:2188::-;51310:16;:23;;-1:-1:-1;;51310:23:0;51329:4;51310:23;;;:16;59032:24:::1;59050:4;59032:9;:24::i;:::-;59001:55;;59077:21;59101:44;59128:16;;59101:22;59118:4;59101:12;;:16;;:22;;;;:::i;:44::-;59077:68;;59184:13;59161:20;:36;:61;;;;-1:-1:-1::0;59201:21:0::1;::::0;;;::::1;;;59161:61;59158:142;;;59260:28;:20:::0;59285:2:::1;59260:24;:28::i;:::-;59237:51;;59158:142;59320:17;59340:72;59398:13;;59340:53;59381:11;;59340:36;59358:17;;59340:13;;:17;;:36;;;;:::i;:72::-;59320:92;;59425:26;59454:54;59498:9;59454:39;59479:13;;59454:20;:24;;:39;;;;:::i;:54::-;59425:83;;59519:30;59552:58;59600:9;59552:43;59577:17;;59552:20;:24;;:43;;;;:::i;:58::-;59519:91;;59621:24;59648:52;59690:9;59648:37;59673:11;;59648:20;:24;;:37;;;;:::i;:52::-;59621:79:::0;-1:-1:-1;59711:32:0::1;59746:94;59621:79:::0;59746:72:::1;59795:22:::0;59746:72;:20;59771:18;59746:24:::1;:44::i;:::-;:48:::0;::::1;:72::i;:94::-;59711:129:::0;-1:-1:-1;59904:12:0::1;59919:25;:18:::0;59942:1:::1;59919:22;:25::i;:::-;59904:40:::0;-1:-1:-1;59955:17:0::1;59975:28;:18:::0;59904:40;59975:22:::1;:28::i;:::-;59955:48:::0;-1:-1:-1;60033:18:0::1;60054:84;60113:24:::0;60054:54:::1;60091:16:::0;60054:54;:4;60063:22;60054:8:::1;:32::i;:84::-;60033:105;;60149:28;60166:10;60149:16;:28::i;:::-;60209:21;60188:18;60284:36;60309:10:::0;60284:20:::1;60209:21:::0;60299:4;60284:14:::1;:20::i;:36::-;60264:56:::0;-1:-1:-1;60331:21:0::1;60355:54;60398:10:::0;60355:38:::1;:10:::0;60370:22;60355:14:::1;:38::i;:54::-;60331:78:::0;-1:-1:-1;60420:18:0::1;60441:48;60478:10:::0;60441:32:::1;:10:::0;60456:16;60441:14:::1;:32::i;:48::-;60420:69:::0;-1:-1:-1;60500:26:0::1;60529:60;60420:69:::0;60529:44:::1;60559:13:::0;60529:44;:10;60544:9;60529:14:::1;:25::i;:60::-;60500:89:::0;-1:-1:-1;60605:22:0;;60602:210:::1;;60651:15;::::0;-1:-1:-1;;;;;60651:15:0::1;60643:70;60677:35;60708:3;60677:26;:18:::0;60700:2:::1;60677:22;:26::i;:35::-;60643:70;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;60736:17:0::1;::::0;-1:-1:-1;;;;;60736:17:0::1;60728:72;60764:35;60795:3;60764:26;:18:::0;60787:2:::1;60764:22;:26::i;:35::-;60728:72;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;60602:210;60827:17:::0;;60824:94:::1;;60863:11;;;;;;;;;-1:-1:-1::0;;;;;60863:11:0::1;-1:-1:-1::0;;;;;60863:19:0::1;;60890:13;60863:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;60859:59:::0;::::1;60941:14:::0;;60938:112:::1;;60975:7;;;;;;;;;-1:-1:-1::0;;;;;60975:7:0::1;-1:-1:-1::0;;;;;60975:31:0::1;;61014:10;60975:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;60971:68:::0;::::1;61065:13:::0;;61062:65:::1;;61093:34;61106:9;61117;61093:12;:34::i;:::-;-1:-1:-1::0;;51356:16:0;:24;;-1:-1:-1;;51356:24:0;;;-1:-1:-1;;;;;;;;;;;;;58947:2188:0:o;4247:158::-;4305:7;4338:1;4333;:6;;4325:49;;;;-1:-1:-1;;;4325:49:0;;9112:2:1;4325:49:0;;;9094:21:1;9151:2;9131:18;;;9124:30;9190:32;9170:18;;;9163:60;9240:18;;4325:49:0;9084:180:1;4325:49:0;4392:5;4396:1;4392;:5;:::i;18234:539::-;-1:-1:-1;;;;;18340:20:0;;18332:70;;;;-1:-1:-1;;;18332:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18421:23:0;;18413:71;;;;-1:-1:-1;;;18413:71:0;;;;;;;:::i;:::-;18577;18599:6;18577:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18577:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;18557:17:0;;;:9;:17;;;;;;;;;;;:91;;;;18682:20;;;;;;;:32;;18707:6;18682:24;:32::i;:::-;-1:-1:-1;;;;;18659:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;18730:35;13626:25:1;;;18659:20:0;;18730:35;;;;;;13599:18:1;18730:35:0;13581:76:1;61740:513:0;61920:15;;61888:62;;61905:4;;-1:-1:-1;;;;;61920:15:0;61938:11;61888:8;:62::i;:::-;61993:15;;-1:-1:-1;;;;;61993:15:0;:31;62032:9;62065:4;62085:11;61993:15;;62197:7;22466:6;;-1:-1:-1;;;;;22466:6:0;;;;;;22393:87;62197:7;61993:252;;;;;;-1:-1:-1;;;;;;61993:252:0;;;-1:-1:-1;;;;;4947:15:1;;;61993:252:0;;;4929:34:1;4979:18;;;4972:34;;;;5022:18;;;5015:34;;;;5065:18;;;5058:34;5129:15;;;5108:19;;;5101:44;62219:15:0;5161:19:1;;;5154:35;4863:19;;61993:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;61740:513;;:::o;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:2;;164:1;161;154:12;108:2;60:114;;;:::o;179:257::-;238:6;291:2;279:9;270:7;266:23;262:32;259:2;;;312:6;304;297:22;259:2;356:9;343:23;375:31;400:5;375:31;:::i;441:261::-;511:6;564:2;552:9;543:7;539:23;535:32;532:2;;;585:6;577;570:22;532:2;622:9;616:16;641:31;666:5;641:31;:::i;707:398::-;775:6;783;836:2;824:9;815:7;811:23;807:32;804:2;;;857:6;849;842:22;804:2;901:9;888:23;920:31;945:5;920:31;:::i;:::-;970:5;-1:-1:-1;1027:2:1;1012:18;;999:32;1040:33;999:32;1040:33;:::i;:::-;1092:7;1082:17;;;794:311;;;;;:::o;1110:466::-;1187:6;1195;1203;1256:2;1244:9;1235:7;1231:23;1227:32;1224:2;;;1277:6;1269;1262:22;1224:2;1321:9;1308:23;1340:31;1365:5;1340:31;:::i;:::-;1390:5;-1:-1:-1;1447:2:1;1432:18;;1419:32;1460:33;1419:32;1460:33;:::i;:::-;1214:362;;1512:7;;-1:-1:-1;;;1566:2:1;1551:18;;;;1538:32;;1214:362::o;1581:325::-;1646:6;1654;1707:2;1695:9;1686:7;1682:23;1678:32;1675:2;;;1728:6;1720;1713:22;1675:2;1772:9;1759:23;1791:31;1816:5;1791:31;:::i;:::-;1841:5;-1:-1:-1;1865:35:1;1896:2;1881:18;;1865:35;:::i;:::-;1855:45;;1665:241;;;;;:::o;1911:325::-;1979:6;1987;2040:2;2028:9;2019:7;2015:23;2011:32;2008:2;;;2061:6;2053;2046:22;2008:2;2105:9;2092:23;2124:31;2149:5;2124:31;:::i;:::-;2174:5;2226:2;2211:18;;;;2198:32;;-1:-1:-1;;;1998:238:1:o;2241:190::-;2297:6;2350:2;2338:9;2329:7;2325:23;2321:32;2318:2;;;2371:6;2363;2356:22;2318:2;2399:26;2415:9;2399:26;:::i;2436:190::-;2495:6;2548:2;2536:9;2527:7;2523:23;2519:32;2516:2;;;2569:6;2561;2554:22;2516:2;-1:-1:-1;2597:23:1;;2506:120;-1:-1:-1;2506:120:1:o;2631:194::-;2701:6;2754:2;2742:9;2733:7;2729:23;2725:32;2722:2;;;2775:6;2767;2760:22;2722:2;-1:-1:-1;2803:16:1;;2712:113;-1:-1:-1;2712:113:1:o;2830:258::-;2898:6;2906;2959:2;2947:9;2938:7;2934:23;2930:32;2927:2;;;2980:6;2972;2965:22;2927:2;-1:-1:-1;;3008:23:1;;;3078:2;3063:18;;;3050:32;;-1:-1:-1;2917:171:1:o;3093:316::-;3181:6;3189;3197;3250:2;3238:9;3229:7;3225:23;3221:32;3218:2;;;3271:6;3263;3256:22;3218:2;3305:9;3299:16;3289:26;;3355:2;3344:9;3340:18;3334:25;3324:35;;3399:2;3388:9;3384:18;3378:25;3368:35;;3208:201;;;;;:::o;3414:395::-;3500:6;3508;3516;3524;3577:3;3565:9;3556:7;3552:23;3548:33;3545:2;;;3599:6;3591;3584:22;3545:2;-1:-1:-1;;3627:23:1;;;3697:2;3682:18;;3669:32;;-1:-1:-1;3748:2:1;3733:18;;3720:32;;3799:2;3784:18;3771:32;;-1:-1:-1;3535:274:1;-1:-1:-1;3535:274:1:o;6103:603::-;6215:4;6244:2;6273;6262:9;6255:21;6305:6;6299:13;6348:6;6343:2;6332:9;6328:18;6321:34;6373:4;6386:140;6400:6;6397:1;6394:13;6386:140;;;6495:14;;;6491:23;;6485:30;6461:17;;;6480:2;6457:26;6450:66;6415:10;;6386:140;;;6544:6;6541:1;6538:13;6535:2;;;6614:4;6609:2;6600:6;6589:9;6585:22;6581:31;6574:45;6535:2;-1:-1:-1;6690:2:1;6669:15;-1:-1:-1;;6665:29:1;6650:45;;;;6697:2;6646:54;;6224:482;-1:-1:-1;;;6224:482:1:o;6711:399::-;6913:2;6895:21;;;6952:2;6932:18;;;6925:30;6991:34;6986:2;6971:18;;6964:62;-1:-1:-1;;;7057:2:1;7042:18;;7035:33;7100:3;7085:19;;6885:225::o;11617:401::-;11819:2;11801:21;;;11858:2;11838:18;;;11831:30;11897:34;11892:2;11877:18;;11870:62;-1:-1:-1;;;11963:2:1;11948:18;;11941:35;12008:3;11993:19;;11791:227::o;13662:983::-;13924:4;13972:3;13961:9;13957:19;14003:6;13992:9;13985:25;14029:2;14067:6;14062:2;14051:9;14047:18;14040:34;14110:3;14105:2;14094:9;14090:18;14083:31;14134:6;14169;14163:13;14200:6;14192;14185:22;14238:3;14227:9;14223:19;14216:26;;14277:2;14269:6;14265:15;14251:29;;14298:4;14311:195;14325:6;14322:1;14319:13;14311:195;;;14390:13;;-1:-1:-1;;;;;14386:39:1;14374:52;;14481:15;;;;14446:12;;;;14422:1;14340:9;14311:195;;;-1:-1:-1;;;;;;;14562:32:1;;;;14557:2;14542:18;;14535:60;-1:-1:-1;;;14626:3:1;14611:19;14604:35;14523:3;13933:712;-1:-1:-1;;;13933:712:1:o;15092:128::-;15132:3;15163:1;15159:6;15156:1;15153:13;15150:2;;;15169:18;;:::i;:::-;-1:-1:-1;15205:9:1;;15140:80::o;15225:217::-;15265:1;15291;15281:2;;-1:-1:-1;;;15316:31:1;;15370:4;15367:1;15360:15;15398:4;15323:1;15388:15;15281:2;-1:-1:-1;15427:9:1;;15271:171::o;15447:168::-;15487:7;15553:1;15549;15545:6;15541:14;15538:1;15535:21;15530:1;15523:9;15516:17;15512:45;15509:2;;;15560:18;;:::i;:::-;-1:-1:-1;15600:9:1;;15499:116::o;15620:125::-;15660:4;15688:1;15685;15682:8;15679:2;;;15693:18;;:::i;:::-;-1:-1:-1;15730:9:1;;15669:76::o;15750:380::-;15829:1;15825:12;;;;15872;;;15893:2;;15947:4;15939:6;15935:17;15925:27;;15893:2;16000;15992:6;15989:14;15969:18;15966:38;15963:2;;;16046:10;16041:3;16037:20;16034:1;16027:31;16081:4;16078:1;16071:15;16109:4;16106:1;16099:15;15963:2;;15805:325;;;:::o;16135:127::-;16196:10;16191:3;16187:20;16184:1;16177:31;16227:4;16224:1;16217:15;16251:4;16248:1;16241:15;16267:131;-1:-1:-1;;;;;16342:31:1;;16332:42;;16322:2;;16388:1;16385;16378:12;16322:2;16312:86;:::o

Swarm Source

ipfs://90646d5833bc4aff094013872473e84f24c782851dee99c9663f4b956231d598
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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