ETH Price: $3,334.61 (-1.46%)
Gas: 14 Gwei

Token

VINLINK (VINLINK)
 

Overview

Max Total Supply

100,000,000,000 VINLINK

Holders

819 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH (+0.12%)

Onchain Market Cap

$51,794.50

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,018,352.217285388 VINLINK

Value
$0.53 ( ~0.000158938958802109 Eth) [0.0010%]
0xe6dd40721727ba9a676fc19206714be3b9c5939b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Vinlink is a project that aims to transform the automotive industry using blockchain technology.

Market

Volume (24H):$492.05
Market Capitalization:$0.00
Circulating Supply:0.00 VINLINK
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
Vinlink

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-21
*/

// SPDX-License-Identifier: MIT                                                                               
                                                    
pragma solidity 0.8.18;

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

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

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

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

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

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

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

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

interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


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

    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override 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 this function is
     * overridden;
     *
     * 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 override returns (uint8) {
        return 9;
    }

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

library SafeMath {
    /**
     * @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) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * 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);
        uint256 c = a - b;

        return c;
    }

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

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts 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) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts 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) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

contract Ownable is Context {
    address private _owner;

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

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

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

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

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



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

    /**
     * @dev Multiplies two int256 variables and fails on overflow.
     */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    /**
     * @dev Division of two int256 variables and fails on overflow.
     */
    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    /**
     * @dev Subtracts two int256 variables and fails on overflow.
     */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    /**
     * @dev Adds two int256 variables and fails on overflow.
     */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    /**
     * @dev Converts to absolute value, and fails on overflow.
     */
    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }


    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

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


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

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

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

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

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

contract LockToken is Ownable {
    bool public isOpen = false;
    mapping(address => bool) private _whiteList;
    address public tradingEnablerRole;
    
    modifier open(address from, address to) {
        require(isOpen || _whiteList[from] || _whiteList[to], "Not Open");
        _;
    }

    constructor() {
        _whiteList[msg.sender] = true;
        _whiteList[address(this)] = true;
        tradingEnablerRole = owner();
    }

    function enableTrade(bool _enable) external onlyOwner {
        require(tradingEnablerRole == msg.sender, 'incompatible role!');
        isOpen = _enable;
    }

    function renounceTradingEnablerRole() public {
        require(tradingEnablerRole == msg.sender, 'incompatible role!');
        tradingEnablerRole = address(0x0);
    }

    function preTrade(address[] memory _users) external onlyOwner {
        for(uint8 i = 0; i < _users.length; i++) {
            _whiteList[_users[i]] = true;
        }
    }
}

contract Vinlink is ERC20, LockToken {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address public developmentWallet;
    address public treasuryWallet;
    
    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public swapEnabled = true;

    uint256 public buyTotalFees;
    uint256 public buyDevFee;
    uint256 public buyLiquidityFee;
    uint256 public buyTreasury;
    
    uint256 public sellTotalFees;
    uint256 public sellDevFee;
    uint256 public sellLiquidityFee;
    uint256 public sellTreasury;
    
    uint256 public tokensForDev;
    uint256 public tokensForLiquidity;
    uint256 public tokensForTreasury;
    
    /******************/

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

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

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

    event ExcludeFromFees(address indexed account, bool isExcluded);

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

    event developmentWalletUpdated(address indexed newWallet, address indexed oldWallet);
    
    event treasuryWalletUpdated(address indexed newWallet, address indexed oldWallet);

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

    event BuyBackTriggered(uint256 amount);

    constructor() ERC20("VINLINK", "VINLINK") {

        address newOwner = address(msg.sender);
        
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        
        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;
        
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);
        
        uint256 _buyDevFee = 12;
        uint256 _buyLiquidityFee = 12;
        uint256 _buyTreasury = 12;
        
        uint256 _sellDevFee = 12;
        uint256 _sellLiquidityFee = 12;
        uint256 _sellTreasury = 12;
        
        uint256 totalSupply = 100e9 * 1e9;
        
        maxTransactionAmount = 1000000000 * 10e9; // 1% maxTransactionAmountTxn
        swapTokensAtAmount = totalSupply * 5 / 10000; // 0.05% swap wallet
        maxWallet = 1000000000 * 10e9; // 1% max wallet

        buyDevFee = _buyDevFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyTreasury = _buyTreasury;
        buyTotalFees = buyDevFee + buyLiquidityFee + buyTreasury;
        
        sellDevFee = _sellDevFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellTreasury = _sellTreasury;
        sellTotalFees = sellDevFee + sellLiquidityFee + sellTreasury;
        
        developmentWallet = address(0x2d7461c335afaC99A54C859562296bAb655E6060); // set as Development wallet
        treasuryWallet = address(0x841f17161f325c30752d535561D91924a6EB1a95); // set as treasury wallet

        // exclude from paying fees or having max transaction amount
        excludeFromFees(newOwner, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromFees(treasuryWallet, true);
        
        excludeFromMaxTransaction(newOwner, true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(treasuryWallet, true);
        excludeFromMaxTransaction(address(0xdead), true);
        
        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(newOwner, totalSupply);
        transferOwnership(newOwner);
    }

    receive() external payable {

    }
    
     // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount) external onlyOwner returns (bool){
        require(newAmount >= totalSupply() * 1 / 100000, "Swap amount cannot be lower than 0.001% total supply.");
        require(newAmount <= totalSupply() * 5 / 1000, "Swap amount cannot be higher than 0.5% total supply.");
        swapTokensAtAmount = newAmount;
        return true;
    }
    
    function updateMaxAmount(uint256 newNum) external onlyOwner {
        require(newNum >= (totalSupply() * 5 / 1000)/1e9, "Cannot set maxTransactionAmount lower than 0.5%");
        maxTransactionAmount = newNum * (10**9);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require (newNum >= (totalSupply() * 3 / 1000)/1e9, "Cannot set maxWallet lower than 0.3%");
        maxWallet = newNum * (10**9);
    }
    
    function excludeFromMaxTransaction(address updAds, bool isEx) public onlyOwner {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }
    
    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner(){
        swapEnabled = enabled;
    }
    
    function updateBuyFees(uint256 _devFee, uint256 _liquidityFee, uint256 _treasuryFee) external onlyOwner {
        buyDevFee = _devFee;
        buyLiquidityFee = _liquidityFee;
        buyTreasury = _treasuryFee;
        buyTotalFees = buyDevFee + buyLiquidityFee + buyTreasury;
        require(buyTotalFees <= 30, "Must keep fees at 30% or less");
    }
    
    function updateSellFees(uint256 _devFee, uint256 _liquidityFee, uint256 _treasuryFee) external onlyOwner {
        sellDevFee = _devFee;
        sellLiquidityFee = _liquidityFee;
        sellTreasury = _treasuryFee;
        sellTotalFees = sellDevFee + sellLiquidityFee + sellTreasury;
        require(sellTotalFees <= 30, "Must keep fees at 30% or less");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

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

        _setAutomatedMarketMakerPair(pair, value);
    }

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

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updatedevelopmentWallet(address newdevelopmentWallet) external onlyOwner {
        emit developmentWalletUpdated(newdevelopmentWallet, developmentWallet);
        developmentWallet = newdevelopmentWallet;
    }
    
    function updatetreasuryWallet(address newWallet) external onlyOwner {
        emit treasuryWalletUpdated(newWallet, treasuryWallet);
        treasuryWallet = newWallet;
    }
    

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) open(to, from)internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        
         if(amount == 0) {
            super._transfer(from, to, 0);
            return;
        }
        
       
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ){
                 
                //when buy
                if (automatedMarketMakerPairs[from] && !_isExcludedMaxTransactionAmount[to]) {
                        require(amount <= maxTransactionAmount, "Buy transfer amount exceeds the maxTransactionAmount.");
                        require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
                
                //when sell
                else if (automatedMarketMakerPairs[to] && !_isExcludedMaxTransactionAmount[from]) {
                        require(amount <= maxTransactionAmount, "Sell transfer amount exceeds the maxTransactionAmount.");
                }
                else {
                    require(amount + balanceOf(to) <= maxWallet, "Max wallet exceeded");
                }
            }
        
        
        
        uint256 contractTokenBalance = balanceOf(address(this));
        
        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if( 
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;
            
            swapBack();

            swapping = false;
        }
        
        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        
        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if(takeFee){
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0){
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity += fees * sellLiquidityFee / sellTotalFees;
                tokensForTreasury += fees * sellTreasury / sellTotalFees;
                tokensForDev += fees * sellDevFee / sellTotalFees;
            }
            // on buy
            else if(automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForLiquidity += fees * buyLiquidityFee / buyTotalFees;
                tokensForTreasury += fees * buyTreasury / buyTotalFees;
                tokensForDev += fees * buyDevFee / buyTotalFees;
            }
            
            if(fees > 0){    
                super._transfer(from, address(this), fees);
            }
            
            amount -= fees;
        }

        super._transfer(from, to, amount);
    }

    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
            deadAddress,
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForDev + tokensForTreasury;
        
        if(contractBalance == 0 || totalTokensToSwap == 0) {return;}
        
        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = contractBalance * tokensForLiquidity / totalTokensToSwap / 2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);
        
        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH); 
        
        uint256 ethBalance = address(this).balance.sub(initialETHBalance);
        
        uint256 ethForMarketing = ethBalance.mul(tokensForDev).div(totalTokensToSwap);
        uint256 ethForBuyBack = ethBalance.mul(tokensForTreasury).div(totalTokensToSwap);
        
        
        uint256 ethForLiquidity = ethBalance - ethForMarketing - ethForBuyBack;
        
        
        tokensForLiquidity = 0;
        tokensForDev = 0;
        tokensForTreasury = 0;
        
        (bool success,) = address(developmentWallet).call{value: ethForMarketing}("");
        if(liquidityTokens > 0 && ethForLiquidity > 0){
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(amountToSwapForETH, ethForLiquidity, tokensForLiquidity);
        }
        
        // keep leftover ETH for buyback
        (success,) = address(treasuryWallet).call{value: address(this).balance}("");
    }
    
    // useful for buybacks or to reclaim any ETH on the contract in a way that helps holders.
    function buyBackTokens(uint256 ETHAmountInWei) external onlyOwner {
        // generate the uniswap pair path of weth -> eth
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(this);

        // make the swap
        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: ETHAmountInWei}(
            0, // accept any amount of Ethereum
            path,
            address(0xdead),
            block.timestamp
        );
        emit BuyBackTriggered(ETHAmountInWei);
    }

    function withdrawStuckETH() external onlyOwner{
        require (address(this).balance > 0, "Can't withdraw negative or zero");
        payable(owner()).transfer(address(this).balance);
    }

    function removeStuckToken(address _address) external onlyOwner {
        require(_address != address(this), "Can't withdraw tokens destined for liquidity");
        require(IERC20(_address).balanceOf(address(this)) > 0, "Can't withdraw 0");

        IERC20(_address).transfer(owner(), IERC20(_address).balanceOf(address(this)));
    }

}

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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BuyBackTriggered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"developmentWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"treasuryWalletUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ETHAmountInWei","type":"uint256"}],"name":"buyBackTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTreasury","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"developmentWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"preTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeStuckToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceTradingEnablerRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTreasury","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForDev","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForTreasury","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnablerRole","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newdevelopmentWallet","type":"address"}],"name":"updatedevelopmentWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updatetreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c06040526000600560146101000a81548160ff0219169083151502179055506001600d60006101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280600781526020017f56494e4c494e4b000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f56494e4c494e4b000000000000000000000000000000000000000000000000008152508160039081620000c59190620010db565b508060049081620000d79190620010db565b5050506000620000ec6200075a60201b60201c565b905080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506001600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200024b6200076260201b60201c565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060003390506000737a250d5630b4cf539739df2c5dacb4c659f2488d9050620002bc8160016200078c60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200033c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200036291906200122c565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003ca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003f091906200122c565b6040518363ffffffff1660e01b81526004016200040f9291906200126f565b6020604051808303816000875af11580156200042f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200045591906200122c565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250506200049d60a05160016200078c60201b60201c565b620004b260a05160016200088960201b60201c565b6000600c90506000600c90506000600c90506000600c90506000600c90506000600c9050600068056bc75e2d631000009050678ac7230489e80000600a81905550612710600582620005059190620012cb565b62000511919062001345565b600b81905550678ac7230489e80000600c8190555086600f819055508560108190555084601181905550601154601054600f546200055091906200137d565b6200055c91906200137d565b600e819055508360138190555082601481905550816015819055506015546014546013546200058c91906200137d565b6200059891906200137d565b601281905550732d7461c335afac99a54c859562296bab655e6060600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073841f17161f325c30752d535561d91924a6eb1a95600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200065b8960016200092a60201b60201c565b6200066e3060016200092a60201b60201c565b6200068361dead60016200092a60201b60201c565b620006b8600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016200092a60201b60201c565b620006cb8960016200078c60201b60201c565b620006de3060016200078c60201b60201c565b62000713600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016200078c60201b60201c565b6200072861dead60016200078c60201b60201c565b6200073a898262000a7760201b60201c565b6200074b8962000c2560201b60201c565b5050505050505050506200161f565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200079c6200075a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200082e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008259062001419565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b6200093a6200075a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614620009cc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009c39062001419565b60405180910390fd5b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df78260405162000a6b919062001458565b60405180910390a25050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000ae9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000ae090620014c5565b60405180910390fd5b62000afd6000838362000df960201b60201c565b62000b198160025462000dfe60201b62002dc91790919060201c565b60028190555062000b77816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205462000dfe60201b62002dc91790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000c199190620014f8565b60405180910390a35050565b62000c356200075a60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000cc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000cbe9062001419565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000d39576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d30906200158b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b505050565b600080828462000e0f91906200137d565b90508381101562000e57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e4e90620015fd565b60405180910390fd5b8091505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000ee357607f821691505b60208210810362000ef95762000ef862000e9b565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000f637fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000f24565b62000f6f868362000f24565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000fbc62000fb662000fb08462000f87565b62000f91565b62000f87565b9050919050565b6000819050919050565b62000fd88362000f9b565b62000ff062000fe78262000fc3565b84845462000f31565b825550505050565b600090565b6200100762000ff8565b6200101481848462000fcd565b505050565b5b818110156200103c576200103060008262000ffd565b6001810190506200101a565b5050565b601f8211156200108b57620010558162000eff565b620010608462000f14565b8101602085101562001070578190505b620010886200107f8562000f14565b83018262001019565b50505b505050565b600082821c905092915050565b6000620010b06000198460080262001090565b1980831691505092915050565b6000620010cb83836200109d565b9150826002028217905092915050565b620010e68262000e61565b67ffffffffffffffff81111562001102576200110162000e6c565b5b6200110e825462000eca565b6200111b82828562001040565b600060209050601f8311600181146200115357600084156200113e578287015190505b6200114a8582620010bd565b865550620011ba565b601f198416620011638662000eff565b60005b828110156200118d5784890151825560018201915060208501945060208101905062001166565b86831015620011ad5784890151620011a9601f8916826200109d565b8355505b6001600288020188555050505b505050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620011f482620011c7565b9050919050565b6200120681620011e7565b81146200121257600080fd5b50565b6000815190506200122681620011fb565b92915050565b600060208284031215620012455762001244620011c2565b5b6000620012558482850162001215565b91505092915050565b6200126981620011e7565b82525050565b60006040820190506200128660008301856200125e565b6200129560208301846200125e565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620012d88262000f87565b9150620012e58362000f87565b9250828202620012f58162000f87565b915082820484148315176200130f576200130e6200129c565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000620013528262000f87565b91506200135f8362000f87565b92508262001372576200137162001316565b5b828204905092915050565b60006200138a8262000f87565b9150620013978362000f87565b9250828201905080821115620013b257620013b16200129c565b5b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062001401602083620013b8565b91506200140e82620013c9565b602082019050919050565b600060208201905081810360008301526200143481620013f2565b9050919050565b60008115159050919050565b62001452816200143b565b82525050565b60006020820190506200146f600083018462001447565b92915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000620014ad601f83620013b8565b9150620014ba8262001475565b602082019050919050565b60006020820190508181036000830152620014e0816200149e565b9050919050565b620014f28162000f87565b82525050565b60006020820190506200150f6000830184620014e7565b92915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600062001573602683620013b8565b9150620015808262001515565b604082019050919050565b60006020820190508181036000830152620015a68162001564565b9050919050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000620015e5601b83620013b8565b9150620015f282620015ad565b602082019050919050565b600060208201905081810360008301526200161881620015d6565b9050919050565b60805160a051615d3d6200167d600039600081816113da0152611afa01526000818161107b01528181612bcf01528181612cfb0152818161426c0152818161434d015281816143740152818161441001526144370152615d3d6000f3fe60806040526004361061036f5760003560e01c806399ab04a7116101c6578063c8c8ebe4116100f7578063e2f4560511610095578063f5648a4f1161006f578063f5648a4f14610cb9578063f637434214610cd0578063f8b45b0514610cfb578063fc155d1d14610d2657610376565b8063e2f4560514610c3a578063f11a24d314610c65578063f2fde38b14610c9057610376565b8063d257b34f116100d1578063d257b34f14610b6c578063d85ba06314610ba9578063dd62ed3e14610bd4578063e083e92214610c1157610376565b8063c8c8ebe414610aeb578063cbdcfd8114610b16578063cc2ffe7c14610b4157610376565b8063b62496f511610164578063c04a54141161013e578063c04a541414610a45578063c17b5b8c14610a70578063c18bc19514610a99578063c79c04fd14610ac257610376565b8063b62496f5146109b6578063c00f04d1146109f3578063c024666814610a1c57610376565b80639fccce32116101a05780639fccce32146108e6578063a0d82dc514610911578063a457c2d71461093c578063a9059cbb1461097957610376565b806399ab04a71461087b5780639a7a23d6146108925780639c3b4fdc146108bb57610376565b80634626402b116102a057806370a082311161023e5780638095d564116102185780638095d564146107d35780638da5cb5b146107fc578063924de9b71461082757806395d89b411461085057610376565b806370a0823114610756578063715018a6146107935780637571336a146107aa57610376565b80634fbee1931161027a5780634fbee193146106985780635e015739146106d55780636a486a8e146107005780636ddd17131461072b57610376565b80634626402b1461061757806347535d7b1461064257806349bd5a5e1461066d57610376565b806318160ddd1161030d57806327c8f835116102e757806327c8f8351461055b5780632955ede614610586578063313ce567146105af57806339509351146105da57610376565b806318160ddd146104c85780631a8145bb146104f357806323b872dd1461051e57610376565b8063095ea7b311610349578063095ea7b3146103fa578063106b5da11461043757806310d5de53146104605780631694505e1461049d57610376565b806304fdf86f1461037b57806306fdde03146103a45780630805d787146103cf57610376565b3661037657005b600080fd5b34801561038757600080fd5b506103a2600480360381019061039d9190614714565b610d4f565b005b3480156103b057600080fd5b506103b9610e81565b6040516103c691906147dc565b60405180910390f35b3480156103db57600080fd5b506103e4610f13565b6040516103f19190614817565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c919061485e565b610f19565b60405161042e91906148b9565b60405180910390f35b34801561044357600080fd5b5061045e600480360381019061045991906148d4565b610f37565b005b34801561046c57600080fd5b5061048760048036038101906104829190614901565b611059565b60405161049491906148b9565b60405180910390f35b3480156104a957600080fd5b506104b2611079565b6040516104bf919061498d565b60405180910390f35b3480156104d457600080fd5b506104dd61109d565b6040516104ea9190614817565b60405180910390f35b3480156104ff57600080fd5b506105086110a7565b6040516105159190614817565b60405180910390f35b34801561052a57600080fd5b50610545600480360381019061054091906149a8565b6110ad565b60405161055291906148b9565b60405180910390f35b34801561056757600080fd5b50610570611186565b60405161057d9190614a0a565b60405180910390f35b34801561059257600080fd5b506105ad60048036038101906105a89190614901565b61118c565b005b3480156105bb57600080fd5b506105c46112e3565b6040516105d19190614a41565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc919061485e565b6112ec565b60405161060e91906148b9565b60405180910390f35b34801561062357600080fd5b5061062c61139f565b6040516106399190614a0a565b60405180910390f35b34801561064e57600080fd5b506106576113c5565b60405161066491906148b9565b60405180910390f35b34801561067957600080fd5b506106826113d8565b60405161068f9190614a0a565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190614901565b6113fc565b6040516106cc91906148b9565b60405180910390f35b3480156106e157600080fd5b506106ea611452565b6040516106f79190614817565b60405180910390f35b34801561070c57600080fd5b50610715611458565b6040516107229190614817565b60405180910390f35b34801561073757600080fd5b5061074061145e565b60405161074d91906148b9565b60405180910390f35b34801561076257600080fd5b5061077d60048036038101906107789190614901565b611471565b60405161078a9190614817565b60405180910390f35b34801561079f57600080fd5b506107a86114b9565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190614a88565b611611565b005b3480156107df57600080fd5b506107fa60048036038101906107f59190614ac8565b611703565b005b34801561080857600080fd5b5061081161181d565b60405161081e9190614a0a565b60405180910390f35b34801561083357600080fd5b5061084e60048036038101906108499190614b1b565b611847565b005b34801561085c57600080fd5b506108656118fb565b60405161087291906147dc565b60405180910390f35b34801561088757600080fd5b5061089061198d565b005b34801561089e57600080fd5b506108b960048036038101906108b49190614a88565b611a61565b005b3480156108c757600080fd5b506108d0611b94565b6040516108dd9190614817565b60405180910390f35b3480156108f257600080fd5b506108fb611b9a565b6040516109089190614817565b60405180910390f35b34801561091d57600080fd5b50610926611ba0565b6040516109339190614817565b60405180910390f35b34801561094857600080fd5b50610963600480360381019061095e919061485e565b611ba6565b60405161097091906148b9565b60405180910390f35b34801561098557600080fd5b506109a0600480360381019061099b919061485e565b611c73565b6040516109ad91906148b9565b60405180910390f35b3480156109c257600080fd5b506109dd60048036038101906109d89190614901565b611c91565b6040516109ea91906148b9565b60405180910390f35b3480156109ff57600080fd5b50610a1a6004803603810190610a159190614b1b565b611cb1565b005b348015610a2857600080fd5b50610a436004803603810190610a3e9190614a88565b611df5565b005b348015610a5157600080fd5b50610a5a611f35565b604051610a679190614a0a565b60405180910390f35b348015610a7c57600080fd5b50610a976004803603810190610a929190614ac8565b611f5b565b005b348015610aa557600080fd5b50610ac06004803603810190610abb91906148d4565b612075565b005b348015610ace57600080fd5b50610ae96004803603810190610ae49190614901565b612197565b005b348015610af757600080fd5b50610b006122ee565b604051610b0d9190614817565b60405180910390f35b348015610b2257600080fd5b50610b2b6122f4565b604051610b389190614a0a565b60405180910390f35b348015610b4d57600080fd5b50610b5661231a565b604051610b639190614817565b60405180910390f35b348015610b7857600080fd5b50610b936004803603810190610b8e91906148d4565b612320565b604051610ba091906148b9565b60405180910390f35b348015610bb557600080fd5b50610bbe612490565b604051610bcb9190614817565b60405180910390f35b348015610be057600080fd5b50610bfb6004803603810190610bf69190614b48565b612496565b604051610c089190614817565b60405180910390f35b348015610c1d57600080fd5b50610c386004803603810190610c339190614901565b61251d565b005b348015610c4657600080fd5b50610c4f6127e0565b604051610c5c9190614817565b60405180910390f35b348015610c7157600080fd5b50610c7a6127e6565b604051610c879190614817565b60405180910390f35b348015610c9c57600080fd5b50610cb76004803603810190610cb29190614901565b6127ec565b005b348015610cc557600080fd5b50610cce6129b2565b005b348015610cdc57600080fd5b50610ce5612adc565b604051610cf29190614817565b60405180910390f35b348015610d0757600080fd5b50610d10612ae2565b604051610d1d9190614817565b60405180910390f35b348015610d3257600080fd5b50610d4d6004803603810190610d4891906148d4565b612ae8565b005b610d57612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd90614bd4565b60405180910390fd5b60005b81518160ff161015610e7d57600160066000848460ff1681518110610e1157610e10614bf4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610e7590614c52565b915050610de9565b5050565b606060038054610e9090614caa565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebc90614caa565b8015610f095780601f10610ede57610100808354040283529160200191610f09565b820191906000526020600020905b815481529060010190602001808311610eec57829003601f168201915b5050505050905090565b60115481565b6000610f2d610f26612e27565b8484612e2f565b6001905092915050565b610f3f612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc590614bd4565b60405180910390fd5b633b9aca006103e86005610fe061109d565b610fea9190614cdb565b610ff49190614d4c565b610ffe9190614d4c565b811015611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103790614def565b60405180910390fd5b633b9aca00816110509190614cdb565b600a8190555050565b601a6020528060005260406000206000915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600254905090565b60175481565b60006110ba848484612ff8565b61117b846110c6612e27565b61117685604051806060016040528060288152602001615cbb60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061112c612e27565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a659092919063ffffffff16565b612e2f565b600190509392505050565b61dead81565b611194612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121a90614bd4565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f02f8a1483978974a6412ba3a67040b4daa4fc0dfe9439a7295f9a9538394f63560405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006009905090565b60006113956112f9612e27565b84611390856001600061130a612e27565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dc990919063ffffffff16565b612e2f565b6001905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560149054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60155481565b60125481565b600d60009054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114c1612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154790614bd4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611619612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f90614bd4565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61170b612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190614bd4565b60405180910390fd5b82600f819055508160108190555080601181905550601154601054600f546117c29190614e0f565b6117cc9190614e0f565b600e81905550601e600e541115611818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180f90614e8f565b60405180910390fd5b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61184f612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590614bd4565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b60606004805461190a90614caa565b80601f016020809104026020016040519081016040528092919081815260200182805461193690614caa565b80156119835780601f1061195857610100808354040283529160200191611983565b820191906000526020600020905b81548152906001019060200180831161196657829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1490614efb565b60405180910390fd5b6000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611a69612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aef90614bd4565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7d90614f8d565b60405180910390fd5b611b908282613ac9565b5050565b600f5481565b60165481565b60135481565b6000611c69611bb3612e27565b84611c6485604051806060016040528060258152602001615ce36025913960016000611bdd612e27565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a659092919063ffffffff16565b612e2f565b6001905092915050565b6000611c87611c80612e27565b8484612ff8565b6001905092915050565b601b6020528060005260406000206000915054906101000a900460ff1681565b611cb9612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f90614bd4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcf90614efb565b60405180910390fd5b80600560146101000a81548160ff02191690831515021790555050565b611dfd612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390614bd4565b60405180910390fd5b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611f2991906148b9565b60405180910390a25050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f63612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe990614bd4565b60405180910390fd5b82601381905550816014819055508060158190555060155460145460135461201a9190614e0f565b6120249190614e0f565b601281905550601e6012541115612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206790614e8f565b60405180910390fd5b505050565b61207d612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461210c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210390614bd4565b60405180910390fd5b633b9aca006103e8600361211e61109d565b6121289190614cdb565b6121329190614d4c565b61213c9190614d4c565b81101561217e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121759061501f565b60405180910390fd5b633b9aca008161218e9190614cdb565b600c8190555050565b61219f612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461222e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222590614bd4565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ffaf1b77ed79f6e898c44dd8ab36b330c7b2fd39bcaab05ed6362480df870396560405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60185481565b600061232a612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b090614bd4565b60405180910390fd5b620186a060016123c761109d565b6123d19190614cdb565b6123db9190614d4c565b82101561241d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612414906150b1565b60405180910390fd5b6103e8600561242a61109d565b6124349190614cdb565b61243e9190614d4c565b821115612480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247790615143565b60405180910390fd5b81600b8190555060019050919050565b600e5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612525612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ab90614bd4565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612622576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612619906151d5565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161265d9190614a0a565b602060405180830381865afa15801561267a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269e919061520a565b116126de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d590615283565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61270261181d565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161273b9190614a0a565b602060405180830381865afa158015612758573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277c919061520a565b6040518363ffffffff1660e01b81526004016127999291906152a3565b6020604051808303816000875af11580156127b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127dc91906152e1565b5050565b600b5481565b60105481565b6127f4612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287a90614bd4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036128f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e990615380565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6129ba612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4090614bd4565b60405180910390fd5b60004711612a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a83906153ec565b60405180910390fd5b612a9461181d565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612ad9573d6000803e3d6000fd5b50565b60145481565b600c5481565b612af0612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7690614bd4565b60405180910390fd5b6000600267ffffffffffffffff811115612b9c57612b9b614573565b5b604051908082528060200260200182016040528015612bca5781602001602082028036833780820191505090505b5090507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c5c9190615421565b81600081518110612c7057612c6f614bf4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110612cbf57612cbe614bf4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b6f9de958360008461dead426040518663ffffffff1660e01b8152600401612d5c9493929190615547565b6000604051808303818588803b158015612d7557600080fd5b505af1158015612d89573d6000803e3d6000fd5b50505050507fa017c1567cfcdd2d750a8c01e39fe2a846bcebc293c7d078477014d68482056882604051612dbd9190614817565b60405180910390a15050565b6000808284612dd89190614e0f565b905083811015612e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e14906155df565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9590615671565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0490615703565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612feb9190614817565b60405180910390a3505050565b8183600560149054906101000a900460ff168061305e5750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806130b25750600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6130f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e89061576f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315790615801565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036131cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c690615893565b60405180910390fd5b600083036131e8576131e385856000613b6a565b613a5e565b6131f061181d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561325e575061322e61181d565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156132975750600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156132d1575061dead73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156132ea5750600760149054906101000a900460ff16155b1561358657601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156133925750601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561343957600a548311156133dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d390615925565b60405180910390fd5b600c546133e885611471565b846133f39190614e0f565b1115613434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342b90615991565b60405180910390fd5b613585565b601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156134dc5750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561352b57600a54831115613526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351d90615a23565b60405180910390fd5b613584565b600c5461353785611471565b846135429190614e0f565b1115613583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357a90615991565b60405180910390fd5b5b5b5b600061359130611471565b90506000600b5482101590508080156135b65750600d60009054906101000a900460ff165b80156135cf5750600760149054906101000a900460ff16155b80156136255750601b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561367b5750601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156136d15750601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613715576001600760146101000a81548160ff0219169083151502179055506136f9613dfd565b6000600760146101000a81548160ff0219169083151502179055505b6000600760149054906101000a900460ff16159050601960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806137cb5750601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156137d557600090505b60008115613a4e57601b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561383857506000601254115b156139055761386560646138576012548a6140ba90919063ffffffff16565b61413490919063ffffffff16565b9050601254601454826138789190614cdb565b6138829190614d4c565b601760008282546138939190614e0f565b92505081905550601254601554826138ab9190614cdb565b6138b59190614d4c565b601860008282546138c69190614e0f565b92505081905550601254601354826138de9190614cdb565b6138e89190614d4c565b601660008282546138f99190614e0f565b92505081905550613a2a565b601b60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561396057506000600e54115b15613a295761398d606461397f600e548a6140ba90919063ffffffff16565b61413490919063ffffffff16565b9050600e54601054826139a09190614cdb565b6139aa9190614d4c565b601760008282546139bb9190614e0f565b92505081905550600e54601154826139d39190614cdb565b6139dd9190614d4c565b601860008282546139ee9190614e0f565b92505081905550600e54600f5482613a069190614cdb565b613a109190614d4c565b60166000828254613a219190614e0f565b925050819055505b5b6000811115613a3f57613a3e893083613b6a565b5b8087613a4b9190615a43565b96505b613a59898989613b6a565b505050505b5050505050565b6000838311158290613aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aa491906147dc565b60405180910390fd5b5060008385613abc9190615a43565b9050809150509392505050565b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bd090615801565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c3f90615893565b60405180910390fd5b613c5383838361417e565b613cbe81604051806060016040528060268152602001615c95602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a659092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613d51816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dc990919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613df09190614817565b60405180910390a3505050565b6000613e0830611471565b90506000601854601654601754613e1f9190614e0f565b613e299190614e0f565b90506000821480613e3a5750600081145b15613e465750506140b8565b600060028260175485613e599190614cdb565b613e639190614d4c565b613e6d9190614d4c565b90506000613e84828561418390919063ffffffff16565b90506000479050613e94826141cd565b6000613ea9824761418390919063ffffffff16565b90506000613ed486613ec6601654856140ba90919063ffffffff16565b61413490919063ffffffff16565b90506000613eff87613ef1601854866140ba90919063ffffffff16565b61413490919063ffffffff16565b90506000818385613f109190615a43565b613f1a9190615a43565b90506000601781905550600060168190555060006018819055506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1684604051613f7c90615aa8565b60006040518083038185875af1925050503d8060008114613fb9576040519150601f19603f3d011682016040523d82523d6000602084013e613fbe565b606091505b50509050600088118015613fd25750600082115b1561401f57613fe1888361440a565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561878360175460405161401693929190615abd565b60405180910390a15b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161406590615aa8565b60006040518083038185875af1925050503d80600081146140a2576040519150601f19603f3d011682016040523d82523d6000602084013e6140a7565b606091505b505080915050505050505050505050505b565b60008083036140cc576000905061412e565b600082846140da9190614cdb565b90508284826140e99190614d4c565b14614129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161412090615b66565b60405180910390fd5b809150505b92915050565b600061417683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506144e6565b905092915050565b505050565b60006141c583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a65565b905092915050565b6000600267ffffffffffffffff8111156141ea576141e9614573565b5b6040519080825280602002602001820160405280156142185781602001602082028036833780820191505090505b50905030816000815181106142305761422f614bf4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156142d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142f99190615421565b8160018151811061430d5761430c614bf4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050614372307f000000000000000000000000000000000000000000000000000000000000000084612e2f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016143d4959493929190615b86565b600060405180830381600087803b1580156143ee57600080fd5b505af1158015614402573d6000803e3d6000fd5b505050505050565b614435307f000000000000000000000000000000000000000000000000000000000000000084612e2f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008061dead426040518863ffffffff1660e01b815260040161449c96959493929190615be0565b60606040518083038185885af11580156144ba573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906144df9190615c41565b5050505050565b6000808311829061452d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161452491906147dc565b60405180910390fd5b506000838561453c9190614d4c565b9050809150509392505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6145ab82614562565b810181811067ffffffffffffffff821117156145ca576145c9614573565b5b80604052505050565b60006145dd614549565b90506145e982826145a2565b919050565b600067ffffffffffffffff82111561460957614608614573565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061464a8261461f565b9050919050565b61465a8161463f565b811461466557600080fd5b50565b60008135905061467781614651565b92915050565b600061469061468b846145ee565b6145d3565b905080838252602082019050602084028301858111156146b3576146b261461a565b5b835b818110156146dc57806146c88882614668565b8452602084019350506020810190506146b5565b5050509392505050565b600082601f8301126146fb576146fa61455d565b5b813561470b84826020860161467d565b91505092915050565b60006020828403121561472a57614729614553565b5b600082013567ffffffffffffffff81111561474857614747614558565b5b614754848285016146e6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561479757808201518184015260208101905061477c565b60008484015250505050565b60006147ae8261475d565b6147b88185614768565b93506147c8818560208601614779565b6147d181614562565b840191505092915050565b600060208201905081810360008301526147f681846147a3565b905092915050565b6000819050919050565b614811816147fe565b82525050565b600060208201905061482c6000830184614808565b92915050565b61483b816147fe565b811461484657600080fd5b50565b60008135905061485881614832565b92915050565b6000806040838503121561487557614874614553565b5b600061488385828601614668565b925050602061489485828601614849565b9150509250929050565b60008115159050919050565b6148b38161489e565b82525050565b60006020820190506148ce60008301846148aa565b92915050565b6000602082840312156148ea576148e9614553565b5b60006148f884828501614849565b91505092915050565b60006020828403121561491757614916614553565b5b600061492584828501614668565b91505092915050565b6000819050919050565b600061495361494e6149498461461f565b61492e565b61461f565b9050919050565b600061496582614938565b9050919050565b60006149778261495a565b9050919050565b6149878161496c565b82525050565b60006020820190506149a2600083018461497e565b92915050565b6000806000606084860312156149c1576149c0614553565b5b60006149cf86828701614668565b93505060206149e086828701614668565b92505060406149f186828701614849565b9150509250925092565b614a048161463f565b82525050565b6000602082019050614a1f60008301846149fb565b92915050565b600060ff82169050919050565b614a3b81614a25565b82525050565b6000602082019050614a566000830184614a32565b92915050565b614a658161489e565b8114614a7057600080fd5b50565b600081359050614a8281614a5c565b92915050565b60008060408385031215614a9f57614a9e614553565b5b6000614aad85828601614668565b9250506020614abe85828601614a73565b9150509250929050565b600080600060608486031215614ae157614ae0614553565b5b6000614aef86828701614849565b9350506020614b0086828701614849565b9250506040614b1186828701614849565b9150509250925092565b600060208284031215614b3157614b30614553565b5b6000614b3f84828501614a73565b91505092915050565b60008060408385031215614b5f57614b5e614553565b5b6000614b6d85828601614668565b9250506020614b7e85828601614668565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614bbe602083614768565b9150614bc982614b88565b602082019050919050565b60006020820190508181036000830152614bed81614bb1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c5d82614a25565b915060ff8203614c7057614c6f614c23565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614cc257607f821691505b602082108103614cd557614cd4614c7b565b5b50919050565b6000614ce6826147fe565b9150614cf1836147fe565b9250828202614cff816147fe565b91508282048414831517614d1657614d15614c23565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614d57826147fe565b9150614d62836147fe565b925082614d7257614d71614d1d565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e35250000000000000000000000000000000000602082015250565b6000614dd9602f83614768565b9150614de482614d7d565b604082019050919050565b60006020820190508181036000830152614e0881614dcc565b9050919050565b6000614e1a826147fe565b9150614e25836147fe565b9250828201905080821115614e3d57614e3c614c23565b5b92915050565b7f4d757374206b656570206665657320617420333025206f72206c657373000000600082015250565b6000614e79601d83614768565b9150614e8482614e43565b602082019050919050565b60006020820190508181036000830152614ea881614e6c565b9050919050565b7f696e636f6d70617469626c6520726f6c65210000000000000000000000000000600082015250565b6000614ee5601283614768565b9150614ef082614eaf565b602082019050919050565b60006020820190508181036000830152614f1481614ed8565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000614f77603983614768565b9150614f8282614f1b565b604082019050919050565b60006020820190508181036000830152614fa681614f6a565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e332500000000000000000000000000000000000000000000000000000000602082015250565b6000615009602483614768565b915061501482614fad565b604082019050919050565b6000602082019050818103600083015261503881614ffc565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b600061509b603583614768565b91506150a68261503f565b604082019050919050565b600060208201905081810360008301526150ca8161508e565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b600061512d603483614768565b9150615138826150d1565b604082019050919050565b6000602082019050818103600083015261515c81615120565b9050919050565b7f43616e277420776974686472617720746f6b656e732064657374696e6564206660008201527f6f72206c69717569646974790000000000000000000000000000000000000000602082015250565b60006151bf602c83614768565b91506151ca82615163565b604082019050919050565b600060208201905081810360008301526151ee816151b2565b9050919050565b60008151905061520481614832565b92915050565b6000602082840312156152205761521f614553565b5b600061522e848285016151f5565b91505092915050565b7f43616e2774207769746864726177203000000000000000000000000000000000600082015250565b600061526d601083614768565b915061527882615237565b602082019050919050565b6000602082019050818103600083015261529c81615260565b9050919050565b60006040820190506152b860008301856149fb565b6152c56020830184614808565b9392505050565b6000815190506152db81614a5c565b92915050565b6000602082840312156152f7576152f6614553565b5b6000615305848285016152cc565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061536a602683614768565b91506153758261530e565b604082019050919050565b600060208201905081810360008301526153998161535d565b9050919050565b7f43616e2774207769746864726177206e65676174697665206f72207a65726f00600082015250565b60006153d6601f83614768565b91506153e1826153a0565b602082019050919050565b60006020820190508181036000830152615405816153c9565b9050919050565b60008151905061541b81614651565b92915050565b60006020828403121561543757615436614553565b5b60006154458482850161540c565b91505092915050565b6000819050919050565b600061547361546e6154698461544e565b61492e565b6147fe565b9050919050565b61548381615458565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6154be8161463f565b82525050565b60006154d083836154b5565b60208301905092915050565b6000602082019050919050565b60006154f482615489565b6154fe8185615494565b9350615509836154a5565b8060005b8381101561553a57815161552188826154c4565b975061552c836154dc565b92505060018101905061550d565b5085935050505092915050565b600060808201905061555c600083018761547a565b818103602083015261556e81866154e9565b905061557d60408301856149fb565b61558a6060830184614808565b95945050505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b60006155c9601b83614768565b91506155d482615593565b602082019050919050565b600060208201905081810360008301526155f8816155bc565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061565b602483614768565b9150615666826155ff565b604082019050919050565b6000602082019050818103600083015261568a8161564e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006156ed602283614768565b91506156f882615691565b604082019050919050565b6000602082019050818103600083015261571c816156e0565b9050919050565b7f4e6f74204f70656e000000000000000000000000000000000000000000000000600082015250565b6000615759600883614768565b915061576482615723565b602082019050919050565b600060208201905081810360008301526157888161574c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006157eb602583614768565b91506157f68261578f565b604082019050919050565b6000602082019050818103600083015261581a816157de565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061587d602383614768565b915061588882615821565b604082019050919050565b600060208201905081810360008301526158ac81615870565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b600061590f603583614768565b915061591a826158b3565b604082019050919050565b6000602082019050818103600083015261593e81615902565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b600061597b601383614768565b915061598682615945565b602082019050919050565b600060208201905081810360008301526159aa8161596e565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b6000615a0d603683614768565b9150615a18826159b1565b604082019050919050565b60006020820190508181036000830152615a3c81615a00565b9050919050565b6000615a4e826147fe565b9150615a59836147fe565b9250828203905081811115615a7157615a70614c23565b5b92915050565b600081905092915050565b50565b6000615a92600083615a77565b9150615a9d82615a82565b600082019050919050565b6000615ab382615a85565b9150819050919050565b6000606082019050615ad26000830186614808565b615adf6020830185614808565b615aec6040830184614808565b949350505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615b50602183614768565b9150615b5b82615af4565b604082019050919050565b60006020820190508181036000830152615b7f81615b43565b9050919050565b600060a082019050615b9b6000830188614808565b615ba8602083018761547a565b8181036040830152615bba81866154e9565b9050615bc960608301856149fb565b615bd66080830184614808565b9695505050505050565b600060c082019050615bf560008301896149fb565b615c026020830188614808565b615c0f604083018761547a565b615c1c606083018661547a565b615c2960808301856149fb565b615c3660a0830184614808565b979650505050505050565b600080600060608486031215615c5a57615c59614553565b5b6000615c68868287016151f5565b9350506020615c79868287016151f5565b9250506040615c8a868287016151f5565b915050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204a6feeebac059b73d12390b9bc026fba11b48fd9997eb85a688cb6c22f4df8c964736f6c63430008120033

Deployed Bytecode

0x60806040526004361061036f5760003560e01c806399ab04a7116101c6578063c8c8ebe4116100f7578063e2f4560511610095578063f5648a4f1161006f578063f5648a4f14610cb9578063f637434214610cd0578063f8b45b0514610cfb578063fc155d1d14610d2657610376565b8063e2f4560514610c3a578063f11a24d314610c65578063f2fde38b14610c9057610376565b8063d257b34f116100d1578063d257b34f14610b6c578063d85ba06314610ba9578063dd62ed3e14610bd4578063e083e92214610c1157610376565b8063c8c8ebe414610aeb578063cbdcfd8114610b16578063cc2ffe7c14610b4157610376565b8063b62496f511610164578063c04a54141161013e578063c04a541414610a45578063c17b5b8c14610a70578063c18bc19514610a99578063c79c04fd14610ac257610376565b8063b62496f5146109b6578063c00f04d1146109f3578063c024666814610a1c57610376565b80639fccce32116101a05780639fccce32146108e6578063a0d82dc514610911578063a457c2d71461093c578063a9059cbb1461097957610376565b806399ab04a71461087b5780639a7a23d6146108925780639c3b4fdc146108bb57610376565b80634626402b116102a057806370a082311161023e5780638095d564116102185780638095d564146107d35780638da5cb5b146107fc578063924de9b71461082757806395d89b411461085057610376565b806370a0823114610756578063715018a6146107935780637571336a146107aa57610376565b80634fbee1931161027a5780634fbee193146106985780635e015739146106d55780636a486a8e146107005780636ddd17131461072b57610376565b80634626402b1461061757806347535d7b1461064257806349bd5a5e1461066d57610376565b806318160ddd1161030d57806327c8f835116102e757806327c8f8351461055b5780632955ede614610586578063313ce567146105af57806339509351146105da57610376565b806318160ddd146104c85780631a8145bb146104f357806323b872dd1461051e57610376565b8063095ea7b311610349578063095ea7b3146103fa578063106b5da11461043757806310d5de53146104605780631694505e1461049d57610376565b806304fdf86f1461037b57806306fdde03146103a45780630805d787146103cf57610376565b3661037657005b600080fd5b34801561038757600080fd5b506103a2600480360381019061039d9190614714565b610d4f565b005b3480156103b057600080fd5b506103b9610e81565b6040516103c691906147dc565b60405180910390f35b3480156103db57600080fd5b506103e4610f13565b6040516103f19190614817565b60405180910390f35b34801561040657600080fd5b50610421600480360381019061041c919061485e565b610f19565b60405161042e91906148b9565b60405180910390f35b34801561044357600080fd5b5061045e600480360381019061045991906148d4565b610f37565b005b34801561046c57600080fd5b5061048760048036038101906104829190614901565b611059565b60405161049491906148b9565b60405180910390f35b3480156104a957600080fd5b506104b2611079565b6040516104bf919061498d565b60405180910390f35b3480156104d457600080fd5b506104dd61109d565b6040516104ea9190614817565b60405180910390f35b3480156104ff57600080fd5b506105086110a7565b6040516105159190614817565b60405180910390f35b34801561052a57600080fd5b50610545600480360381019061054091906149a8565b6110ad565b60405161055291906148b9565b60405180910390f35b34801561056757600080fd5b50610570611186565b60405161057d9190614a0a565b60405180910390f35b34801561059257600080fd5b506105ad60048036038101906105a89190614901565b61118c565b005b3480156105bb57600080fd5b506105c46112e3565b6040516105d19190614a41565b60405180910390f35b3480156105e657600080fd5b5061060160048036038101906105fc919061485e565b6112ec565b60405161060e91906148b9565b60405180910390f35b34801561062357600080fd5b5061062c61139f565b6040516106399190614a0a565b60405180910390f35b34801561064e57600080fd5b506106576113c5565b60405161066491906148b9565b60405180910390f35b34801561067957600080fd5b506106826113d8565b60405161068f9190614a0a565b60405180910390f35b3480156106a457600080fd5b506106bf60048036038101906106ba9190614901565b6113fc565b6040516106cc91906148b9565b60405180910390f35b3480156106e157600080fd5b506106ea611452565b6040516106f79190614817565b60405180910390f35b34801561070c57600080fd5b50610715611458565b6040516107229190614817565b60405180910390f35b34801561073757600080fd5b5061074061145e565b60405161074d91906148b9565b60405180910390f35b34801561076257600080fd5b5061077d60048036038101906107789190614901565b611471565b60405161078a9190614817565b60405180910390f35b34801561079f57600080fd5b506107a86114b9565b005b3480156107b657600080fd5b506107d160048036038101906107cc9190614a88565b611611565b005b3480156107df57600080fd5b506107fa60048036038101906107f59190614ac8565b611703565b005b34801561080857600080fd5b5061081161181d565b60405161081e9190614a0a565b60405180910390f35b34801561083357600080fd5b5061084e60048036038101906108499190614b1b565b611847565b005b34801561085c57600080fd5b506108656118fb565b60405161087291906147dc565b60405180910390f35b34801561088757600080fd5b5061089061198d565b005b34801561089e57600080fd5b506108b960048036038101906108b49190614a88565b611a61565b005b3480156108c757600080fd5b506108d0611b94565b6040516108dd9190614817565b60405180910390f35b3480156108f257600080fd5b506108fb611b9a565b6040516109089190614817565b60405180910390f35b34801561091d57600080fd5b50610926611ba0565b6040516109339190614817565b60405180910390f35b34801561094857600080fd5b50610963600480360381019061095e919061485e565b611ba6565b60405161097091906148b9565b60405180910390f35b34801561098557600080fd5b506109a0600480360381019061099b919061485e565b611c73565b6040516109ad91906148b9565b60405180910390f35b3480156109c257600080fd5b506109dd60048036038101906109d89190614901565b611c91565b6040516109ea91906148b9565b60405180910390f35b3480156109ff57600080fd5b50610a1a6004803603810190610a159190614b1b565b611cb1565b005b348015610a2857600080fd5b50610a436004803603810190610a3e9190614a88565b611df5565b005b348015610a5157600080fd5b50610a5a611f35565b604051610a679190614a0a565b60405180910390f35b348015610a7c57600080fd5b50610a976004803603810190610a929190614ac8565b611f5b565b005b348015610aa557600080fd5b50610ac06004803603810190610abb91906148d4565b612075565b005b348015610ace57600080fd5b50610ae96004803603810190610ae49190614901565b612197565b005b348015610af757600080fd5b50610b006122ee565b604051610b0d9190614817565b60405180910390f35b348015610b2257600080fd5b50610b2b6122f4565b604051610b389190614a0a565b60405180910390f35b348015610b4d57600080fd5b50610b5661231a565b604051610b639190614817565b60405180910390f35b348015610b7857600080fd5b50610b936004803603810190610b8e91906148d4565b612320565b604051610ba091906148b9565b60405180910390f35b348015610bb557600080fd5b50610bbe612490565b604051610bcb9190614817565b60405180910390f35b348015610be057600080fd5b50610bfb6004803603810190610bf69190614b48565b612496565b604051610c089190614817565b60405180910390f35b348015610c1d57600080fd5b50610c386004803603810190610c339190614901565b61251d565b005b348015610c4657600080fd5b50610c4f6127e0565b604051610c5c9190614817565b60405180910390f35b348015610c7157600080fd5b50610c7a6127e6565b604051610c879190614817565b60405180910390f35b348015610c9c57600080fd5b50610cb76004803603810190610cb29190614901565b6127ec565b005b348015610cc557600080fd5b50610cce6129b2565b005b348015610cdc57600080fd5b50610ce5612adc565b604051610cf29190614817565b60405180910390f35b348015610d0757600080fd5b50610d10612ae2565b604051610d1d9190614817565b60405180910390f35b348015610d3257600080fd5b50610d4d6004803603810190610d4891906148d4565b612ae8565b005b610d57612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ddd90614bd4565b60405180910390fd5b60005b81518160ff161015610e7d57600160066000848460ff1681518110610e1157610e10614bf4565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610e7590614c52565b915050610de9565b5050565b606060038054610e9090614caa565b80601f0160208091040260200160405190810160405280929190818152602001828054610ebc90614caa565b8015610f095780601f10610ede57610100808354040283529160200191610f09565b820191906000526020600020905b815481529060010190602001808311610eec57829003601f168201915b5050505050905090565b60115481565b6000610f2d610f26612e27565b8484612e2f565b6001905092915050565b610f3f612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc590614bd4565b60405180910390fd5b633b9aca006103e86005610fe061109d565b610fea9190614cdb565b610ff49190614d4c565b610ffe9190614d4c565b811015611040576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103790614def565b60405180910390fd5b633b9aca00816110509190614cdb565b600a8190555050565b601a6020528060005260406000206000915054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6000600254905090565b60175481565b60006110ba848484612ff8565b61117b846110c6612e27565b61117685604051806060016040528060288152602001615cbb60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600061112c612e27565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a659092919063ffffffff16565b612e2f565b600190509392505050565b61dead81565b611194612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121a90614bd4565b60405180910390fd5b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f02f8a1483978974a6412ba3a67040b4daa4fc0dfe9439a7295f9a9538394f63560405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006009905090565b60006113956112f9612e27565b84611390856001600061130a612e27565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dc990919063ffffffff16565b612e2f565b6001905092915050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560149054906101000a900460ff1681565b7f000000000000000000000000d20a4c12d7041f9495f93dabb5426dd409e7d35481565b6000601960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60155481565b60125481565b600d60009054906101000a900460ff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6114c1612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611550576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154790614bd4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611619612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f90614bd4565b60405180910390fd5b80601a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61170b612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461179a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179190614bd4565b60405180910390fd5b82600f819055508160108190555080601181905550601154601054600f546117c29190614e0f565b6117cc9190614e0f565b600e81905550601e600e541115611818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180f90614e8f565b60405180910390fd5b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61184f612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590614bd4565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b60606004805461190a90614caa565b80601f016020809104026020016040519081016040528092919081815260200182805461193690614caa565b80156119835780601f1061195857610100808354040283529160200191611983565b820191906000526020600020905b81548152906001019060200180831161196657829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a1490614efb565b60405180910390fd5b6000600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611a69612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611af8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aef90614bd4565b60405180910390fd5b7f000000000000000000000000d20a4c12d7041f9495f93dabb5426dd409e7d35473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611b86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7d90614f8d565b60405180910390fd5b611b908282613ac9565b5050565b600f5481565b60165481565b60135481565b6000611c69611bb3612e27565b84611c6485604051806060016040528060258152602001615ce36025913960016000611bdd612e27565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a659092919063ffffffff16565b612e2f565b6001905092915050565b6000611c87611c80612e27565b8484612ff8565b6001905092915050565b601b6020528060005260406000206000915054906101000a900460ff1681565b611cb9612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f90614bd4565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611dd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcf90614efb565b60405180910390fd5b80600560146101000a81548160ff02191690831515021790555050565b611dfd612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8390614bd4565b60405180910390fd5b80601960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df782604051611f2991906148b9565b60405180910390a25050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f63612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ff2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe990614bd4565b60405180910390fd5b82601381905550816014819055508060158190555060155460145460135461201a9190614e0f565b6120249190614e0f565b601281905550601e6012541115612070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206790614e8f565b60405180910390fd5b505050565b61207d612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461210c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210390614bd4565b60405180910390fd5b633b9aca006103e8600361211e61109d565b6121289190614cdb565b6121329190614d4c565b61213c9190614d4c565b81101561217e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121759061501f565b60405180910390fd5b633b9aca008161218e9190614cdb565b600c8190555050565b61219f612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461222e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222590614bd4565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167ffaf1b77ed79f6e898c44dd8ab36b330c7b2fd39bcaab05ed6362480df870396560405160405180910390a380600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600a5481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60185481565b600061232a612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b090614bd4565b60405180910390fd5b620186a060016123c761109d565b6123d19190614cdb565b6123db9190614d4c565b82101561241d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612414906150b1565b60405180910390fd5b6103e8600561242a61109d565b6124349190614cdb565b61243e9190614d4c565b821115612480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161247790615143565b60405180910390fd5b81600b8190555060019050919050565b600e5481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612525612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146125b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ab90614bd4565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612622576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612619906151d5565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161265d9190614a0a565b602060405180830381865afa15801561267a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061269e919061520a565b116126de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d590615283565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61270261181d565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161273b9190614a0a565b602060405180830381865afa158015612758573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061277c919061520a565b6040518363ffffffff1660e01b81526004016127999291906152a3565b6020604051808303816000875af11580156127b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127dc91906152e1565b5050565b600b5481565b60105481565b6127f4612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287a90614bd4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036128f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e990615380565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6129ba612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4090614bd4565b60405180910390fd5b60004711612a8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a83906153ec565b60405180910390fd5b612a9461181d565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015612ad9573d6000803e3d6000fd5b50565b60145481565b600c5481565b612af0612e27565b73ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b7690614bd4565b60405180910390fd5b6000600267ffffffffffffffff811115612b9c57612b9b614573565b5b604051908082528060200260200182016040528015612bca5781602001602082028036833780820191505090505b5090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c5c9190615421565b81600081518110612c7057612c6f614bf4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250503081600181518110612cbf57612cbe614bf4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663b6f9de958360008461dead426040518663ffffffff1660e01b8152600401612d5c9493929190615547565b6000604051808303818588803b158015612d7557600080fd5b505af1158015612d89573d6000803e3d6000fd5b50505050507fa017c1567cfcdd2d750a8c01e39fe2a846bcebc293c7d078477014d68482056882604051612dbd9190614817565b60405180910390a15050565b6000808284612dd89190614e0f565b905083811015612e1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e14906155df565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9590615671565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0490615703565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612feb9190614817565b60405180910390a3505050565b8183600560149054906101000a900460ff168061305e5750600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b806130b25750600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6130f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130e89061576f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315790615801565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036131cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131c690615893565b60405180910390fd5b600083036131e8576131e385856000613b6a565b613a5e565b6131f061181d565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415801561325e575061322e61181d565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156132975750600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156132d1575061dead73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b80156132ea5750600760149054906101000a900460ff16155b1561358657601b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156133925750601a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561343957600a548311156133dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d390615925565b60405180910390fd5b600c546133e885611471565b846133f39190614e0f565b1115613434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161342b90615991565b60405180910390fd5b613585565b601b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156134dc5750601a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b1561352b57600a54831115613526576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161351d90615a23565b60405180910390fd5b613584565b600c5461353785611471565b846135429190614e0f565b1115613583576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357a90615991565b60405180910390fd5b5b5b5b600061359130611471565b90506000600b5482101590508080156135b65750600d60009054906101000a900460ff165b80156135cf5750600760149054906101000a900460ff16155b80156136255750601b60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561367b5750601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b80156136d15750601960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15613715576001600760146101000a81548160ff0219169083151502179055506136f9613dfd565b6000600760146101000a81548160ff0219169083151502179055505b6000600760149054906101000a900460ff16159050601960008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806137cb5750601960008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156137d557600090505b60008115613a4e57601b60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561383857506000601254115b156139055761386560646138576012548a6140ba90919063ffffffff16565b61413490919063ffffffff16565b9050601254601454826138789190614cdb565b6138829190614d4c565b601760008282546138939190614e0f565b92505081905550601254601554826138ab9190614cdb565b6138b59190614d4c565b601860008282546138c69190614e0f565b92505081905550601254601354826138de9190614cdb565b6138e89190614d4c565b601660008282546138f99190614e0f565b92505081905550613a2a565b601b60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16801561396057506000600e54115b15613a295761398d606461397f600e548a6140ba90919063ffffffff16565b61413490919063ffffffff16565b9050600e54601054826139a09190614cdb565b6139aa9190614d4c565b601760008282546139bb9190614e0f565b92505081905550600e54601154826139d39190614cdb565b6139dd9190614d4c565b601860008282546139ee9190614e0f565b92505081905550600e54600f5482613a069190614cdb565b613a109190614d4c565b60166000828254613a219190614e0f565b925050819055505b5b6000811115613a3f57613a3e893083613b6a565b5b8087613a4b9190615a43565b96505b613a59898989613b6a565b505050505b5050505050565b6000838311158290613aad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aa491906147dc565b60405180910390fd5b5060008385613abc9190615a43565b9050809150509392505050565b80601b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015158273ffffffffffffffffffffffffffffffffffffffff167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab60405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bd090615801565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613c48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c3f90615893565b60405180910390fd5b613c5383838361417e565b613cbe81604051806060016040528060268152602001615c95602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a659092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613d51816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612dc990919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613df09190614817565b60405180910390a3505050565b6000613e0830611471565b90506000601854601654601754613e1f9190614e0f565b613e299190614e0f565b90506000821480613e3a5750600081145b15613e465750506140b8565b600060028260175485613e599190614cdb565b613e639190614d4c565b613e6d9190614d4c565b90506000613e84828561418390919063ffffffff16565b90506000479050613e94826141cd565b6000613ea9824761418390919063ffffffff16565b90506000613ed486613ec6601654856140ba90919063ffffffff16565b61413490919063ffffffff16565b90506000613eff87613ef1601854866140ba90919063ffffffff16565b61413490919063ffffffff16565b90506000818385613f109190615a43565b613f1a9190615a43565b90506000601781905550600060168190555060006018819055506000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1684604051613f7c90615aa8565b60006040518083038185875af1925050503d8060008114613fb9576040519150601f19603f3d011682016040523d82523d6000602084013e613fbe565b606091505b50509050600088118015613fd25750600082115b1561401f57613fe1888361440a565b7f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb561878360175460405161401693929190615abd565b60405180910390a15b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161406590615aa8565b60006040518083038185875af1925050503d80600081146140a2576040519150601f19603f3d011682016040523d82523d6000602084013e6140a7565b606091505b505080915050505050505050505050505b565b60008083036140cc576000905061412e565b600082846140da9190614cdb565b90508284826140e99190614d4c565b14614129576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161412090615b66565b60405180910390fd5b809150505b92915050565b600061417683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506144e6565b905092915050565b505050565b60006141c583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a65565b905092915050565b6000600267ffffffffffffffff8111156141ea576141e9614573565b5b6040519080825280602002602001820160405280156142185781602001602082028036833780820191505090505b50905030816000815181106142305761422f614bf4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156142d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142f99190615421565b8160018151811061430d5761430c614bf4565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050614372307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612e2f565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016143d4959493929190615b86565b600060405180830381600087803b1580156143ee57600080fd5b505af1158015614402573d6000803e3d6000fd5b505050505050565b614435307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612e2f565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663f305d71982308560008061dead426040518863ffffffff1660e01b815260040161449c96959493929190615be0565b60606040518083038185885af11580156144ba573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906144df9190615c41565b5050505050565b6000808311829061452d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161452491906147dc565b60405180910390fd5b506000838561453c9190614d4c565b9050809150509392505050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6145ab82614562565b810181811067ffffffffffffffff821117156145ca576145c9614573565b5b80604052505050565b60006145dd614549565b90506145e982826145a2565b919050565b600067ffffffffffffffff82111561460957614608614573565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061464a8261461f565b9050919050565b61465a8161463f565b811461466557600080fd5b50565b60008135905061467781614651565b92915050565b600061469061468b846145ee565b6145d3565b905080838252602082019050602084028301858111156146b3576146b261461a565b5b835b818110156146dc57806146c88882614668565b8452602084019350506020810190506146b5565b5050509392505050565b600082601f8301126146fb576146fa61455d565b5b813561470b84826020860161467d565b91505092915050565b60006020828403121561472a57614729614553565b5b600082013567ffffffffffffffff81111561474857614747614558565b5b614754848285016146e6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561479757808201518184015260208101905061477c565b60008484015250505050565b60006147ae8261475d565b6147b88185614768565b93506147c8818560208601614779565b6147d181614562565b840191505092915050565b600060208201905081810360008301526147f681846147a3565b905092915050565b6000819050919050565b614811816147fe565b82525050565b600060208201905061482c6000830184614808565b92915050565b61483b816147fe565b811461484657600080fd5b50565b60008135905061485881614832565b92915050565b6000806040838503121561487557614874614553565b5b600061488385828601614668565b925050602061489485828601614849565b9150509250929050565b60008115159050919050565b6148b38161489e565b82525050565b60006020820190506148ce60008301846148aa565b92915050565b6000602082840312156148ea576148e9614553565b5b60006148f884828501614849565b91505092915050565b60006020828403121561491757614916614553565b5b600061492584828501614668565b91505092915050565b6000819050919050565b600061495361494e6149498461461f565b61492e565b61461f565b9050919050565b600061496582614938565b9050919050565b60006149778261495a565b9050919050565b6149878161496c565b82525050565b60006020820190506149a2600083018461497e565b92915050565b6000806000606084860312156149c1576149c0614553565b5b60006149cf86828701614668565b93505060206149e086828701614668565b92505060406149f186828701614849565b9150509250925092565b614a048161463f565b82525050565b6000602082019050614a1f60008301846149fb565b92915050565b600060ff82169050919050565b614a3b81614a25565b82525050565b6000602082019050614a566000830184614a32565b92915050565b614a658161489e565b8114614a7057600080fd5b50565b600081359050614a8281614a5c565b92915050565b60008060408385031215614a9f57614a9e614553565b5b6000614aad85828601614668565b9250506020614abe85828601614a73565b9150509250929050565b600080600060608486031215614ae157614ae0614553565b5b6000614aef86828701614849565b9350506020614b0086828701614849565b9250506040614b1186828701614849565b9150509250925092565b600060208284031215614b3157614b30614553565b5b6000614b3f84828501614a73565b91505092915050565b60008060408385031215614b5f57614b5e614553565b5b6000614b6d85828601614668565b9250506020614b7e85828601614668565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614bbe602083614768565b9150614bc982614b88565b602082019050919050565b60006020820190508181036000830152614bed81614bb1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c5d82614a25565b915060ff8203614c7057614c6f614c23565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614cc257607f821691505b602082108103614cd557614cd4614c7b565b5b50919050565b6000614ce6826147fe565b9150614cf1836147fe565b9250828202614cff816147fe565b91508282048414831517614d1657614d15614c23565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614d57826147fe565b9150614d62836147fe565b925082614d7257614d71614d1d565b5b828204905092915050565b7f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060008201527f6c6f776572207468616e20302e35250000000000000000000000000000000000602082015250565b6000614dd9602f83614768565b9150614de482614d7d565b604082019050919050565b60006020820190508181036000830152614e0881614dcc565b9050919050565b6000614e1a826147fe565b9150614e25836147fe565b9250828201905080821115614e3d57614e3c614c23565b5b92915050565b7f4d757374206b656570206665657320617420333025206f72206c657373000000600082015250565b6000614e79601d83614768565b9150614e8482614e43565b602082019050919050565b60006020820190508181036000830152614ea881614e6c565b9050919050565b7f696e636f6d70617469626c6520726f6c65210000000000000000000000000000600082015250565b6000614ee5601283614768565b9150614ef082614eaf565b602082019050919050565b60006020820190508181036000830152614f1481614ed8565b9050919050565b7f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060008201527f6175746f6d617465644d61726b65744d616b6572506169727300000000000000602082015250565b6000614f77603983614768565b9150614f8282614f1b565b604082019050919050565b60006020820190508181036000830152614fa681614f6a565b9050919050565b7f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e2060008201527f302e332500000000000000000000000000000000000000000000000000000000602082015250565b6000615009602483614768565b915061501482614fad565b604082019050919050565b6000602082019050818103600083015261503881614ffc565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60008201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b600061509b603583614768565b91506150a68261503f565b604082019050919050565b600060208201905081810360008301526150ca8161508e565b9050919050565b7f5377617020616d6f756e742063616e6e6f74206265206869676865722074686160008201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b600061512d603483614768565b9150615138826150d1565b604082019050919050565b6000602082019050818103600083015261515c81615120565b9050919050565b7f43616e277420776974686472617720746f6b656e732064657374696e6564206660008201527f6f72206c69717569646974790000000000000000000000000000000000000000602082015250565b60006151bf602c83614768565b91506151ca82615163565b604082019050919050565b600060208201905081810360008301526151ee816151b2565b9050919050565b60008151905061520481614832565b92915050565b6000602082840312156152205761521f614553565b5b600061522e848285016151f5565b91505092915050565b7f43616e2774207769746864726177203000000000000000000000000000000000600082015250565b600061526d601083614768565b915061527882615237565b602082019050919050565b6000602082019050818103600083015261529c81615260565b9050919050565b60006040820190506152b860008301856149fb565b6152c56020830184614808565b9392505050565b6000815190506152db81614a5c565b92915050565b6000602082840312156152f7576152f6614553565b5b6000615305848285016152cc565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061536a602683614768565b91506153758261530e565b604082019050919050565b600060208201905081810360008301526153998161535d565b9050919050565b7f43616e2774207769746864726177206e65676174697665206f72207a65726f00600082015250565b60006153d6601f83614768565b91506153e1826153a0565b602082019050919050565b60006020820190508181036000830152615405816153c9565b9050919050565b60008151905061541b81614651565b92915050565b60006020828403121561543757615436614553565b5b60006154458482850161540c565b91505092915050565b6000819050919050565b600061547361546e6154698461544e565b61492e565b6147fe565b9050919050565b61548381615458565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6154be8161463f565b82525050565b60006154d083836154b5565b60208301905092915050565b6000602082019050919050565b60006154f482615489565b6154fe8185615494565b9350615509836154a5565b8060005b8381101561553a57815161552188826154c4565b975061552c836154dc565b92505060018101905061550d565b5085935050505092915050565b600060808201905061555c600083018761547a565b818103602083015261556e81866154e9565b905061557d60408301856149fb565b61558a6060830184614808565b95945050505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b60006155c9601b83614768565b91506155d482615593565b602082019050919050565b600060208201905081810360008301526155f8816155bc565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061565b602483614768565b9150615666826155ff565b604082019050919050565b6000602082019050818103600083015261568a8161564e565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006156ed602283614768565b91506156f882615691565b604082019050919050565b6000602082019050818103600083015261571c816156e0565b9050919050565b7f4e6f74204f70656e000000000000000000000000000000000000000000000000600082015250565b6000615759600883614768565b915061576482615723565b602082019050919050565b600060208201905081810360008301526157888161574c565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006157eb602583614768565b91506157f68261578f565b604082019050919050565b6000602082019050818103600083015261581a816157de565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061587d602383614768565b915061588882615821565b604082019050919050565b600060208201905081810360008301526158ac81615870565b9050919050565b7f427579207472616e7366657220616d6f756e742065786365656473207468652060008201527f6d61785472616e73616374696f6e416d6f756e742e0000000000000000000000602082015250565b600061590f603583614768565b915061591a826158b3565b604082019050919050565b6000602082019050818103600083015261593e81615902565b9050919050565b7f4d61782077616c6c657420657863656564656400000000000000000000000000600082015250565b600061597b601383614768565b915061598682615945565b602082019050919050565b600060208201905081810360008301526159aa8161596e565b9050919050565b7f53656c6c207472616e7366657220616d6f756e7420657863656564732074686560008201527f206d61785472616e73616374696f6e416d6f756e742e00000000000000000000602082015250565b6000615a0d603683614768565b9150615a18826159b1565b604082019050919050565b60006020820190508181036000830152615a3c81615a00565b9050919050565b6000615a4e826147fe565b9150615a59836147fe565b9250828203905081811115615a7157615a70614c23565b5b92915050565b600081905092915050565b50565b6000615a92600083615a77565b9150615a9d82615a82565b600082019050919050565b6000615ab382615a85565b9150819050919050565b6000606082019050615ad26000830186614808565b615adf6020830185614808565b615aec6040830184614808565b949350505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000615b50602183614768565b9150615b5b82615af4565b604082019050919050565b60006020820190508181036000830152615b7f81615b43565b9050919050565b600060a082019050615b9b6000830188614808565b615ba8602083018761547a565b8181036040830152615bba81866154e9565b9050615bc960608301856149fb565b615bd66080830184614808565b9695505050505050565b600060c082019050615bf560008301896149fb565b615c026020830188614808565b615c0f604083018761547a565b615c1c606083018661547a565b615c2960808301856149fb565b615c3660a0830184614808565b979650505050505050565b600080600060608486031215615c5a57615c59614553565b5b6000615c68868287016151f5565b9350506020615c79868287016151f5565b9250506040615c8a868287016151f5565b915050925092509256fe45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212204a6feeebac059b73d12390b9bc026fba11b48fd9997eb85a688cb6c22f4df8c964736f6c63430008120033

Deployed Bytecode Sourcemap

30428:15031:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30245:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7590:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31039:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9756:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35387:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31483:64;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30507:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8709:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31257:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10407:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30610:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37826:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8552:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11171:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30741:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29470:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30565:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38017:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31183:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31078:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30898:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8880:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22054:148;;;;;;;;;;;;;:::i;:::-;;35850:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36207:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21412:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36094:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7809:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30066:171;;;;;;;;;;;;;:::i;:::-;;37144:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30971:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31223:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31113:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11892:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9220:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31705:58;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29895:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36954:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30702:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36578:368;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35624:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37592:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30783:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29553:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31297:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34989:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30937:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9458:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45115:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30825:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31002:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22357:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44913:194;;;;;;;;;;;;;:::i;:::-;;31145:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30865:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44330:575;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30245:176;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;30322:7:::1;30318:96;30339:6;:13;30335:1;:17;;;30318:96;;;30398:4;30374:10;:21;30385:6;30392:1;30385:9;;;;;;;;;;:::i;:::-;;;;;;;;30374:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;30354:3;;;;;:::i;:::-;;;;30318:96;;;;30245:176:::0;:::o;7590:100::-;7644:13;7677:5;7670:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7590:100;:::o;31039:26::-;;;;:::o;9756:169::-;9839:4;9856:39;9865:12;:10;:12::i;:::-;9879:7;9888:6;9856:8;:39::i;:::-;9913:4;9906:11;;9756:169;;;;:::o;35387:229::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35503:3:::1;35497:4;35493:1;35477:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;35476:30;;;;:::i;:::-;35466:6;:40;;35458:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;35602:5;35592:6;:16;;;;:::i;:::-;35569:20;:39;;;;35387:229:::0;:::o;31483:64::-;;;;;;;;;;;;;;;;;;;;;;:::o;30507:51::-;;;:::o;8709:108::-;8770:7;8797:12;;8790:19;;8709:108;:::o;31257:33::-;;;;:::o;10407:355::-;10547:4;10564:36;10574:6;10582:9;10593:6;10564:9;:36::i;:::-;10611:121;10620:6;10628:12;:10;:12::i;:::-;10642:89;10680:6;10642:89;;;;;;;;;;;;;;;;;:11;:19;10654:6;10642:19;;;;;;;;;;;;;;;:33;10662:12;:10;:12::i;:::-;10642:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;10611:8;:121::i;:::-;10750:4;10743:11;;10407:355;;;;;:::o;30610:53::-;30656:6;30610:53;:::o;37826:177::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37943:14:::1;;;;;;;;;;;37910:48;;37932:9;37910:48;;;;;;;;;;;;37986:9;37969:14;;:26;;;;;;;;;;;;;;;;;;37826:177:::0;:::o;8552:92::-;8610:5;8635:1;8628:8;;8552:92;:::o;11171:218::-;11259:4;11276:83;11285:12;:10;:12::i;:::-;11299:7;11308:50;11347:10;11308:11;:25;11320:12;:10;:12::i;:::-;11308:25;;;;;;;;;;;;;;;:34;11334:7;11308:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;11276:8;:83::i;:::-;11377:4;11370:11;;11171:218;;;;:::o;30741:29::-;;;;;;;;;;;;;:::o;29470:26::-;;;;;;;;;;;;;:::o;30565:38::-;;;:::o;38017:125::-;38082:4;38106:19;:28;38126:7;38106:28;;;;;;;;;;;;;;;;;;;;;;;;;38099:35;;38017:125;;;:::o;31183:27::-;;;;:::o;31078:28::-;;;;:::o;30898:30::-;;;;;;;;;;;;;:::o;8880:127::-;8954:7;8981:9;:18;8991:7;8981:18;;;;;;;;;;;;;;;;8974:25;;8880:127;;;:::o;22054:148::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22161:1:::1;22124:40;;22145:6;;;;;;;;;;;22124:40;;;;;;;;;;;;22192:1;22175:6;;:19;;;;;;;;;;;;;;;;;;22054:148::o:0;35850:144::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35982:4:::1;35940:31;:39;35972:6;35940:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35850:144:::0;;:::o;36207:359::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36334:7:::1;36322:9;:19;;;;36370:13;36352:15;:31;;;;36408:12;36394:11;:26;;;;36476:11;;36458:15;;36446:9;;:27;;;;:::i;:::-;:41;;;;:::i;:::-;36431:12;:56;;;;36522:2;36506:12;;:18;;36498:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;36207:359:::0;;;:::o;21412:79::-;21450:7;21477:6;;;;;;;;;;;21470:13;;21412:79;:::o;36094:101::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36180:7:::1;36166:11;;:21;;;;;;;;;;;;;;;;;;36094:101:::0;:::o;7809:104::-;7865:13;7898:7;7891:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7809:104;:::o;30066:171::-;30152:10;30130:32;;:18;;;;;;;;;;;:32;;;30122:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;30225:3;30196:18;;:33;;;;;;;;;;;;;;;;;;30066:171::o;37144:244::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37251:13:::1;37243:21;;:4;:21;;::::0;37235:91:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;37339:41;37368:4;37374:5;37339:28;:41::i;:::-;37144:244:::0;;:::o;30971:24::-;;;;:::o;31223:27::-;;;;:::o;31113:25::-;;;;:::o;11892:269::-;11985:4;12002:129;12011:12;:10;:12::i;:::-;12025:7;12034:96;12073:15;12034:96;;;;;;;;;;;;;;;;;:11;:25;12046:12;:10;:12::i;:::-;12034:25;;;;;;;;;;;;;;;:34;12060:7;12034:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;12002:8;:129::i;:::-;12149:4;12142:11;;11892:269;;;;:::o;9220:175::-;9306:4;9323:42;9333:12;:10;:12::i;:::-;9347:9;9358:6;9323:9;:42::i;:::-;9383:4;9376:11;;9220:175;;;;:::o;31705:58::-;;;;;;;;;;;;;;;;;;;;;;:::o;29895:163::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29990:10:::1;29968:32;;:18;;;;;;;;;;;:32;;;29960:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;30043:7;30034:6;;:16;;;;;;;;;;;;;;;;;;29895:163:::0;:::o;36954:182::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37070:8:::1;37039:19;:28;37059:7;37039:28;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;37110:7;37094:34;;;37119:8;37094:34;;;;;;:::i;:::-;;;;;;;;36954:182:::0;;:::o;30702:32::-;;;;;;;;;;;;;:::o;36578:368::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;36707:7:::1;36694:10;:20;;;;36744:13;36725:16;:32;;;;36783:12;36768;:27;;;;36854:12;;36835:16;;36822:10;;:29;;;;:::i;:::-;:44;;;;:::i;:::-;36806:13;:60;;;;36902:2;36885:13;;:19;;36877:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;36578:368:::0;;;:::o;35624:214::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35747:3:::1;35741:4;35737:1;35721:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;35720:30;;;;:::i;:::-;35710:6;:40;;35701:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;35824:5;35814:6;:16;;;;:::i;:::-;35802:9;:28;;;;35624:214:::0;:::o;37592:222::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;37737:17:::1;;;;;;;;;;;37690:65;;37715:20;37690:65;;;;;;;;;;;;37786:20;37766:17;;:40;;;;;;;;;;;;;;;;;;37592:222:::0;:::o;30783:35::-;;;;:::o;29553:33::-;;;;;;;;;;;;;:::o;31297:32::-;;;;:::o;34989:386::-;35070:4;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;35127:6:::1;35123:1;35107:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:26;;;;:::i;:::-;35094:9;:39;;35086:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;35243:4;35239:1;35223:13;:11;:13::i;:::-;:17;;;;:::i;:::-;:24;;;;:::i;:::-;35210:9;:37;;35202:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;35336:9;35315:18;:30;;;;35363:4;35356:11;;34989:386:::0;;;:::o;30937:27::-;;;;:::o;9458:151::-;9547:7;9574:11;:18;9586:5;9574:18;;;;;;;;;;;;;;;:27;9593:7;9574:27;;;;;;;;;;;;;;;;9567:34;;9458:151;;;;:::o;45115:339::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45217:4:::1;45197:25;;:8;:25;;::::0;45189:82:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;45334:1;45297:8;45290:26;;;45325:4;45290:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:45;45282:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;45376:8;45369:25;;;45395:7;:5;:7::i;:::-;45411:8;45404:26;;;45439:4;45404:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45369:77;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45115:339:::0;:::o;30825:33::-;;;;:::o;31002:30::-;;;;:::o;22357:244::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22466:1:::1;22446:22;;:8;:22;;::::0;22438:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;22556:8;22527:38;;22548:6;;;;;;;;;;;22527:38;;;;;;;;;;;;22585:8;22576:6;;:17;;;;;;;;;;;;;;;;;;22357:244:::0;:::o;44913:194::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45003:1:::1;44979:21;:25;44970:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;45059:7;:5;:7::i;:::-;45051:25;;:48;45077:21;45051:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;44913:194::o:0;31145:31::-;;;;:::o;30865:24::-;;;;:::o;44330:575::-;21634:12;:10;:12::i;:::-;21624:22;;:6;;;;;;;;;;;:22;;;21616:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;44465:21:::1;44503:1;44489:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44465:40;;44526:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44516:4;44521:1;44516:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;::::0;::::1;44577:4;44559;44564:1;44559:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;::::0;::::1;44621:15;:66;;;44695:14;44725:1;44774:4;44801:6;44823:15;44621:228;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;44865:32;44882:14;44865:32;;;;;;:::i;:::-;;;;;;;;44396:509;44330:575:::0;:::o;16456:181::-;16514:7;16534:9;16550:1;16546;:5;;;;:::i;:::-;16534:17;;16575:1;16570;:6;;16562:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;16628:1;16621:8;;;16456:181;;;;:::o;226:98::-;279:7;306:10;299:17;;226:98;:::o;15078:380::-;15231:1;15214:19;;:5;:19;;;15206:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15312:1;15293:21;;:7;:21;;;15285:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15396:6;15366:11;:18;15378:5;15366:18;;;;;;;;;;;;;;;:27;15385:7;15366:27;;;;;;;;;;;;;;;:36;;;;15434:7;15418:32;;15427:5;15418:32;;;15443:6;15418:32;;;;;;:::i;:::-;;;;;;;;15078:380;;;:::o;38150:3350::-;38250:2;38254:4;29658:6;;;;;;;;;;;:26;;;;29668:10;:16;29679:4;29668:16;;;;;;;;;;;;;;;;;;;;;;;;;29658:26;:44;;;;29688:10;:14;29699:2;29688:14;;;;;;;;;;;;;;;;;;;;;;;;;29658:44;29650:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38312:1:::1;38296:18;;:4;:18;;::::0;38288:68:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;38389:1;38375:16;;:2;:16;;::::0;38367:64:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;38466:1;38456:6;:11:::0;38453:92:::1;;38484:28;38500:4;38506:2;38510:1;38484:15;:28::i;:::-;38527:7;;38453:92;38608:7;:5;:7::i;:::-;38600:15;;:4;:15;;;;:49;;;;;38642:7;:5;:7::i;:::-;38636:13;;:2;:13;;;;38600:49;:86;;;;;38684:1;38670:16;;:2;:16;;;;38600:86;:128;;;;;38721:6;38707:21;;:2;:21;;;;38600:128;:158;;;;;38750:8;;;;;;;;;;;38749:9;38600:158;38578:1014;;;38843:25;:31;38869:4;38843:31;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;38879:31;:35;38911:2;38879:35;;;;;;;;;;;;;;;;;;;;;;;;;38878:36;38843:71;38839:738;;;38961:20;;38951:6;:30;;38943:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;39100:9;;39083:13;39093:2;39083:9;:13::i;:::-;39074:6;:22;;;;:::i;:::-;:35;;39066:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;38839:738;;;39227:25;:29;39253:2;39227:29;;;;;;;;;;;;;;;;;;;;;;;;;:71;;;;;39261:31;:37;39293:4;39261:37;;;;;;;;;;;;;;;;;;;;;;;;;39260:38;39227:71;39223:354;;;39345:20;;39335:6;:30;;39327:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;39223:354;;;39524:9;;39507:13;39517:2;39507:9;:13::i;:::-;39498:6;:22;;;;:::i;:::-;:35;;39490:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;39223:354;38839:738;38578:1014;39632:28;39663:24;39681:4;39663:9;:24::i;:::-;39632:55;;39708:12;39747:18;;39723:20;:42;;39708:57;;39796:7;:35;;;;;39820:11;;;;;;;;;;;39796:35;:61;;;;;39849:8;;;;;;;;;;;39848:9;39796:61;:110;;;;;39875:25;:31;39901:4;39875:31;;;;;;;;;;;;;;;;;;;;;;;;;39874:32;39796:110;:153;;;;;39924:19;:25;39944:4;39924:25;;;;;;;;;;;;;;;;;;;;;;;;;39923:26;39796:153;:194;;;;;39967:19;:23;39987:2;39967:23;;;;;;;;;;;;;;;;;;;;;;;;;39966:24;39796:194;39778:338;;;40028:4;40017:8;;:15;;;;;;;;;;;;;;;;;;40061:10;:8;:10::i;:::-;40099:5;40088:8;;:16;;;;;;;;;;;;;;;;;;39778:338;40136:12;40152:8;;;;;;;;;;;40151:9;40136:24;;40261:19;:25;40281:4;40261:25;;;;;;;;;;;;;;;;;;;;;;;;;:52;;;;40290:19;:23;40310:2;40290:23;;;;;;;;;;;;;;;;;;;;;;;;;40261:52;40258:99;;;40340:5;40330:15;;40258:99;40377:12;40481:7;40478:969;;;40532:25;:29;40558:2;40532:29;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;;40581:1;40565:13;;:17;40532:50;40528:744;;;40609:34;40639:3;40609:25;40620:13;;40609:6;:10;;:25;;;;:::i;:::-;:29;;:34;;;;:::i;:::-;40602:41;;40710:13;;40691:16;;40684:4;:23;;;;:::i;:::-;:39;;;;:::i;:::-;40662:18;;:61;;;;;;;:::i;:::-;;;;;;;;40785:13;;40770:12;;40763:4;:19;;;;:::i;:::-;:35;;;;:::i;:::-;40742:17;;:56;;;;;;;:::i;:::-;;;;;;;;40853:13;;40840:10;;40833:4;:17;;;;:::i;:::-;:33;;;;:::i;:::-;40817:12;;:49;;;;;;;:::i;:::-;;;;;;;;40528:744;;;40927:25;:31;40953:4;40927:31;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;;40977:1;40962:12;;:16;40927:51;40924:348;;;41006:33;41035:3;41006:24;41017:12;;41006:6;:10;;:24;;;;:::i;:::-;:28;;:33;;;;:::i;:::-;40999:40;;41105:12;;41087:15;;41080:4;:22;;;;:::i;:::-;:37;;;;:::i;:::-;41058:18;;:59;;;;;;;:::i;:::-;;;;;;;;41178:12;;41164:11;;41157:4;:18;;;;:::i;:::-;:33;;;;:::i;:::-;41136:17;;:54;;;;;;;:::i;:::-;;;;;;;;41244:12;;41232:9;;41225:4;:16;;;;:::i;:::-;:31;;;;:::i;:::-;41209:12;;:47;;;;;;;:::i;:::-;;;;;;;;40924:348;40528:744;41310:1;41303:4;:8;41300:93;;;41335:42;41351:4;41365;41372;41335:15;:42::i;:::-;41300:93;41431:4;41421:14;;;;;:::i;:::-;;;40478:969;41459:33;41475:4;41481:2;41485:6;41459:15;:33::i;:::-;38277:3223;;;;29726:1;38150:3350:::0;;;;;:::o;17359:192::-;17445:7;17478:1;17473;:6;;17481:12;17465:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;17505:9;17521:1;17517;:5;;;;:::i;:::-;17505:17;;17542:1;17535:8;;;17359:192;;;;;:::o;37396:188::-;37513:5;37479:25;:31;37505:4;37479:31;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;37570:5;37536:40;;37564:4;37536:40;;;;;;;;;;;;37396:188;;:::o;12651:573::-;12809:1;12791:20;;:6;:20;;;12783:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;12893:1;12872:23;;:9;:23;;;12864:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;12948:47;12969:6;12977:9;12988:6;12948:20;:47::i;:::-;13028:71;13050:6;13028:71;;;;;;;;;;;;;;;;;:9;:17;13038:6;13028:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;13008:9;:17;13018:6;13008:17;;;;;;;;;;;;;;;:91;;;;13133:32;13158:6;13133:9;:20;13143:9;13133:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;13110:9;:20;13120:9;13110:20;;;;;;;;;;;;;;;:55;;;;13198:9;13181:35;;13190:6;13181:35;;;13209:6;13181:35;;;;;;:::i;:::-;;;;;;;;12651:573;;;:::o;42658:1565::-;42697:23;42723:24;42741:4;42723:9;:24::i;:::-;42697:50;;42758:25;42822:17;;42807:12;;42786:18;;:33;;;;:::i;:::-;:53;;;;:::i;:::-;42758:81;;42882:1;42863:15;:20;:46;;;;42908:1;42887:17;:22;42863:46;42860:60;;;42912:7;;;;42860:60;42989:23;43074:1;43054:17;43033:18;;43015:15;:36;;;;:::i;:::-;:56;;;;:::i;:::-;:60;;;;:::i;:::-;42989:86;;43086:26;43115:36;43135:15;43115;:19;;:36;;;;:::i;:::-;43086:65;;43172:25;43200:21;43172:49;;43234:36;43251:18;43234:16;:36::i;:::-;43292:18;43313:44;43339:17;43313:21;:25;;:44;;;;:::i;:::-;43292:65;;43378:23;43404:51;43437:17;43404:28;43419:12;;43404:10;:14;;:28;;;;:::i;:::-;:32;;:51;;;;:::i;:::-;43378:77;;43466:21;43490:56;43528:17;43490:33;43505:17;;43490:10;:14;;:33;;;;:::i;:::-;:37;;:56;;;;:::i;:::-;43466:80;;43577:23;43634:13;43616:15;43603:10;:28;;;;:::i;:::-;:44;;;;:::i;:::-;43577:70;;43699:1;43678:18;:22;;;;43726:1;43711:12;:16;;;;43758:1;43738:17;:21;;;;43781:12;43806:17;;;;;;;;;;;43798:31;;43837:15;43798:59;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43780:77;;;43889:1;43871:15;:19;:42;;;;;43912:1;43894:15;:19;43871:42;43868:210;;;43929:46;43942:15;43959;43929:12;:46::i;:::-;43995:71;44010:18;44030:15;44047:18;;43995:71;;;;;;;;:::i;:::-;;;;;;;;43868:210;44161:14;;;;;;;;;;;44153:28;;44189:21;44153:62;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44140:75;;;;;42686:1537;;;;;;;;;;42658:1565;:::o;17810:471::-;17868:7;18118:1;18113;:6;18109:47;;18143:1;18136:8;;;;18109:47;18168:9;18184:1;18180;:5;;;;:::i;:::-;18168:17;;18213:1;18208;18204;:5;;;;:::i;:::-;:10;18196:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;18272:1;18265:8;;;17810:471;;;;;:::o;18757:132::-;18815:7;18842:39;18846:1;18849;18842:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;18835:46;;18757:132;;;;:::o;16061:125::-;;;;:::o;16920:136::-;16978:7;17005:43;17009:1;17012;17005:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;16998:50;;16920:136;;;;:::o;41508:601::-;41636:21;41674:1;41660:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41636:40;;41705:4;41687;41692:1;41687:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;41731:15;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41721:4;41726:1;41721:7;;;;;;;;:::i;:::-;;;;;;;:32;;;;;;;;;;;41766:62;41783:4;41798:15;41816:11;41766:8;:62::i;:::-;41867:15;:66;;;41948:11;41974:1;42018:4;42045;42065:15;41867:224;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41563:546;41508:601;:::o;42133:517::-;42281:62;42298:4;42313:15;42331:11;42281:8;:62::i;:::-;42386:15;:31;;;42425:9;42458:4;42478:11;42504:1;42547;30656:6;42616:15;42386:256;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;42133:517;;:::o;19385:278::-;19471:7;19503:1;19499;:5;19506:12;19491:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;19530:9;19546:1;19542;:5;;;;:::i;:::-;19530:17;;19654:1;19647:8;;;19385:278;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:102;498:6;549:2;545:7;540:2;533:5;529:14;525:28;515:38;;457:102;;;:::o;565:180::-;613:77;610:1;603:88;710:4;707:1;700:15;734:4;731:1;724:15;751:281;834:27;856:4;834:27;:::i;:::-;826:6;822:40;964:6;952:10;949:22;928:18;916:10;913:34;910:62;907:88;;;975:18;;:::i;:::-;907:88;1015:10;1011:2;1004:22;794:238;751:281;;:::o;1038:129::-;1072:6;1099:20;;:::i;:::-;1089:30;;1128:33;1156:4;1148:6;1128:33;:::i;:::-;1038:129;;;:::o;1173:311::-;1250:4;1340:18;1332:6;1329:30;1326:56;;;1362:18;;:::i;:::-;1326:56;1412:4;1404:6;1400:17;1392:25;;1472:4;1466;1462:15;1454:23;;1173:311;;;:::o;1490:117::-;1599:1;1596;1589:12;1613:126;1650:7;1690:42;1683:5;1679:54;1668:65;;1613:126;;;:::o;1745:96::-;1782:7;1811:24;1829:5;1811:24;:::i;:::-;1800:35;;1745:96;;;:::o;1847:122::-;1920:24;1938:5;1920:24;:::i;:::-;1913:5;1910:35;1900:63;;1959:1;1956;1949:12;1900:63;1847:122;:::o;1975:139::-;2021:5;2059:6;2046:20;2037:29;;2075:33;2102:5;2075:33;:::i;:::-;1975:139;;;;:::o;2137:710::-;2233:5;2258:81;2274:64;2331:6;2274:64;:::i;:::-;2258:81;:::i;:::-;2249:90;;2359:5;2388:6;2381:5;2374:21;2422:4;2415:5;2411:16;2404:23;;2475:4;2467:6;2463:17;2455:6;2451:30;2504:3;2496:6;2493:15;2490:122;;;2523:79;;:::i;:::-;2490:122;2638:6;2621:220;2655:6;2650:3;2647:15;2621:220;;;2730:3;2759:37;2792:3;2780:10;2759:37;:::i;:::-;2754:3;2747:50;2826:4;2821:3;2817:14;2810:21;;2697:144;2681:4;2676:3;2672:14;2665:21;;2621:220;;;2625:21;2239:608;;2137:710;;;;;:::o;2870:370::-;2941:5;2990:3;2983:4;2975:6;2971:17;2967:27;2957:122;;2998:79;;:::i;:::-;2957:122;3115:6;3102:20;3140:94;3230:3;3222:6;3215:4;3207:6;3203:17;3140:94;:::i;:::-;3131:103;;2947:293;2870:370;;;;:::o;3246:539::-;3330:6;3379:2;3367:9;3358:7;3354:23;3350:32;3347:119;;;3385:79;;:::i;:::-;3347:119;3533:1;3522:9;3518:17;3505:31;3563:18;3555:6;3552:30;3549:117;;;3585:79;;:::i;:::-;3549:117;3690:78;3760:7;3751:6;3740:9;3736:22;3690:78;:::i;:::-;3680:88;;3476:302;3246:539;;;;:::o;3791:99::-;3843:6;3877:5;3871:12;3861:22;;3791:99;;;:::o;3896:169::-;3980:11;4014:6;4009:3;4002:19;4054:4;4049:3;4045:14;4030:29;;3896:169;;;;:::o;4071:246::-;4152:1;4162:113;4176:6;4173:1;4170:13;4162:113;;;4261:1;4256:3;4252:11;4246:18;4242:1;4237:3;4233:11;4226:39;4198:2;4195:1;4191:10;4186:15;;4162:113;;;4309:1;4300:6;4295:3;4291:16;4284:27;4133:184;4071:246;;;:::o;4323:377::-;4411:3;4439:39;4472:5;4439:39;:::i;:::-;4494:71;4558:6;4553:3;4494:71;:::i;:::-;4487:78;;4574:65;4632:6;4627:3;4620:4;4613:5;4609:16;4574:65;:::i;:::-;4664:29;4686:6;4664:29;:::i;:::-;4659:3;4655:39;4648:46;;4415:285;4323:377;;;;:::o;4706:313::-;4819:4;4857:2;4846:9;4842:18;4834:26;;4906:9;4900:4;4896:20;4892:1;4881:9;4877:17;4870:47;4934:78;5007:4;4998:6;4934:78;:::i;:::-;4926:86;;4706:313;;;;:::o;5025:77::-;5062:7;5091:5;5080:16;;5025:77;;;:::o;5108:118::-;5195:24;5213:5;5195:24;:::i;:::-;5190:3;5183:37;5108:118;;:::o;5232:222::-;5325:4;5363:2;5352:9;5348:18;5340:26;;5376:71;5444:1;5433:9;5429:17;5420:6;5376:71;:::i;:::-;5232:222;;;;:::o;5460:122::-;5533:24;5551:5;5533:24;:::i;:::-;5526:5;5523:35;5513:63;;5572:1;5569;5562:12;5513:63;5460:122;:::o;5588:139::-;5634:5;5672:6;5659:20;5650:29;;5688:33;5715:5;5688:33;:::i;:::-;5588:139;;;;:::o;5733:474::-;5801:6;5809;5858:2;5846:9;5837:7;5833:23;5829:32;5826:119;;;5864:79;;:::i;:::-;5826:119;5984:1;6009:53;6054:7;6045:6;6034:9;6030:22;6009:53;:::i;:::-;5999:63;;5955:117;6111:2;6137:53;6182:7;6173:6;6162:9;6158:22;6137:53;:::i;:::-;6127:63;;6082:118;5733:474;;;;;:::o;6213:90::-;6247:7;6290:5;6283:13;6276:21;6265:32;;6213:90;;;:::o;6309:109::-;6390:21;6405:5;6390:21;:::i;:::-;6385:3;6378:34;6309:109;;:::o;6424:210::-;6511:4;6549:2;6538:9;6534:18;6526:26;;6562:65;6624:1;6613:9;6609:17;6600:6;6562:65;:::i;:::-;6424:210;;;;:::o;6640:329::-;6699:6;6748:2;6736:9;6727:7;6723:23;6719:32;6716:119;;;6754:79;;:::i;:::-;6716:119;6874:1;6899:53;6944:7;6935:6;6924:9;6920:22;6899:53;:::i;:::-;6889:63;;6845:117;6640:329;;;;:::o;6975:::-;7034:6;7083:2;7071:9;7062:7;7058:23;7054:32;7051:119;;;7089:79;;:::i;:::-;7051:119;7209:1;7234:53;7279:7;7270:6;7259:9;7255:22;7234:53;:::i;:::-;7224:63;;7180:117;6975:329;;;;:::o;7310:60::-;7338:3;7359:5;7352:12;;7310:60;;;:::o;7376:142::-;7426:9;7459:53;7477:34;7486:24;7504:5;7486:24;:::i;:::-;7477:34;:::i;:::-;7459:53;:::i;:::-;7446:66;;7376:142;;;:::o;7524:126::-;7574:9;7607:37;7638:5;7607:37;:::i;:::-;7594:50;;7524:126;;;:::o;7656:153::-;7733:9;7766:37;7797:5;7766:37;:::i;:::-;7753:50;;7656:153;;;:::o;7815:185::-;7929:64;7987:5;7929:64;:::i;:::-;7924:3;7917:77;7815:185;;:::o;8006:276::-;8126:4;8164:2;8153:9;8149:18;8141:26;;8177:98;8272:1;8261:9;8257:17;8248:6;8177:98;:::i;:::-;8006:276;;;;:::o;8288:619::-;8365:6;8373;8381;8430:2;8418:9;8409:7;8405:23;8401:32;8398:119;;;8436:79;;:::i;:::-;8398:119;8556:1;8581:53;8626:7;8617:6;8606:9;8602:22;8581:53;:::i;:::-;8571:63;;8527:117;8683:2;8709:53;8754:7;8745:6;8734:9;8730:22;8709:53;:::i;:::-;8699:63;;8654:118;8811:2;8837:53;8882:7;8873:6;8862:9;8858:22;8837:53;:::i;:::-;8827:63;;8782:118;8288:619;;;;;:::o;8913:118::-;9000:24;9018:5;9000:24;:::i;:::-;8995:3;8988:37;8913:118;;:::o;9037:222::-;9130:4;9168:2;9157:9;9153:18;9145:26;;9181:71;9249:1;9238:9;9234:17;9225:6;9181:71;:::i;:::-;9037:222;;;;:::o;9265:86::-;9300:7;9340:4;9333:5;9329:16;9318:27;;9265:86;;;:::o;9357:112::-;9440:22;9456:5;9440:22;:::i;:::-;9435:3;9428:35;9357:112;;:::o;9475:214::-;9564:4;9602:2;9591:9;9587:18;9579:26;;9615:67;9679:1;9668:9;9664:17;9655:6;9615:67;:::i;:::-;9475:214;;;;:::o;9695:116::-;9765:21;9780:5;9765:21;:::i;:::-;9758:5;9755:32;9745:60;;9801:1;9798;9791:12;9745:60;9695:116;:::o;9817:133::-;9860:5;9898:6;9885:20;9876:29;;9914:30;9938:5;9914:30;:::i;:::-;9817:133;;;;:::o;9956:468::-;10021:6;10029;10078:2;10066:9;10057:7;10053:23;10049:32;10046:119;;;10084:79;;:::i;:::-;10046:119;10204:1;10229:53;10274:7;10265:6;10254:9;10250:22;10229:53;:::i;:::-;10219:63;;10175:117;10331:2;10357:50;10399:7;10390:6;10379:9;10375:22;10357:50;:::i;:::-;10347:60;;10302:115;9956:468;;;;;:::o;10430:619::-;10507:6;10515;10523;10572:2;10560:9;10551:7;10547:23;10543:32;10540:119;;;10578:79;;:::i;:::-;10540:119;10698:1;10723:53;10768:7;10759:6;10748:9;10744:22;10723:53;:::i;:::-;10713:63;;10669:117;10825:2;10851:53;10896:7;10887:6;10876:9;10872:22;10851:53;:::i;:::-;10841:63;;10796:118;10953:2;10979:53;11024:7;11015:6;11004:9;11000:22;10979:53;:::i;:::-;10969:63;;10924:118;10430:619;;;;;:::o;11055:323::-;11111:6;11160:2;11148:9;11139:7;11135:23;11131:32;11128:119;;;11166:79;;:::i;:::-;11128:119;11286:1;11311:50;11353:7;11344:6;11333:9;11329:22;11311:50;:::i;:::-;11301:60;;11257:114;11055:323;;;;:::o;11384:474::-;11452:6;11460;11509:2;11497:9;11488:7;11484:23;11480:32;11477:119;;;11515:79;;:::i;:::-;11477:119;11635:1;11660:53;11705:7;11696:6;11685:9;11681:22;11660:53;:::i;:::-;11650:63;;11606:117;11762:2;11788:53;11833:7;11824:6;11813:9;11809:22;11788:53;:::i;:::-;11778:63;;11733:118;11384:474;;;;;:::o;11864:182::-;12004:34;12000:1;11992:6;11988:14;11981:58;11864:182;:::o;12052:366::-;12194:3;12215:67;12279:2;12274:3;12215:67;:::i;:::-;12208:74;;12291:93;12380:3;12291:93;:::i;:::-;12409:2;12404:3;12400:12;12393:19;;12052:366;;;:::o;12424:419::-;12590:4;12628:2;12617:9;12613:18;12605:26;;12677:9;12671:4;12667:20;12663:1;12652:9;12648:17;12641:47;12705:131;12831:4;12705:131;:::i;:::-;12697:139;;12424:419;;;:::o;12849:180::-;12897:77;12894:1;12887:88;12994:4;12991:1;12984:15;13018:4;13015:1;13008:15;13035:180;13083:77;13080:1;13073:88;13180:4;13177:1;13170:15;13204:4;13201:1;13194:15;13221:167;13258:3;13281:22;13297:5;13281:22;:::i;:::-;13272:31;;13325:4;13318:5;13315:15;13312:41;;13333:18;;:::i;:::-;13312:41;13380:1;13373:5;13369:13;13362:20;;13221:167;;;:::o;13394:180::-;13442:77;13439:1;13432:88;13539:4;13536:1;13529:15;13563:4;13560:1;13553:15;13580:320;13624:6;13661:1;13655:4;13651:12;13641:22;;13708:1;13702:4;13698:12;13729:18;13719:81;;13785:4;13777:6;13773:17;13763:27;;13719:81;13847:2;13839:6;13836:14;13816:18;13813:38;13810:84;;13866:18;;:::i;:::-;13810:84;13631:269;13580:320;;;:::o;13906:410::-;13946:7;13969:20;13987:1;13969:20;:::i;:::-;13964:25;;14003:20;14021:1;14003:20;:::i;:::-;13998:25;;14058:1;14055;14051:9;14080:30;14098:11;14080:30;:::i;:::-;14069:41;;14259:1;14250:7;14246:15;14243:1;14240:22;14220:1;14213:9;14193:83;14170:139;;14289:18;;:::i;:::-;14170:139;13954:362;13906:410;;;;:::o;14322:180::-;14370:77;14367:1;14360:88;14467:4;14464:1;14457:15;14491:4;14488:1;14481:15;14508:185;14548:1;14565:20;14583:1;14565:20;:::i;:::-;14560:25;;14599:20;14617:1;14599:20;:::i;:::-;14594:25;;14638:1;14628:35;;14643:18;;:::i;:::-;14628:35;14685:1;14682;14678:9;14673:14;;14508:185;;;;:::o;14699:234::-;14839:34;14835:1;14827:6;14823:14;14816:58;14908:17;14903:2;14895:6;14891:15;14884:42;14699:234;:::o;14939:366::-;15081:3;15102:67;15166:2;15161:3;15102:67;:::i;:::-;15095:74;;15178:93;15267:3;15178:93;:::i;:::-;15296:2;15291:3;15287:12;15280:19;;14939:366;;;:::o;15311:419::-;15477:4;15515:2;15504:9;15500:18;15492:26;;15564:9;15558:4;15554:20;15550:1;15539:9;15535:17;15528:47;15592:131;15718:4;15592:131;:::i;:::-;15584:139;;15311:419;;;:::o;15736:191::-;15776:3;15795:20;15813:1;15795:20;:::i;:::-;15790:25;;15829:20;15847:1;15829:20;:::i;:::-;15824:25;;15872:1;15869;15865:9;15858:16;;15893:3;15890:1;15887:10;15884:36;;;15900:18;;:::i;:::-;15884:36;15736:191;;;;:::o;15933:179::-;16073:31;16069:1;16061:6;16057:14;16050:55;15933:179;:::o;16118:366::-;16260:3;16281:67;16345:2;16340:3;16281:67;:::i;:::-;16274:74;;16357:93;16446:3;16357:93;:::i;:::-;16475:2;16470:3;16466:12;16459:19;;16118:366;;;:::o;16490:419::-;16656:4;16694:2;16683:9;16679:18;16671:26;;16743:9;16737:4;16733:20;16729:1;16718:9;16714:17;16707:47;16771:131;16897:4;16771:131;:::i;:::-;16763:139;;16490:419;;;:::o;16915:168::-;17055:20;17051:1;17043:6;17039:14;17032:44;16915:168;:::o;17089:366::-;17231:3;17252:67;17316:2;17311:3;17252:67;:::i;:::-;17245:74;;17328:93;17417:3;17328:93;:::i;:::-;17446:2;17441:3;17437:12;17430:19;;17089:366;;;:::o;17461:419::-;17627:4;17665:2;17654:9;17650:18;17642:26;;17714:9;17708:4;17704:20;17700:1;17689:9;17685:17;17678:47;17742:131;17868:4;17742:131;:::i;:::-;17734:139;;17461:419;;;:::o;17886:244::-;18026:34;18022:1;18014:6;18010:14;18003:58;18095:27;18090:2;18082:6;18078:15;18071:52;17886:244;:::o;18136:366::-;18278:3;18299:67;18363:2;18358:3;18299:67;:::i;:::-;18292:74;;18375:93;18464:3;18375:93;:::i;:::-;18493:2;18488:3;18484:12;18477:19;;18136:366;;;:::o;18508:419::-;18674:4;18712:2;18701:9;18697:18;18689:26;;18761:9;18755:4;18751:20;18747:1;18736:9;18732:17;18725:47;18789:131;18915:4;18789:131;:::i;:::-;18781:139;;18508:419;;;:::o;18933:223::-;19073:34;19069:1;19061:6;19057:14;19050:58;19142:6;19137:2;19129:6;19125:15;19118:31;18933:223;:::o;19162:366::-;19304:3;19325:67;19389:2;19384:3;19325:67;:::i;:::-;19318:74;;19401:93;19490:3;19401:93;:::i;:::-;19519:2;19514:3;19510:12;19503:19;;19162:366;;;:::o;19534:419::-;19700:4;19738:2;19727:9;19723:18;19715:26;;19787:9;19781:4;19777:20;19773:1;19762:9;19758:17;19751:47;19815:131;19941:4;19815:131;:::i;:::-;19807:139;;19534:419;;;:::o;19959:240::-;20099:34;20095:1;20087:6;20083:14;20076:58;20168:23;20163:2;20155:6;20151:15;20144:48;19959:240;:::o;20205:366::-;20347:3;20368:67;20432:2;20427:3;20368:67;:::i;:::-;20361:74;;20444:93;20533:3;20444:93;:::i;:::-;20562:2;20557:3;20553:12;20546:19;;20205:366;;;:::o;20577:419::-;20743:4;20781:2;20770:9;20766:18;20758:26;;20830:9;20824:4;20820:20;20816:1;20805:9;20801:17;20794:47;20858:131;20984:4;20858:131;:::i;:::-;20850:139;;20577:419;;;:::o;21002:239::-;21142:34;21138:1;21130:6;21126:14;21119:58;21211:22;21206:2;21198:6;21194:15;21187:47;21002:239;:::o;21247:366::-;21389:3;21410:67;21474:2;21469:3;21410:67;:::i;:::-;21403:74;;21486:93;21575:3;21486:93;:::i;:::-;21604:2;21599:3;21595:12;21588:19;;21247:366;;;:::o;21619:419::-;21785:4;21823:2;21812:9;21808:18;21800:26;;21872:9;21866:4;21862:20;21858:1;21847:9;21843:17;21836:47;21900:131;22026:4;21900:131;:::i;:::-;21892:139;;21619:419;;;:::o;22044:231::-;22184:34;22180:1;22172:6;22168:14;22161:58;22253:14;22248:2;22240:6;22236:15;22229:39;22044:231;:::o;22281:366::-;22423:3;22444:67;22508:2;22503:3;22444:67;:::i;:::-;22437:74;;22520:93;22609:3;22520:93;:::i;:::-;22638:2;22633:3;22629:12;22622:19;;22281:366;;;:::o;22653:419::-;22819:4;22857:2;22846:9;22842:18;22834:26;;22906:9;22900:4;22896:20;22892:1;22881:9;22877:17;22870:47;22934:131;23060:4;22934:131;:::i;:::-;22926:139;;22653:419;;;:::o;23078:143::-;23135:5;23166:6;23160:13;23151:22;;23182:33;23209:5;23182:33;:::i;:::-;23078:143;;;;:::o;23227:351::-;23297:6;23346:2;23334:9;23325:7;23321:23;23317:32;23314:119;;;23352:79;;:::i;:::-;23314:119;23472:1;23497:64;23553:7;23544:6;23533:9;23529:22;23497:64;:::i;:::-;23487:74;;23443:128;23227:351;;;;:::o;23584:166::-;23724:18;23720:1;23712:6;23708:14;23701:42;23584:166;:::o;23756:366::-;23898:3;23919:67;23983:2;23978:3;23919:67;:::i;:::-;23912:74;;23995:93;24084:3;23995:93;:::i;:::-;24113:2;24108:3;24104:12;24097:19;;23756:366;;;:::o;24128:419::-;24294:4;24332:2;24321:9;24317:18;24309:26;;24381:9;24375:4;24371:20;24367:1;24356:9;24352:17;24345:47;24409:131;24535:4;24409:131;:::i;:::-;24401:139;;24128:419;;;:::o;24553:332::-;24674:4;24712:2;24701:9;24697:18;24689:26;;24725:71;24793:1;24782:9;24778:17;24769:6;24725:71;:::i;:::-;24806:72;24874:2;24863:9;24859:18;24850:6;24806:72;:::i;:::-;24553:332;;;;;:::o;24891:137::-;24945:5;24976:6;24970:13;24961:22;;24992:30;25016:5;24992:30;:::i;:::-;24891:137;;;;:::o;25034:345::-;25101:6;25150:2;25138:9;25129:7;25125:23;25121:32;25118:119;;;25156:79;;:::i;:::-;25118:119;25276:1;25301:61;25354:7;25345:6;25334:9;25330:22;25301:61;:::i;:::-;25291:71;;25247:125;25034:345;;;;:::o;25385:225::-;25525:34;25521:1;25513:6;25509:14;25502:58;25594:8;25589:2;25581:6;25577:15;25570:33;25385:225;:::o;25616:366::-;25758:3;25779:67;25843:2;25838:3;25779:67;:::i;:::-;25772:74;;25855:93;25944:3;25855:93;:::i;:::-;25973:2;25968:3;25964:12;25957:19;;25616:366;;;:::o;25988:419::-;26154:4;26192:2;26181:9;26177:18;26169:26;;26241:9;26235:4;26231:20;26227:1;26216:9;26212:17;26205:47;26269:131;26395:4;26269:131;:::i;:::-;26261:139;;25988:419;;;:::o;26413:181::-;26553:33;26549:1;26541:6;26537:14;26530:57;26413:181;:::o;26600:366::-;26742:3;26763:67;26827:2;26822:3;26763:67;:::i;:::-;26756:74;;26839:93;26928:3;26839:93;:::i;:::-;26957:2;26952:3;26948:12;26941:19;;26600:366;;;:::o;26972:419::-;27138:4;27176:2;27165:9;27161:18;27153:26;;27225:9;27219:4;27215:20;27211:1;27200:9;27196:17;27189:47;27253:131;27379:4;27253:131;:::i;:::-;27245:139;;26972:419;;;:::o;27397:143::-;27454:5;27485:6;27479:13;27470:22;;27501:33;27528:5;27501:33;:::i;:::-;27397:143;;;;:::o;27546:351::-;27616:6;27665:2;27653:9;27644:7;27640:23;27636:32;27633:119;;;27671:79;;:::i;:::-;27633:119;27791:1;27816:64;27872:7;27863:6;27852:9;27848:22;27816:64;:::i;:::-;27806:74;;27762:128;27546:351;;;;:::o;27903:85::-;27948:7;27977:5;27966:16;;27903:85;;;:::o;27994:158::-;28052:9;28085:61;28103:42;28112:32;28138:5;28112:32;:::i;:::-;28103:42;:::i;:::-;28085:61;:::i;:::-;28072:74;;27994:158;;;:::o;28158:147::-;28253:45;28292:5;28253:45;:::i;:::-;28248:3;28241:58;28158:147;;:::o;28311:114::-;28378:6;28412:5;28406:12;28396:22;;28311:114;;;:::o;28431:184::-;28530:11;28564:6;28559:3;28552:19;28604:4;28599:3;28595:14;28580:29;;28431:184;;;;:::o;28621:132::-;28688:4;28711:3;28703:11;;28741:4;28736:3;28732:14;28724:22;;28621:132;;;:::o;28759:108::-;28836:24;28854:5;28836:24;:::i;:::-;28831:3;28824:37;28759:108;;:::o;28873:179::-;28942:10;28963:46;29005:3;28997:6;28963:46;:::i;:::-;29041:4;29036:3;29032:14;29018:28;;28873:179;;;;:::o;29058:113::-;29128:4;29160;29155:3;29151:14;29143:22;;29058:113;;;:::o;29207:732::-;29326:3;29355:54;29403:5;29355:54;:::i;:::-;29425:86;29504:6;29499:3;29425:86;:::i;:::-;29418:93;;29535:56;29585:5;29535:56;:::i;:::-;29614:7;29645:1;29630:284;29655:6;29652:1;29649:13;29630:284;;;29731:6;29725:13;29758:63;29817:3;29802:13;29758:63;:::i;:::-;29751:70;;29844:60;29897:6;29844:60;:::i;:::-;29834:70;;29690:224;29677:1;29674;29670:9;29665:14;;29630:284;;;29634:14;29930:3;29923:10;;29331:608;;;29207:732;;;;:::o;29945:720::-;30180:4;30218:3;30207:9;30203:19;30195:27;;30232:79;30308:1;30297:9;30293:17;30284:6;30232:79;:::i;:::-;30358:9;30352:4;30348:20;30343:2;30332:9;30328:18;30321:48;30386:108;30489:4;30480:6;30386:108;:::i;:::-;30378:116;;30504:72;30572:2;30561:9;30557:18;30548:6;30504:72;:::i;:::-;30586;30654:2;30643:9;30639:18;30630:6;30586:72;:::i;:::-;29945:720;;;;;;;:::o;30671:177::-;30811:29;30807:1;30799:6;30795:14;30788:53;30671:177;:::o;30854:366::-;30996:3;31017:67;31081:2;31076:3;31017:67;:::i;:::-;31010:74;;31093:93;31182:3;31093:93;:::i;:::-;31211:2;31206:3;31202:12;31195:19;;30854:366;;;:::o;31226:419::-;31392:4;31430:2;31419:9;31415:18;31407:26;;31479:9;31473:4;31469:20;31465:1;31454:9;31450:17;31443:47;31507:131;31633:4;31507:131;:::i;:::-;31499:139;;31226:419;;;:::o;31651:223::-;31791:34;31787:1;31779:6;31775:14;31768:58;31860:6;31855:2;31847:6;31843:15;31836:31;31651:223;:::o;31880:366::-;32022:3;32043:67;32107:2;32102:3;32043:67;:::i;:::-;32036:74;;32119:93;32208:3;32119:93;:::i;:::-;32237:2;32232:3;32228:12;32221:19;;31880:366;;;:::o;32252:419::-;32418:4;32456:2;32445:9;32441:18;32433:26;;32505:9;32499:4;32495:20;32491:1;32480:9;32476:17;32469:47;32533:131;32659:4;32533:131;:::i;:::-;32525:139;;32252:419;;;:::o;32677:221::-;32817:34;32813:1;32805:6;32801:14;32794:58;32886:4;32881:2;32873:6;32869:15;32862:29;32677:221;:::o;32904:366::-;33046:3;33067:67;33131:2;33126:3;33067:67;:::i;:::-;33060:74;;33143:93;33232:3;33143:93;:::i;:::-;33261:2;33256:3;33252:12;33245:19;;32904:366;;;:::o;33276:419::-;33442:4;33480:2;33469:9;33465:18;33457:26;;33529:9;33523:4;33519:20;33515:1;33504:9;33500:17;33493:47;33557:131;33683:4;33557:131;:::i;:::-;33549:139;;33276:419;;;:::o;33701:158::-;33841:10;33837:1;33829:6;33825:14;33818:34;33701:158;:::o;33865:365::-;34007:3;34028:66;34092:1;34087:3;34028:66;:::i;:::-;34021:73;;34103:93;34192:3;34103:93;:::i;:::-;34221:2;34216:3;34212:12;34205:19;;33865:365;;;:::o;34236:419::-;34402:4;34440:2;34429:9;34425:18;34417:26;;34489:9;34483:4;34479:20;34475:1;34464:9;34460:17;34453:47;34517:131;34643:4;34517:131;:::i;:::-;34509:139;;34236:419;;;:::o;34661:224::-;34801:34;34797:1;34789:6;34785:14;34778:58;34870:7;34865:2;34857:6;34853:15;34846:32;34661:224;:::o;34891:366::-;35033:3;35054:67;35118:2;35113:3;35054:67;:::i;:::-;35047:74;;35130:93;35219:3;35130:93;:::i;:::-;35248:2;35243:3;35239:12;35232:19;;34891:366;;;:::o;35263:419::-;35429:4;35467:2;35456:9;35452:18;35444:26;;35516:9;35510:4;35506:20;35502:1;35491:9;35487:17;35480:47;35544:131;35670:4;35544:131;:::i;:::-;35536:139;;35263:419;;;:::o;35688:222::-;35828:34;35824:1;35816:6;35812:14;35805:58;35897:5;35892:2;35884:6;35880:15;35873:30;35688:222;:::o;35916:366::-;36058:3;36079:67;36143:2;36138:3;36079:67;:::i;:::-;36072:74;;36155:93;36244:3;36155:93;:::i;:::-;36273:2;36268:3;36264:12;36257:19;;35916:366;;;:::o;36288:419::-;36454:4;36492:2;36481:9;36477:18;36469:26;;36541:9;36535:4;36531:20;36527:1;36516:9;36512:17;36505:47;36569:131;36695:4;36569:131;:::i;:::-;36561:139;;36288:419;;;:::o;36713:240::-;36853:34;36849:1;36841:6;36837:14;36830:58;36922:23;36917:2;36909:6;36905:15;36898:48;36713:240;:::o;36959:366::-;37101:3;37122:67;37186:2;37181:3;37122:67;:::i;:::-;37115:74;;37198:93;37287:3;37198:93;:::i;:::-;37316:2;37311:3;37307:12;37300:19;;36959:366;;;:::o;37331:419::-;37497:4;37535:2;37524:9;37520:18;37512:26;;37584:9;37578:4;37574:20;37570:1;37559:9;37555:17;37548:47;37612:131;37738:4;37612:131;:::i;:::-;37604:139;;37331:419;;;:::o;37756:169::-;37896:21;37892:1;37884:6;37880:14;37873:45;37756:169;:::o;37931:366::-;38073:3;38094:67;38158:2;38153:3;38094:67;:::i;:::-;38087:74;;38170:93;38259:3;38170:93;:::i;:::-;38288:2;38283:3;38279:12;38272:19;;37931:366;;;:::o;38303:419::-;38469:4;38507:2;38496:9;38492:18;38484:26;;38556:9;38550:4;38546:20;38542:1;38531:9;38527:17;38520:47;38584:131;38710:4;38584:131;:::i;:::-;38576:139;;38303:419;;;:::o;38728:241::-;38868:34;38864:1;38856:6;38852:14;38845:58;38937:24;38932:2;38924:6;38920:15;38913:49;38728:241;:::o;38975:366::-;39117:3;39138:67;39202:2;39197:3;39138:67;:::i;:::-;39131:74;;39214:93;39303:3;39214:93;:::i;:::-;39332:2;39327:3;39323:12;39316:19;;38975:366;;;:::o;39347:419::-;39513:4;39551:2;39540:9;39536:18;39528:26;;39600:9;39594:4;39590:20;39586:1;39575:9;39571:17;39564:47;39628:131;39754:4;39628:131;:::i;:::-;39620:139;;39347:419;;;:::o;39772:194::-;39812:4;39832:20;39850:1;39832:20;:::i;:::-;39827:25;;39866:20;39884:1;39866:20;:::i;:::-;39861:25;;39910:1;39907;39903:9;39895:17;;39934:1;39928:4;39925:11;39922:37;;;39939:18;;:::i;:::-;39922:37;39772:194;;;;:::o;39972:147::-;40073:11;40110:3;40095:18;;39972:147;;;;:::o;40125:114::-;;:::o;40245:398::-;40404:3;40425:83;40506:1;40501:3;40425:83;:::i;:::-;40418:90;;40517:93;40606:3;40517:93;:::i;:::-;40635:1;40630:3;40626:11;40619:18;;40245:398;;;:::o;40649:379::-;40833:3;40855:147;40998:3;40855:147;:::i;:::-;40848:154;;41019:3;41012:10;;40649:379;;;:::o;41034:442::-;41183:4;41221:2;41210:9;41206:18;41198:26;;41234:71;41302:1;41291:9;41287:17;41278:6;41234:71;:::i;:::-;41315:72;41383:2;41372:9;41368:18;41359:6;41315:72;:::i;:::-;41397;41465:2;41454:9;41450:18;41441:6;41397:72;:::i;:::-;41034:442;;;;;;:::o;41482:220::-;41622:34;41618:1;41610:6;41606:14;41599:58;41691:3;41686:2;41678:6;41674:15;41667:28;41482:220;:::o;41708:366::-;41850:3;41871:67;41935:2;41930:3;41871:67;:::i;:::-;41864:74;;41947:93;42036:3;41947:93;:::i;:::-;42065:2;42060:3;42056:12;42049:19;;41708:366;;;:::o;42080:419::-;42246:4;42284:2;42273:9;42269:18;42261:26;;42333:9;42327:4;42323:20;42319:1;42308:9;42304:17;42297:47;42361:131;42487:4;42361:131;:::i;:::-;42353:139;;42080:419;;;:::o;42505:831::-;42768:4;42806:3;42795:9;42791:19;42783:27;;42820:71;42888:1;42877:9;42873:17;42864:6;42820:71;:::i;:::-;42901:80;42977:2;42966:9;42962:18;42953:6;42901:80;:::i;:::-;43028:9;43022:4;43018:20;43013:2;43002:9;42998:18;42991:48;43056:108;43159:4;43150:6;43056:108;:::i;:::-;43048:116;;43174:72;43242:2;43231:9;43227:18;43218:6;43174:72;:::i;:::-;43256:73;43324:3;43313:9;43309:19;43300:6;43256:73;:::i;:::-;42505:831;;;;;;;;:::o;43342:807::-;43591:4;43629:3;43618:9;43614:19;43606:27;;43643:71;43711:1;43700:9;43696:17;43687:6;43643:71;:::i;:::-;43724:72;43792:2;43781:9;43777:18;43768:6;43724:72;:::i;:::-;43806:80;43882:2;43871:9;43867:18;43858:6;43806:80;:::i;:::-;43896;43972:2;43961:9;43957:18;43948:6;43896:80;:::i;:::-;43986:73;44054:3;44043:9;44039:19;44030:6;43986:73;:::i;:::-;44069;44137:3;44126:9;44122:19;44113:6;44069:73;:::i;:::-;43342:807;;;;;;;;;:::o;44155:663::-;44243:6;44251;44259;44308:2;44296:9;44287:7;44283:23;44279:32;44276:119;;;44314:79;;:::i;:::-;44276:119;44434:1;44459:64;44515:7;44506:6;44495:9;44491:22;44459:64;:::i;:::-;44449:74;;44405:128;44572:2;44598:64;44654:7;44645:6;44634:9;44630:22;44598:64;:::i;:::-;44588:74;;44543:129;44711:2;44737:64;44793:7;44784:6;44773:9;44769:22;44737:64;:::i;:::-;44727:74;;44682:129;44155:663;;;;;:::o

Swarm Source

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