ETH Price: $2,389.93 (-0.55%)

Token

BlackSwan (SWAN)
 

Overview

Max Total Supply

100,000 SWAN

Holders

119

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Filtered by Token Holder
Ethereum Pro: Deployer 2
Balance
60.195375804 SWAN

Value
$0.00
0x0fe60E55a8C0700b47d4a2663079c445Fc4A5893
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
BlackSwan

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-08-01
*/

//SPDX-License-Identifier: Unlicensed
pragma solidity >=0.5.0 <0.9.0;

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

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

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
    
        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;
    
        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
    
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
    
        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        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;
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address _owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    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 18;
    }

    /**
     * @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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, 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}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, 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}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        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) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + 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) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This 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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, 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 += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

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

        _afterTokenTransfer(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 Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - 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 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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

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

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

contract BlackSwan is AccessControl, ERC20 {
    using Address for address;
    address public autoLiquidityReceiver;
    address public treasuryFeeReceiver;
    address pair;
    bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
    uint256 _totalSupply = 100_000 * (10**9); // total supply amount
    uint256 treasuryFees;
    uint256 feeAmount;
    uint16 feeDenominator = 10000;
    uint16 feeType;
    uint16[4] liquidityFee;
    uint16[4] treasuryFee;
    uint16[4] totalFee;

    bool public feeEnabled;
    bool public tradingOpen;
    mapping(address => bool) public lpPairs;    
    mapping(address => bool) lpHolder;
    mapping(address => uint256) cooldown;
    mapping(address => bool) isFeeExempt;
    mapping(address => bool) maxWalletExempt;
    mapping(address => bool) public bannedUsers;

    struct ICooldown {
        bool buycooldownEnabled;
        bool sellcooldownEnabled;
        uint8 cooldownLimit;
        uint8 cooldownTime;
    }
    struct ILiquiditySettings {
        uint256 liquidityFeeAccumulator;
        uint256 numTokensToSwap;
        uint256 lastSwap;
        uint8 swapInterval;
        bool swapEnabled;
        bool inSwap;
        bool autoLiquifyEnabled;
    }

    struct ITransactionSettings {
        uint256 maxTxAmount;
        uint256 maxWalletAmount;
        bool txLimits;
    }        
    IUniswapV2Router02 router;
    ILiquiditySettings public LiquiditySettings;
    ICooldown public cooldownInfo;    
    ITransactionSettings public TransactionSettings;
    modifier swapping() {
        LiquiditySettings.inSwap = true;
        _;
        LiquiditySettings.inSwap = false;
    }

    constructor() ERC20("BlackSwan", "SWAN") {
        _setRoleAdmin(ADMIN_ROLE, DEFAULT_ADMIN_ROLE);

        _grantRole(ADMIN_ROLE, _msgSender());        
        _grantRole(DEFAULT_ADMIN_ROLE, _msgSender());

        router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IUniswapV2Factory(router.factory()).createPair(router.WETH(), address(this));
        lpPairs[pair] = true;
        lpHolder[_msgSender()] = true;

        _approve(address(this), address(router), type(uint256).max);
        _approve(_msgSender(), address(router), type(uint256).max);

        isFeeExempt[address(this)] = true;
        isFeeExempt[_msgSender()] = true;

        maxWalletExempt[_msgSender()] = true;
        maxWalletExempt[address(this)] = true;
        maxWalletExempt[pair] = true;

        setFeeReceivers(_msgSender(),_msgSender());
        cooldownInfo.cooldownLimit = 60; // cooldown cannot go over 60 seconds
        totalFee[3] = 2000; // 20% Max Fee

        _mint(_msgSender(), _totalSupply);
    }
    receive() external payable {}
    
    function decimals() public view virtual override returns (uint8) {
        return 9;
    }

    function setLp(address _holder, bool pairing, bool holder) external onlyRole(ADMIN_ROLE){
        lpPairs[_holder] = pairing;
        lpHolder[_holder] = holder;
    }

    function setRouter(IUniswapV2Router02 newRouter) external onlyRole(ADMIN_ROLE) {
        address newPair = IUniswapV2Factory(newRouter.factory()).getPair(router.WETH(), address(this));
        if (newPair == address(0)) {
            pair = IUniswapV2Factory(newRouter.factory()).createPair(router.WETH(), address(this));
            lpPairs[pair] = true;
            maxWalletExempt[pair] = true;
        } else {
            pair = newPair;
            lpPairs[pair] = true;
            maxWalletExempt[pair] = true;
        }
        router = newRouter;
        _approve(address(this), address(router), type(uint256).max);
    }

    function getFees(uint8 _feeType) external view returns(uint16 _totalFee, uint16 _treasuryFee,uint16 _liquidityFee, string memory Type){
        require(_feeType < 4);
        _totalFee = totalFee[_feeType];
        _treasuryFee = treasuryFee[_feeType];
        _liquidityFee = liquidityFee[_feeType];
        if(_feeType == 0)
        Type = 'Sell';
        else if(_feeType == 1)
        Type = 'Buy';
        else if(_feeType == 2)
        Type = 'Transfer';
        else
        Type = 'Max';
    }

    function getAccumulatedFees() external view returns (uint256 treasuryAmount) {
        treasuryAmount = treasuryFees;
    }

    function limits(address from, address to) private view returns (bool) {
        return !hasRole(ADMIN_ROLE, from)
            && !hasRole(ADMIN_ROLE, to)
            && !hasRole(ADMIN_ROLE, tx.origin)
            && !lpHolder[from]
            && !lpHolder[to]
            && to != address(0xdead)
            && from != address(this);
    }

    function airDropTokens(address[] memory addresses, uint256[] memory amounts) external onlyRole(ADMIN_ROLE) {
        require(addresses.length == amounts.length, "Lengths do not match.");
        for (uint8 i = 0; i < addresses.length; i++) {
            require(balanceOf(_msgSender()) >= amounts[i]);
            _basicTransfer(_msgSender(), addresses[i], amounts[i]*10**9);
        }
    }

    function _basicTransfer(address from, address to, uint256 amount) internal {
        super._transfer(from, to, amount);
    }

    function _setBlacklistStatus(address account, bool blacklisted) internal {
        if (blacklisted) {
            bannedUsers[account] = true;
        } else {
            bannedUsers[account] = false;
        }           
    }
    
    function setWalletBanStatus(address[] memory user, bool banned) external onlyRole(ADMIN_ROLE) {
        for(uint256 i; i < user.length; i++) {
            _setBlacklistStatus(user[i], banned);
            emit WalletBanStatusUpdated(user[i], banned);
        }
    }

    function _transfer(address from, address to, uint256 amount ) internal override {
        if (LiquiditySettings.inSwap) {
            _basicTransfer(from, to, amount);
        } else {
            require(!bannedUsers[from]);
            require(!bannedUsers[to]);
            if(!tradingOpen) checkLaunched(from);
            if(limits(from, to) && tradingOpen && TransactionSettings.txLimits){
                require(amount <= TransactionSettings.maxTxAmount);
                if(!maxWalletExempt[to]){
                    require(balanceOf(to) + amount <= TransactionSettings.maxWalletAmount, "TOKEN: Amount exceeds Transaction size");
                }
                if (lpPairs[from] && to != address(router) && !isFeeExempt[to] && cooldownInfo.buycooldownEnabled) {
                    require(cooldown[to] < block.timestamp);
                    cooldown[to] = block.timestamp + (cooldownInfo.cooldownTime);
                } else if (!lpPairs[from] && !isFeeExempt[from] && cooldownInfo.sellcooldownEnabled){
                    require(cooldown[from] <= block.timestamp);
                    cooldown[from] = block.timestamp + (cooldownInfo.cooldownTime);
                } 
            }
            if (shouldSwapBack()) {
                swapBack();
            }
            uint256 amountReceived = shouldTakeFee(from) ? takeFee(from, to, amount) : amount;
            _basicTransfer(from, to, amountReceived);
        }
    }


    function checkLaunched(address from) internal view {
        require(tradingOpen || lpHolder[from], "Pre-Launch Protection");
    }

    function shouldTakeFee(address from) internal view returns (bool) {
        return feeEnabled && !isFeeExempt[from];
    }

    function takeFee(address from, address to, uint256 amount) internal returns (uint256) {
        if (isFeeExempt[to]) {
            return amount;
        }
        if(lpPairs[to]) {
            if(feeType != 0)
                feeType = 0;
        } else if(lpPairs[from]){
            if(feeType != 1)
                feeType = 1;
        } else {
            if(feeType != 2)
                feeType = 2;
        }

        feeAmount = (amount * totalFee[feeType]) / feeDenominator;
        if(LiquiditySettings.autoLiquifyEnabled){
            LiquiditySettings.liquidityFeeAccumulator += (feeAmount * (liquidityFee[1] + liquidityFee[0])) / ((totalFee[1] + totalFee[0]) + (liquidityFee[1] + liquidityFee[0]));
        }

        _basicTransfer(from, address(this), feeAmount);

        return amount - feeAmount;
    }

    function shouldSwapBack() internal view returns (bool) {
        return
            !lpPairs[_msgSender()] &&
            !LiquiditySettings.inSwap &&
            LiquiditySettings.swapEnabled &&
            block.timestamp >= LiquiditySettings.lastSwap + LiquiditySettings.swapInterval &&
            balanceOf(address(this)) >= LiquiditySettings.numTokensToSwap;
    }

    function swapTokens(uint256 amount) internal {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = router.WETH();

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function swapBack() internal swapping {
        if(allowance(address(this), address(router)) < LiquiditySettings.numTokensToSwap){
            _approve(address(this), address(router), type(uint256).max);
        }
        LiquiditySettings.lastSwap = block.timestamp;
        if (LiquiditySettings.liquidityFeeAccumulator >= LiquiditySettings.numTokensToSwap && LiquiditySettings.autoLiquifyEnabled) {
            LiquiditySettings.liquidityFeeAccumulator -= LiquiditySettings.numTokensToSwap;
            uint256 amountToLiquify = LiquiditySettings.numTokensToSwap / 2;

            uint256 balanceBefore = address(this).balance;
            swapTokens(amountToLiquify);
            uint256 amountEth = address(this).balance - (balanceBefore);

            router.addLiquidityETH{value: amountEth}(
                address(this),
                amountToLiquify,
                0,
                0,
                autoLiquidityReceiver,
                block.timestamp
            );

            emit AutoLiquify(amountEth, amountToLiquify);
        } else {

            uint256 balanceBefore = address(this).balance;
            swapTokens(LiquiditySettings.numTokensToSwap);
            uint256 amountEth = address(this).balance - (balanceBefore);

            uint256 amountEthTreasury = (amountEth * (treasuryFee[0] + treasuryFee[1])) / (totalFee[0] + totalFee[1]);
            payTreasury(amountEthTreasury);

            emit SwapBack(LiquiditySettings.numTokensToSwap, amountEth);
        }
    }

    function payTreasury(uint256 treasuryAmount) internal returns(bool treasury) {
        require(treasuryAmount < address(this).balance);
        (treasury, ) = payable(treasuryFeeReceiver).call{ value: treasuryAmount, gas: 30000}("");
        treasuryFees += treasuryAmount;
    }

    function launch() public onlyRole(ADMIN_ROLE) {
        LiquiditySettings.autoLiquifyEnabled = true;        
        TransactionSettings.txLimits = true;
        LiquiditySettings.swapEnabled = true;
        LiquiditySettings.numTokensToSwap = (_totalSupply * 10) / (10000);
        cooldownInfo.cooldownTime = 30;
        cooldownInfo.buycooldownEnabled = true;
        cooldownInfo.sellcooldownEnabled = true;
        TransactionSettings.maxTxAmount = (_totalSupply * 1) / 100;
        TransactionSettings.maxWalletAmount = (_totalSupply * 15) / 1000;
        feeEnabled = true;
        setFees(100, 400, 0);
        setFees(100, 400, 1);
        setFees(0, 0, 2);   
        tradingOpen = true;
        emit Launched();
    }

    function setTransactionLimits(bool enabled) external onlyRole(ADMIN_ROLE) {
        TransactionSettings.txLimits = enabled;
    }

    function setTxLimit(uint256 percent, uint256 divisor) external onlyRole(ADMIN_ROLE) {
        require(percent >= 1 && divisor <= 1000);
        TransactionSettings.maxTxAmount = (_totalSupply * (percent)) / (divisor);
        emit TxLimitUpdated(TransactionSettings.maxTxAmount);
    }

    function setMaxWallet(uint256 percent, uint256 divisor) external onlyRole(ADMIN_ROLE) {
        require(percent >= 1 && divisor <= 1000);
        TransactionSettings.maxWalletAmount = (_totalSupply * percent) / divisor;
        emit WalletLimitUpdated(TransactionSettings.maxWalletAmount);
    }

    function setExempt(address holder, bool fee, bool wallet) external onlyRole(ADMIN_ROLE) {
        isFeeExempt[holder] = fee;
        maxWalletExempt[holder] = wallet;
    }

    function setFees(uint16 _liquidityFee, uint16 _treasuryFee, uint8 _feeType) public onlyRole(ADMIN_ROLE) {
        require(_feeType < 4);
        require(_liquidityFee + _treasuryFee <= totalFee[3]);
        liquidityFee[_feeType] = _liquidityFee;
        treasuryFee[_feeType] = _treasuryFee;
        totalFee[_feeType] = _liquidityFee + _treasuryFee;
    }

    function setFeesEnabled(bool _enabled) external onlyRole(ADMIN_ROLE) {
        feeEnabled = _enabled;
        emit FeesEnabled(_enabled);
    }

    function setFeeReceivers(address _autoLiquidityReceiver, address _treasuryFeeReceiver) public onlyRole(ADMIN_ROLE) {
        autoLiquidityReceiver = _autoLiquidityReceiver;
        treasuryFeeReceiver = _treasuryFeeReceiver;
        emit FeeReceiversUpdated(_autoLiquidityReceiver, _treasuryFeeReceiver);
    }

    function setCooldownEnabled(bool buy, bool sell, uint8 _cooldown) external onlyRole(ADMIN_ROLE) {
        require(_cooldown <= cooldownInfo.cooldownLimit);
        cooldownInfo.cooldownTime = _cooldown;
        cooldownInfo.buycooldownEnabled = buy;
        cooldownInfo.sellcooldownEnabled = sell;
    }

    function setSwapBackSettings(bool _enabled, uint256 _amount) external onlyRole(ADMIN_ROLE) {
        LiquiditySettings.swapEnabled = _enabled;
        LiquiditySettings.numTokensToSwap = (_totalSupply * (_amount)) / (10000);
        emit SwapBackSettingsUpdated(_enabled, _amount);
    }

   function setAutoLiquifyEnabled(bool _enabled) external onlyRole(ADMIN_ROLE) {
        LiquiditySettings.autoLiquifyEnabled = _enabled;
        emit AutoLiquifyUpdated(_enabled);
    }

    function clearStuckBalance(uint256 amountPercentage) external onlyRole(ADMIN_ROLE) {
        require(amountPercentage <= 100);
        uint256 amountEth = address(this).balance;
        payTreasury((amountEth * amountPercentage) / 100);
    }

    function clearStuckToken(address to) external onlyRole(ADMIN_ROLE) {
        uint256 _balance = balanceOf(address(this));
        _basicTransfer(address(this), to, _balance);
    }

    function clearStuckTokens(address _token, address _to) external onlyRole(ADMIN_ROLE) returns (bool _sent) {
        require(_token != address(0));
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        _sent = IERC20(_token).transfer(_to, _contractBalance);
    }

    event WalletLimitUpdated(uint256 amount);
    event Launched();
    event AutoLiquify(uint256 amountEth, uint256 amountToken);
    event SwapBack(uint256 amountToken, uint256 amountEth);
    event TxLimitUpdated(uint256 amount);
    event FeeReceiversUpdated(address autoLiquidityReceiver, address treasuryFeeReceiver);
    event SwapBackSettingsUpdated(bool enabled, uint256 amount);
    event FeesEnabled(bool _enabled);
    event AutoLiquifyUpdated(bool enabled);
    event WalletBanStatusUpdated(address user, bool banned);
}

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":"amountEth","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"}],"name":"AutoLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"AutoLiquifyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"autoLiquidityReceiver","type":"address"},{"indexed":false,"internalType":"address","name":"treasuryFeeReceiver","type":"address"}],"name":"FeeReceiversUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_enabled","type":"bool"}],"name":"FeesEnabled","type":"event"},{"anonymous":false,"inputs":[],"name":"Launched","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountEth","type":"uint256"}],"name":"SwapBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SwapBackSettingsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TxLimitUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"banned","type":"bool"}],"name":"WalletBanStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WalletLimitUpdated","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LiquiditySettings","outputs":[{"internalType":"uint256","name":"liquidityFeeAccumulator","type":"uint256"},{"internalType":"uint256","name":"numTokensToSwap","type":"uint256"},{"internalType":"uint256","name":"lastSwap","type":"uint256"},{"internalType":"uint8","name":"swapInterval","type":"uint8"},{"internalType":"bool","name":"swapEnabled","type":"bool"},{"internalType":"bool","name":"inSwap","type":"bool"},{"internalType":"bool","name":"autoLiquifyEnabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TransactionSettings","outputs":[{"internalType":"uint256","name":"maxTxAmount","type":"uint256"},{"internalType":"uint256","name":"maxWalletAmount","type":"uint256"},{"internalType":"bool","name":"txLimits","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"airDropTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoLiquidityReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bannedUsers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountPercentage","type":"uint256"}],"name":"clearStuckBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"clearStuckToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"clearStuckTokens","outputs":[{"internalType":"bool","name":"_sent","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldownInfo","outputs":[{"internalType":"bool","name":"buycooldownEnabled","type":"bool"},{"internalType":"bool","name":"sellcooldownEnabled","type":"bool"},{"internalType":"uint8","name":"cooldownLimit","type":"uint8"},{"internalType":"uint8","name":"cooldownTime","type":"uint8"}],"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":"feeEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAccumulatedFees","outputs":[{"internalType":"uint256","name":"treasuryAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_feeType","type":"uint8"}],"name":"getFees","outputs":[{"internalType":"uint16","name":"_totalFee","type":"uint16"},{"internalType":"uint16","name":"_treasuryFee","type":"uint16"},{"internalType":"uint16","name":"_liquidityFee","type":"uint16"},{"internalType":"string","name":"Type","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lpPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setAutoLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"buy","type":"bool"},{"internalType":"bool","name":"sell","type":"bool"},{"internalType":"uint8","name":"_cooldown","type":"uint8"}],"name":"setCooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"fee","type":"bool"},{"internalType":"bool","name":"wallet","type":"bool"}],"name":"setExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_autoLiquidityReceiver","type":"address"},{"internalType":"address","name":"_treasuryFeeReceiver","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_liquidityFee","type":"uint16"},{"internalType":"uint16","name":"_treasuryFee","type":"uint16"},{"internalType":"uint8","name":"_feeType","type":"uint8"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setFeesEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"},{"internalType":"bool","name":"pairing","type":"bool"},{"internalType":"bool","name":"holder","type":"bool"}],"name":"setLp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IUniswapV2Router02","name":"newRouter","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setTransactionLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"},{"internalType":"uint256","name":"divisor","type":"uint256"}],"name":"setTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"user","type":"address[]"},{"internalType":"bool","name":"banned","type":"bool"}],"name":"setWalletBanStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryFeeReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052655af3107a4000600955600c805461ffff19166127101790553480156200002a57600080fd5b5060405180604001604052806009815260200168213630b1b5a9bbb0b760b91b8152506040518060400160405280600481526020016329aba0a760e11b81525081600490805190602001906200008292919062000a2a565b5080516200009890600590602084019062000a2a565b50620000b99150600080516020620042e98339815191529050600062000446565b620000d4600080516020620042e98339815191523362000491565b620000e160003362000491565b601780546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b1580156200014157600080fd5b505afa15801562000156573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200017c919062000ad0565b6001600160a01b031663c9c65396601760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620001d957600080fd5b505afa158015620001ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000214919062000ad0565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381600087803b1580156200025c57600080fd5b505af115801562000271573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000297919062000ad0565b600880546001600160a01b0319166001600160a01b039290921691821790556000908152601160205260408120805460ff1916600190811790915590601290620002de3390565b6001600160a01b0390811682526020820192909252604001600020805460ff1916921515929092179091556017546200031d9130911660001962000532565b62000337336017546001600160a01b031660001962000532565b3060009081526014602081905260408220805460ff19166001908117909155916200035f3390565b6001600160a01b0316815260208101919091526040016000908120805460ff191692151592909217909155600190601590620003983390565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308152601590935281832080548516600190811790915560085490911683529120805490921617905562000402620003fb3390565b336200065e565b601c805462ff00001916623c0000179055600f805461ffff60301b19166707d000000000000017905562000440620004373390565b600954620006e8565b62000cb2565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166200052e576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620004ed3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6001600160a01b0383166200059a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084015b60405180910390fd5b6001600160a01b038216620005fd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840162000591565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b600080516020620042e98339815191526200067981620007ad565b600680546001600160a01b038581166001600160a01b03199283168117909355600780549186169190921681179091556040805192835260208301919091527f9fba4a27b77afdf6c68deb1d99abfd909cb0c2bfa6a148fae3c6b8414e58aef9910160405180910390a1505050565b6001600160a01b038216620007405760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000591565b806003600082825462000754919062000ba9565b90915550506001600160a01b0382166000818152600160209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b620007b98133620007bc565b50565b6000828152602081815260408083206001600160a01b038516845290915290205460ff166200052e57620007fb816200084c60201b62001be91760201c565b6200081183602062001bfb6200086a821b17811c565b6040516020016200082492919062000afb565b60408051601f198184030181529082905262461bcd60e51b8252620005919160040162000b74565b6060620008646001600160a01b03831660146200086a565b92915050565b606060006200087b83600262000bc4565b6200088890600262000ba9565b6001600160401b03811115620008a257620008a262000c9c565b6040519080825280601f01601f191660200182016040528015620008cd576020820181803683370190505b509050600360fc1b81600081518110620008eb57620008eb62000c86565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106200091d576200091d62000c86565b60200101906001600160f81b031916908160001a90535060006200094384600262000bc4565b6200095090600162000ba9565b90505b6001811115620009d2576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811062000988576200098862000c86565b1a60f81b828281518110620009a157620009a162000c86565b60200101906001600160f81b031916908160001a90535060049490941c93620009ca8162000c19565b905062000953565b50831562000a235760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640162000591565b9392505050565b82805462000a389062000c33565b90600052602060002090601f01602090048101928262000a5c576000855562000aa7565b82601f1062000a7757805160ff191683800117855562000aa7565b8280016001018555821562000aa7579182015b8281111562000aa757825182559160200191906001019062000a8a565b5062000ab592915062000ab9565b5090565b5b8082111562000ab5576000815560010162000aba565b60006020828403121562000ae357600080fd5b81516001600160a01b038116811462000a2357600080fd5b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835162000b3581601785016020880162000be6565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835162000b6881602884016020880162000be6565b01602801949350505050565b602081526000825180602084015262000b9581604085016020870162000be6565b601f01601f19169190910160400192915050565b6000821982111562000bbf5762000bbf62000c70565b500190565b600081600019048311821515161562000be15762000be162000c70565b500290565b60005b8381101562000c0357818101518382015260200162000be9565b8381111562000c13576000848401525b50505050565b60008162000c2b5762000c2b62000c70565b506000190190565b600181811c9082168062000c4857607f821691505b6020821081141562000c6a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6136278062000cc26000396000f3fe6080604052600436106102975760003560e01c806370a082311161015a578063a901dd92116100c1578063ca33e64c1161007a578063ca33e64c146108f4578063d547741f14610914578063dd62ed3e14610934578063df20fd4914610954578063f062172b14610974578063ffb54a991461099457600080fd5b8063a901dd92146107d5578063a9059cbb146107f5578063abe57e7014610815578063b2c57fff14610835578063c0d78655146108b4578063c40fedc6146108d457600080fd5b806395f93d481161011357806395f93d48146106e55780639be953b314610746578063a217fddf14610766578063a457c2d71461077b578063a4b45c001461079b578063a771ebc7146107bb57600080fd5b806370a08231146105f857806375b238fc1461062e5780638988d078146106505780638e3c37601461068057806391d14854146106b057806395d89b41146106d057600080fd5b80632af10fac116101fe578063461a4450116101b7578063461a4450146105435780634c57f8d2146105635780635005180a1461058357806354200d6f146105a357806357ff135a146105c35780635df45a37146105e357600080fd5b80632af10fac1461045f5780632f2ff15d14610497578063313ce567146104b757806336568abe146104d357806339509351146104f357806343cc8c2a1461051357600080fd5b80631da1db5e116102505780631da1db5e146103705780631faf723b1461039057806323b872dd146103b0578063248a9ca3146103d057806325cef45814610400578063291785b21461043f57600080fd5b806301339c21146102a357806301ffc9a7146102ba57806306fdde03146102ef578063095ea7b31461031157806318160ddd14610331578063184293871461035057600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102b86109b3565b005b3480156102c657600080fd5b506102da6102d5366004613190565b610acf565b60405190151581526020015b60405180910390f35b3480156102fb57600080fd5b50610304610b06565b6040516102e6919061330b565b34801561031d57600080fd5b506102da61032c366004612f7e565b610b98565b34801561033d57600080fd5b506003545b6040519081526020016102e6565b34801561035c57600080fd5b506102b861036b366004612f33565b610bb0565b34801561037c57600080fd5b506102b861038b366004613152565b610c0b565b34801561039c57600080fd5b506102b86103ab3660046131ff565b610c56565b3480156103bc57600080fd5b506102da6103cb366004612ef2565b610ce1565b3480156103dc57600080fd5b506103426103eb366004613152565b60009081526020819052604090206001015490565b34801561040c57600080fd5b50601d54601e54601f5461042292919060ff1683565b6040805193845260208401929092521515908201526060016102e6565b34801561044b57600080fd5b506102b861045a3660046131ba565b610d07565b34801561046b57600080fd5b5060075461047f906001600160a01b031681565b6040516001600160a01b0390911681526020016102e6565b3480156104a357600080fd5b506102b86104b236600461316b565b610e1e565b3480156104c357600080fd5b50604051600981526020016102e6565b3480156104df57600080fd5b506102b86104ee36600461316b565b610e48565b3480156104ff57600080fd5b506102da61050e366004612f7e565b610ecb565b34801561051f57600080fd5b506102da61052e366004612e7f565b60116020526000908152604090205460ff1681565b34801561054f57600080fd5b506102b861055e3660046130ed565b610eed565b34801561056f57600080fd5b506102b861057e366004612faa565b610f5f565b34801561058f57600080fd5b506102b861059e3660046130b3565b611065565b3480156105af57600080fd5b506102b86105be3660046130b3565b611091565b3480156105cf57600080fd5b506102b86105de366004612f33565b611102565b3480156105ef57600080fd5b50600a54610342565b34801561060457600080fd5b50610342610613366004612e7f565b6001600160a01b031660009081526001602052604090205490565b34801561063a57600080fd5b506103426000805160206135d283398151915281565b34801561065c57600080fd5b506102da61066b366004612e7f565b60166020526000908152604090205460ff1681565b34801561068c57600080fd5b506106a061069b36600461324f565b61115d565b6040516102e6949392919061331e565b3480156106bc57600080fd5b506102da6106cb36600461316b565b6112b7565b3480156106dc57600080fd5b506103046112e0565b3480156106f157600080fd5b50601c5461071b9060ff808216916101008104821691620100008204811691630100000090041684565b604080519415158552921515602085015260ff918216928401929092521660608201526080016102e6565b34801561075257600080fd5b506102b8610761366004612e7f565b6112ef565b34801561077257600080fd5b50610342600081565b34801561078757600080fd5b506102da610796366004612f7e565b611323565b3480156107a757600080fd5b506102b86107b6366004612eb9565b6113a9565b3480156107c757600080fd5b506010546102da9060ff1681565b3480156107e157600080fd5b506102b86107f03660046130b3565b611428565b34801561080157600080fd5b506102da610810366004612f7e565b611481565b34801561082157600080fd5b506102b86108303660046131ff565b61148f565b34801561084157600080fd5b50601854601954601a54601b546108779392919060ff808216916101008104821691620100008204811691630100000090041687565b6040805197885260208801969096529486019390935260ff909116606085015215156080840152151560a0830152151560c082015260e0016102e6565b3480156108c057600080fd5b506102b86108cf366004612e7f565b611511565b3480156108e057600080fd5b506102da6108ef366004612eb9565b611920565b34801561090057600080fd5b5060065461047f906001600160a01b031681565b34801561092057600080fd5b506102b861092f36600461316b565b611a56565b34801561094057600080fd5b5061034261094f366004612eb9565b611a7b565b34801561096057600080fd5b506102b861096f366004613134565b611aa6565b34801561098057600080fd5b506102b861098f36600461306c565b611b28565b3480156109a057600080fd5b506010546102da90610100900460ff1681565b6000805160206135d28339815191526109cb81611d97565b601b8054601f805460ff19166001179055630100010063ff00ff0019909116179055600954612710906109ff90600a61347d565b610a09919061345b565b601955601c805463ff00ffff1916631e000101179055600954606490610a3090600161347d565b610a3a919061345b565b601d556009546103e890610a4f90600f61347d565b610a59919061345b565b601e556010805460ff19166001179055610a7860646101906000610d07565b610a8760646101906001610d07565b610a946000806002610d07565b6010805461ff0019166101001790556040517fba61a96074b3d636edeee92caddc86293c917d5b6818b7d3698bb52e02ec86c890600090a150565b60006001600160e01b03198216637965db0b60e01b1480610b0057506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610b15906134f6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b41906134f6565b8015610b8e5780601f10610b6357610100808354040283529160200191610b8e565b820191906000526020600020905b815481529060010190602001808311610b7157829003601f168201915b5050505050905090565b600033610ba6818585611da4565b5060019392505050565b6000805160206135d2833981519152610bc881611d97565b506001600160a01b039092166000908152601160209081526040808320805494151560ff1995861617905560129091529020805492151592909116919091179055565b6000805160206135d2833981519152610c2381611d97565b6064821115610c3157600080fd5b47610c506064610c41858461347d565b610c4b919061345b565b611ec8565b50505050565b6000805160206135d2833981519152610c6e81611d97565b60018310158015610c8157506103e88211155b610c8a57600080fd5b8183600954610c99919061347d565b610ca3919061345b565b601d8190556040519081527fa53407ff336a78b145e1a297adce2a5d7a54e6c31d13b4e69e04aad80b07b44b906020015b60405180910390a1505050565b600033610cef858285611f50565b610cfa858585611fc4565b60019150505b9392505050565b6000805160206135d2833981519152610d1f81611d97565b60048260ff1610610d2f57600080fd5b600f546601000000000000900461ffff16610d4a848661341d565b61ffff161115610d5957600080fd5b83600d8360ff1660048110610d7057610d70613582565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555082600e8360ff1660048110610dac57610dac613582565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055508284610ddd919061341d565b600f8360ff1660048110610df357610df3613582565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555050505050565b600082815260208190526040902060010154610e3981611d97565b610e4383836122e6565b505050565b6001600160a01b0381163314610ebd5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610ec7828261236a565b5050565b600033610ba6818585610ede8383611a7b565b610ee89190613443565b611da4565b6000805160206135d2833981519152610f0581611d97565b601c5460ff6201000090910481169083161115610f2157600080fd5b50601c805463ff0000ff1916630100000060ff939093169290920260ff1916919091179215159290921761ff00191661010091151591909102179055565b6000805160206135d2833981519152610f7781611d97565b8151835114610fc05760405162461bcd60e51b81526020600482015260156024820152742632b733ba3439903237903737ba1036b0ba31b41760591b6044820152606401610eb4565b60005b83518160ff161015610c5057828160ff1681518110610fe457610fe4613582565b6020026020010151610ff66106133390565b101561100157600080fd5b61105333858360ff168151811061101a5761101a613582565b6020026020010151858460ff168151811061103757611037613582565b6020026020010151633b9aca0061104e919061347d565b6123cf565b8061105d8161354c565b915050610fc3565b6000805160206135d283398151915261107d81611d97565b50601f805460ff1916911515919091179055565b6000805160206135d28339815191526110a981611d97565b601b805483151563010000000263ff000000199091161790556040517f075af1ef3c1829076b56416deceff9df2103194b5dfbf756f8557478b494f7ff906110f690841515815260200190565b60405180910390a15050565b6000805160206135d283398151915261111a81611d97565b506001600160a01b039092166000908152601460209081526040808320805494151560ff1995861617905560159091529020805492151592909116919091179055565b6000806000606060048560ff161061117457600080fd5b600f8560ff166004811061118a5761118a613582565b601091828204019190066002029054906101000a900461ffff169350600e8560ff16600481106111bc576111bc613582565b601091828204019190066002029054906101000a900461ffff169250600d8560ff16600481106111ee576111ee613582565b601091828204019190066002029054906101000a900461ffff1691508460ff1660001415611237575060408051808201909152600481526314d95b1b60e21b60208201526112b0565b8460ff1660011415611263575060408051808201909152600381526242757960e81b60208201526112b0565b8460ff166002141561129457506040805180820190915260088152672a3930b739b332b960c11b60208201526112b0565b5060408051808201909152600381526209ac2f60eb1b60208201525b9193509193565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b606060058054610b15906134f6565b6000805160206135d283398151915261130781611d97565b3060008181526001602052604090205490610e439084836123cf565b600033816113318286611a7b565b9050838110156113915760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610eb4565b61139e8286868403611da4565b506001949350505050565b6000805160206135d28339815191526113c181611d97565b600680546001600160a01b038581166001600160a01b03199283168117909355600780549186169190921681179091556040805192835260208301919091527f9fba4a27b77afdf6c68deb1d99abfd909cb0c2bfa6a148fae3c6b8414e58aef99101610cd4565b6000805160206135d283398151915261144081611d97565b6010805460ff19168315159081179091556040519081527fa0ecf0a5fbb822896523e7519379813a2d69d92a1d7e408139c60d90041f23ae906020016110f6565b600033610ba6818585611fc4565b6000805160206135d28339815191526114a781611d97565b600183101580156114ba57506103e88211155b6114c357600080fd5b81836009546114d2919061347d565b6114dc919061345b565b601e8190556040519081527f199db6b3f784dbaaa5df3981a282a84eb13409a543eaaeb8e8f309c467b45e1890602001610cd4565b6000805160206135d283398151915261152981611d97565b6000826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561156457600080fd5b505afa158015611578573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159c9190612e9c565b6001600160a01b031663e6a43905601760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156115f857600080fd5b505afa15801561160c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116309190612e9c565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b15801561167557600080fd5b505afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190612e9c565b90506001600160a01b03811661189d57826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156116f657600080fd5b505afa15801561170a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172e9190612e9c565b6001600160a01b031663c9c65396601760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561178a57600080fd5b505afa15801561179e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c29190612e9c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381600087803b15801561180957600080fd5b505af115801561181d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118419190612e9c565b600880546001600160a01b0319166001600160a01b0392831690811782556000908152601160209081526040808320805460ff1990811660019081179092559454909516835260159091529020805490911690911790556118f4565b600880546001600160a01b0319166001600160a01b0383811691821783556000918252601160209081526040808420805460ff19908116600190811790925595549093168452601590915290912080549092161790555b601780546001600160a01b0319166001600160a01b038516908117909155610e43903090600019611da4565b60006000805160206135d283398151915261193a81611d97565b6001600160a01b03841661194d57600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038616906370a082319060240160206040518083038186803b15801561198f57600080fd5b505afa1580156119a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c791906131e6565b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390529192509086169063a9059cbb90604401602060405180830381600087803b158015611a1557600080fd5b505af1158015611a29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4d91906130d0565b95945050505050565b600082815260208190526040902060010154611a7181611d97565b610e43838361236a565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000805160206135d2833981519152611abe81611d97565b601b805461ff0019166101008515150217905560095461271090611ae390849061347d565b611aed919061345b565b601955604080518415158152602081018490527f30e0f7c488b6c70123097f13cf387e140b0e0b8c9d9e3473e502f35b035d377c9101610cd4565b6000805160206135d2833981519152611b4081611d97565b60005b8351811015610c5057611b6f848281518110611b6157611b61613582565b6020026020010151846123da565b7ffc70dcce81b5afebab40f1a9a0fe597f9097cb179cb4508e875b7b166838f88d848281518110611ba257611ba2613582565b602002602001015184604051611bcf9291906001600160a01b039290921682521515602082015260400190565b60405180910390a180611be181613531565b915050611b43565b6060610b006001600160a01b03831660145b60606000611c0a83600261347d565b611c15906002613443565b67ffffffffffffffff811115611c2d57611c2d613598565b6040519080825280601f01601f191660200182016040528015611c57576020820181803683370190505b509050600360fc1b81600081518110611c7257611c72613582565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611ca157611ca1613582565b60200101906001600160f81b031916908160001a9053506000611cc584600261347d565b611cd0906001613443565b90505b6001811115611d48576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611d0457611d04613582565b1a60f81b828281518110611d1a57611d1a613582565b60200101906001600160f81b031916908160001a90535060049490941c93611d41816134df565b9050611cd3565b508315610d005760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610eb4565b611da18133612429565b50565b6001600160a01b038316611e065760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610eb4565b6001600160a01b038216611e675760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610eb4565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000478210611ed657600080fd5b6007546040516001600160a01b03909116906175309084906000818181858888f193505050503d8060008114611f28576040519150601f19603f3d011682016040523d82523d6000602084013e611f2d565b606091505b50508091505081600a6000828254611f459190613443565b909155509092915050565b6000611f5c8484611a7b565b90506000198114610c505781811015611fb75760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610eb4565b610c508484848403611da4565b601b5462010000900460ff1615611fe057610e438383836123cf565b6001600160a01b03831660009081526016602052604090205460ff161561200657600080fd5b6001600160a01b03821660009081526016602052604090205460ff161561202c57600080fd5b601054610100900460ff166120445761204483612482565b61204e83836124f4565b80156120615750601054610100900460ff165b801561206f5750601f5460ff165b156122a457601d5481111561208357600080fd5b6001600160a01b03821660009081526015602052604090205460ff1661212d57601e54816120c6846001600160a01b031660009081526001602052604090205490565b6120d09190613443565b111561212d5760405162461bcd60e51b815260206004820152602660248201527f544f4b454e3a20416d6f756e742065786365656473205472616e73616374696f6044820152656e2073697a6560d01b6064820152608401610eb4565b6001600160a01b03831660009081526011602052604090205460ff16801561216357506017546001600160a01b03838116911614155b801561218857506001600160a01b03821660009081526014602052604090205460ff16155b80156121965750601c5460ff165b156121f4576001600160a01b03821660009081526013602052604090205442116121bf57600080fd5b601c546121d6906301000000900460ff1642613443565b6001600160a01b0383166000908152601360205260409020556122a4565b6001600160a01b03831660009081526011602052604090205460ff1615801561223657506001600160a01b03831660009081526014602052604090205460ff16155b80156122495750601c54610100900460ff165b156122a4576001600160a01b03831660009081526013602052604090205442101561227357600080fd5b601c5461228a906301000000900460ff1642613443565b6001600160a01b0384166000908152601360205260409020555b6122ac6125cd565b156122b9576122b9612649565b60006122c4846128b0565b6122ce57816122d9565b6122d98484846128e0565b9050610c508484836123cf565b6122f082826112b7565b610ec7576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556123263390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61237482826112b7565b15610ec7576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610e43838383612ae1565b8015612407576001600160a01b0382166000908152601660205260409020805460ff191660011790555050565b506001600160a01b03166000908152601660205260409020805460ff19169055565b61243382826112b7565b610ec75761244081611be9565b61244b836020611bfb565b60405160200161245c929190613296565b60408051601f198184030181529082905262461bcd60e51b8252610eb49160040161330b565b601054610100900460ff16806124b057506001600160a01b03811660009081526012602052604090205460ff165b611da15760405162461bcd60e51b815260206004820152601560248201527428393296a630bab731b410283937ba32b1ba34b7b760591b6044820152606401610eb4565b600061250e6000805160206135d2833981519152846112b7565b158015612530575061252e6000805160206135d2833981519152836112b7565b155b8015612551575061254f6000805160206135d2833981519152326112b7565b155b801561257657506001600160a01b03831660009081526012602052604090205460ff16155b801561259b57506001600160a01b03821660009081526012602052604090205460ff16155b80156125b257506001600160a01b03821661dead14155b8015610d0057506001600160a01b0383163014159392505050565b3360009081526011602052604081205460ff161580156125f65750601b5462010000900460ff16155b80156126095750601b54610100900460ff165b80156126275750601b54601a546126239160ff1690613443565b4210155b801561264457506019543060009081526001602052604090205410155b905090565b601b805462ff00001916620100001790556019546017546126749030906001600160a01b0316611a7b565b1015612694576017546126949030906001600160a01b0316600019611da4565b42601a55601954601854108015906126b55750601b546301000000900460ff165b156127e857601954601880546000906126cf90849061349c565b90915550506019546000906126e69060029061345b565b9050476126f282612c8c565b60006126fe824761349c565b60175460065460405163f305d71960e01b81523060048201526024810187905260006044820181905260648201526001600160a01b0391821660848201524260a4820152929350169063f305d71990839060c4016060604051808303818588803b15801561276b57600080fd5b505af115801561277f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127a49190613221565b505060408051838152602081018690527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15050506128a2565b60195447906127f690612c8c565b6000612802824761349c565b600f549091506000906128219061ffff6201000082048116911661341d565b600e5461ffff9182169161283e916201000081048216911661341d565b61284c9061ffff168461347d565b612856919061345b565b905061286181611ec8565b5060195460408051918252602082018490527f05ab84b321981d7d9a13402e494604c50821bcb5f2400d128fa06cd6451113d4910160405180910390a15050505b601b805462ff000019169055565b60105460009060ff168015610b005750506001600160a01b031660009081526014602052604090205460ff161590565b6001600160a01b03821660009081526014602052604081205460ff1615612908575080610d00565b6001600160a01b03831660009081526011602052604090205460ff161561294e57600c5462010000900461ffff161561294957600c805463ffff0000191690555b6129c2565b6001600160a01b03841660009081526011602052604090205460ff161561299a57600c5462010000900461ffff1660011461294957600c805463ffff00001916620100001790556129c2565b600c5461ffff62010000909104166002146129c257600c805463ffff00001916620200001790555b600c5461ffff80821691600f916201000090910416600481106129e7576129e7613582565b601091828204019190066002029054906101000a900461ffff1661ffff1683612a10919061347d565b612a1a919061345b565b600b55601b546301000000900460ff1615612abf57600d54612a499061ffff808216916201000090041661341d565b600f54612a639061ffff808216916201000090041661341d565b612a6d919061341d565b600d5461ffff91821691612a8c9180821691620100009091041661341d565b61ffff16600b54612a9d919061347d565b612aa7919061345b565b60188054600090612ab9908490613443565b90915550505b612acc8430600b546123cf565b600b54612ad9908361349c565b949350505050565b6001600160a01b038316612b455760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610eb4565b6001600160a01b038216612ba75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610eb4565b6001600160a01b03831660009081526001602052604090205481811015612c1f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610eb4565b6001600160a01b0380851660008181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c7f9086815260200190565b60405180910390a3610c50565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612cc157612cc1613582565b6001600160a01b03928316602091820292909201810191909152601754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612d1557600080fd5b505afa158015612d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4d9190612e9c565b81600181518110612d6057612d60613582565b6001600160a01b03928316602091820292909201015260175460405163791ac94760e01b815291169063791ac94790612da6908590600090869030904290600401613357565b600060405180830381600087803b158015612dc057600080fd5b505af1158015612dd4573d6000803e3d6000fd5b505050505050565b600082601f830112612ded57600080fd5b81356020612e02612dfd836133f9565b6133c8565b80838252828201915082860187848660051b8901011115612e2257600080fd5b60005b85811015612e4a578135612e38816135ae565b84529284019290840190600101612e25565b5090979650505050505050565b803561ffff81168114612e6957600080fd5b919050565b803560ff81168114612e6957600080fd5b600060208284031215612e9157600080fd5b8135610d00816135ae565b600060208284031215612eae57600080fd5b8151610d00816135ae565b60008060408385031215612ecc57600080fd5b8235612ed7816135ae565b91506020830135612ee7816135ae565b809150509250929050565b600080600060608486031215612f0757600080fd5b8335612f12816135ae565b92506020840135612f22816135ae565b929592945050506040919091013590565b600080600060608486031215612f4857600080fd5b8335612f53816135ae565b92506020840135612f63816135c3565b91506040840135612f73816135c3565b809150509250925092565b60008060408385031215612f9157600080fd5b8235612f9c816135ae565b946020939093013593505050565b60008060408385031215612fbd57600080fd5b823567ffffffffffffffff80821115612fd557600080fd5b612fe186838701612ddc565b9350602091508185013581811115612ff857600080fd5b85019050601f8101861361300b57600080fd5b8035613019612dfd826133f9565b80828252848201915084840189868560051b870101111561303957600080fd5b600094505b8385101561305c57803583526001949094019391850191850161303e565b5080955050505050509250929050565b6000806040838503121561307f57600080fd5b823567ffffffffffffffff81111561309657600080fd5b6130a285828601612ddc565b9250506020830135612ee7816135c3565b6000602082840312156130c557600080fd5b8135610d00816135c3565b6000602082840312156130e257600080fd5b8151610d00816135c3565b60008060006060848603121561310257600080fd5b833561310d816135c3565b9250602084013561311d816135c3565b915061312b60408501612e6e565b90509250925092565b6000806040838503121561314757600080fd5b8235612f9c816135c3565b60006020828403121561316457600080fd5b5035919050565b6000806040838503121561317e57600080fd5b823591506020830135612ee7816135ae565b6000602082840312156131a257600080fd5b81356001600160e01b031981168114610d0057600080fd5b6000806000606084860312156131cf57600080fd5b6131d884612e57565b925061311d60208501612e57565b6000602082840312156131f857600080fd5b5051919050565b6000806040838503121561321257600080fd5b50508035926020909101359150565b60008060006060848603121561323657600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561326157600080fd5b610d0082612e6e565b600081518084526132828160208601602086016134b3565b601f01601f19169290920160200192915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516132ce8160178501602088016134b3565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516132ff8160288401602088016134b3565b01602801949350505050565b602081526000610d00602083018461326a565b600061ffff808716835280861660208401528085166040840152506080606083015261334d608083018461326a565b9695505050505050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133a75784516001600160a01b031683529383019391830191600101613382565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156133f1576133f1613598565b604052919050565b600067ffffffffffffffff82111561341357613413613598565b5060051b60200190565b600061ffff80831681851680830382111561343a5761343a61356c565b01949350505050565b600082198211156134565761345661356c565b500190565b60008261347857634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156134975761349761356c565b500290565b6000828210156134ae576134ae61356c565b500390565b60005b838110156134ce5781810151838201526020016134b6565b83811115610c505750506000910152565b6000816134ee576134ee61356c565b506000190190565b600181811c9082168061350a57607f821691505b6020821081141561352b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156135455761354561356c565b5060010190565b600060ff821660ff8114156135635761356361356c565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611da157600080fd5b8015158114611da157600080fdfea49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220f61142ff55f3e1ef396ac62a752e37d27b2f348d9a46039ff4bd4d5c72898c4d64736f6c63430008070033a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775

Deployed Bytecode

0x6080604052600436106102975760003560e01c806370a082311161015a578063a901dd92116100c1578063ca33e64c1161007a578063ca33e64c146108f4578063d547741f14610914578063dd62ed3e14610934578063df20fd4914610954578063f062172b14610974578063ffb54a991461099457600080fd5b8063a901dd92146107d5578063a9059cbb146107f5578063abe57e7014610815578063b2c57fff14610835578063c0d78655146108b4578063c40fedc6146108d457600080fd5b806395f93d481161011357806395f93d48146106e55780639be953b314610746578063a217fddf14610766578063a457c2d71461077b578063a4b45c001461079b578063a771ebc7146107bb57600080fd5b806370a08231146105f857806375b238fc1461062e5780638988d078146106505780638e3c37601461068057806391d14854146106b057806395d89b41146106d057600080fd5b80632af10fac116101fe578063461a4450116101b7578063461a4450146105435780634c57f8d2146105635780635005180a1461058357806354200d6f146105a357806357ff135a146105c35780635df45a37146105e357600080fd5b80632af10fac1461045f5780632f2ff15d14610497578063313ce567146104b757806336568abe146104d357806339509351146104f357806343cc8c2a1461051357600080fd5b80631da1db5e116102505780631da1db5e146103705780631faf723b1461039057806323b872dd146103b0578063248a9ca3146103d057806325cef45814610400578063291785b21461043f57600080fd5b806301339c21146102a357806301ffc9a7146102ba57806306fdde03146102ef578063095ea7b31461031157806318160ddd14610331578063184293871461035057600080fd5b3661029e57005b600080fd5b3480156102af57600080fd5b506102b86109b3565b005b3480156102c657600080fd5b506102da6102d5366004613190565b610acf565b60405190151581526020015b60405180910390f35b3480156102fb57600080fd5b50610304610b06565b6040516102e6919061330b565b34801561031d57600080fd5b506102da61032c366004612f7e565b610b98565b34801561033d57600080fd5b506003545b6040519081526020016102e6565b34801561035c57600080fd5b506102b861036b366004612f33565b610bb0565b34801561037c57600080fd5b506102b861038b366004613152565b610c0b565b34801561039c57600080fd5b506102b86103ab3660046131ff565b610c56565b3480156103bc57600080fd5b506102da6103cb366004612ef2565b610ce1565b3480156103dc57600080fd5b506103426103eb366004613152565b60009081526020819052604090206001015490565b34801561040c57600080fd5b50601d54601e54601f5461042292919060ff1683565b6040805193845260208401929092521515908201526060016102e6565b34801561044b57600080fd5b506102b861045a3660046131ba565b610d07565b34801561046b57600080fd5b5060075461047f906001600160a01b031681565b6040516001600160a01b0390911681526020016102e6565b3480156104a357600080fd5b506102b86104b236600461316b565b610e1e565b3480156104c357600080fd5b50604051600981526020016102e6565b3480156104df57600080fd5b506102b86104ee36600461316b565b610e48565b3480156104ff57600080fd5b506102da61050e366004612f7e565b610ecb565b34801561051f57600080fd5b506102da61052e366004612e7f565b60116020526000908152604090205460ff1681565b34801561054f57600080fd5b506102b861055e3660046130ed565b610eed565b34801561056f57600080fd5b506102b861057e366004612faa565b610f5f565b34801561058f57600080fd5b506102b861059e3660046130b3565b611065565b3480156105af57600080fd5b506102b86105be3660046130b3565b611091565b3480156105cf57600080fd5b506102b86105de366004612f33565b611102565b3480156105ef57600080fd5b50600a54610342565b34801561060457600080fd5b50610342610613366004612e7f565b6001600160a01b031660009081526001602052604090205490565b34801561063a57600080fd5b506103426000805160206135d283398151915281565b34801561065c57600080fd5b506102da61066b366004612e7f565b60166020526000908152604090205460ff1681565b34801561068c57600080fd5b506106a061069b36600461324f565b61115d565b6040516102e6949392919061331e565b3480156106bc57600080fd5b506102da6106cb36600461316b565b6112b7565b3480156106dc57600080fd5b506103046112e0565b3480156106f157600080fd5b50601c5461071b9060ff808216916101008104821691620100008204811691630100000090041684565b604080519415158552921515602085015260ff918216928401929092521660608201526080016102e6565b34801561075257600080fd5b506102b8610761366004612e7f565b6112ef565b34801561077257600080fd5b50610342600081565b34801561078757600080fd5b506102da610796366004612f7e565b611323565b3480156107a757600080fd5b506102b86107b6366004612eb9565b6113a9565b3480156107c757600080fd5b506010546102da9060ff1681565b3480156107e157600080fd5b506102b86107f03660046130b3565b611428565b34801561080157600080fd5b506102da610810366004612f7e565b611481565b34801561082157600080fd5b506102b86108303660046131ff565b61148f565b34801561084157600080fd5b50601854601954601a54601b546108779392919060ff808216916101008104821691620100008204811691630100000090041687565b6040805197885260208801969096529486019390935260ff909116606085015215156080840152151560a0830152151560c082015260e0016102e6565b3480156108c057600080fd5b506102b86108cf366004612e7f565b611511565b3480156108e057600080fd5b506102da6108ef366004612eb9565b611920565b34801561090057600080fd5b5060065461047f906001600160a01b031681565b34801561092057600080fd5b506102b861092f36600461316b565b611a56565b34801561094057600080fd5b5061034261094f366004612eb9565b611a7b565b34801561096057600080fd5b506102b861096f366004613134565b611aa6565b34801561098057600080fd5b506102b861098f36600461306c565b611b28565b3480156109a057600080fd5b506010546102da90610100900460ff1681565b6000805160206135d28339815191526109cb81611d97565b601b8054601f805460ff19166001179055630100010063ff00ff0019909116179055600954612710906109ff90600a61347d565b610a09919061345b565b601955601c805463ff00ffff1916631e000101179055600954606490610a3090600161347d565b610a3a919061345b565b601d556009546103e890610a4f90600f61347d565b610a59919061345b565b601e556010805460ff19166001179055610a7860646101906000610d07565b610a8760646101906001610d07565b610a946000806002610d07565b6010805461ff0019166101001790556040517fba61a96074b3d636edeee92caddc86293c917d5b6818b7d3698bb52e02ec86c890600090a150565b60006001600160e01b03198216637965db0b60e01b1480610b0057506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060048054610b15906134f6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b41906134f6565b8015610b8e5780601f10610b6357610100808354040283529160200191610b8e565b820191906000526020600020905b815481529060010190602001808311610b7157829003601f168201915b5050505050905090565b600033610ba6818585611da4565b5060019392505050565b6000805160206135d2833981519152610bc881611d97565b506001600160a01b039092166000908152601160209081526040808320805494151560ff1995861617905560129091529020805492151592909116919091179055565b6000805160206135d2833981519152610c2381611d97565b6064821115610c3157600080fd5b47610c506064610c41858461347d565b610c4b919061345b565b611ec8565b50505050565b6000805160206135d2833981519152610c6e81611d97565b60018310158015610c8157506103e88211155b610c8a57600080fd5b8183600954610c99919061347d565b610ca3919061345b565b601d8190556040519081527fa53407ff336a78b145e1a297adce2a5d7a54e6c31d13b4e69e04aad80b07b44b906020015b60405180910390a1505050565b600033610cef858285611f50565b610cfa858585611fc4565b60019150505b9392505050565b6000805160206135d2833981519152610d1f81611d97565b60048260ff1610610d2f57600080fd5b600f546601000000000000900461ffff16610d4a848661341d565b61ffff161115610d5957600080fd5b83600d8360ff1660048110610d7057610d70613582565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555082600e8360ff1660048110610dac57610dac613582565b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055508284610ddd919061341d565b600f8360ff1660048110610df357610df3613582565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555050505050565b600082815260208190526040902060010154610e3981611d97565b610e4383836122e6565b505050565b6001600160a01b0381163314610ebd5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610ec7828261236a565b5050565b600033610ba6818585610ede8383611a7b565b610ee89190613443565b611da4565b6000805160206135d2833981519152610f0581611d97565b601c5460ff6201000090910481169083161115610f2157600080fd5b50601c805463ff0000ff1916630100000060ff939093169290920260ff1916919091179215159290921761ff00191661010091151591909102179055565b6000805160206135d2833981519152610f7781611d97565b8151835114610fc05760405162461bcd60e51b81526020600482015260156024820152742632b733ba3439903237903737ba1036b0ba31b41760591b6044820152606401610eb4565b60005b83518160ff161015610c5057828160ff1681518110610fe457610fe4613582565b6020026020010151610ff66106133390565b101561100157600080fd5b61105333858360ff168151811061101a5761101a613582565b6020026020010151858460ff168151811061103757611037613582565b6020026020010151633b9aca0061104e919061347d565b6123cf565b8061105d8161354c565b915050610fc3565b6000805160206135d283398151915261107d81611d97565b50601f805460ff1916911515919091179055565b6000805160206135d28339815191526110a981611d97565b601b805483151563010000000263ff000000199091161790556040517f075af1ef3c1829076b56416deceff9df2103194b5dfbf756f8557478b494f7ff906110f690841515815260200190565b60405180910390a15050565b6000805160206135d283398151915261111a81611d97565b506001600160a01b039092166000908152601460209081526040808320805494151560ff1995861617905560159091529020805492151592909116919091179055565b6000806000606060048560ff161061117457600080fd5b600f8560ff166004811061118a5761118a613582565b601091828204019190066002029054906101000a900461ffff169350600e8560ff16600481106111bc576111bc613582565b601091828204019190066002029054906101000a900461ffff169250600d8560ff16600481106111ee576111ee613582565b601091828204019190066002029054906101000a900461ffff1691508460ff1660001415611237575060408051808201909152600481526314d95b1b60e21b60208201526112b0565b8460ff1660011415611263575060408051808201909152600381526242757960e81b60208201526112b0565b8460ff166002141561129457506040805180820190915260088152672a3930b739b332b960c11b60208201526112b0565b5060408051808201909152600381526209ac2f60eb1b60208201525b9193509193565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b606060058054610b15906134f6565b6000805160206135d283398151915261130781611d97565b3060008181526001602052604090205490610e439084836123cf565b600033816113318286611a7b565b9050838110156113915760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610eb4565b61139e8286868403611da4565b506001949350505050565b6000805160206135d28339815191526113c181611d97565b600680546001600160a01b038581166001600160a01b03199283168117909355600780549186169190921681179091556040805192835260208301919091527f9fba4a27b77afdf6c68deb1d99abfd909cb0c2bfa6a148fae3c6b8414e58aef99101610cd4565b6000805160206135d283398151915261144081611d97565b6010805460ff19168315159081179091556040519081527fa0ecf0a5fbb822896523e7519379813a2d69d92a1d7e408139c60d90041f23ae906020016110f6565b600033610ba6818585611fc4565b6000805160206135d28339815191526114a781611d97565b600183101580156114ba57506103e88211155b6114c357600080fd5b81836009546114d2919061347d565b6114dc919061345b565b601e8190556040519081527f199db6b3f784dbaaa5df3981a282a84eb13409a543eaaeb8e8f309c467b45e1890602001610cd4565b6000805160206135d283398151915261152981611d97565b6000826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561156457600080fd5b505afa158015611578573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061159c9190612e9c565b6001600160a01b031663e6a43905601760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156115f857600080fd5b505afa15801561160c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116309190612e9c565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015230602482015260440160206040518083038186803b15801561167557600080fd5b505afa158015611689573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ad9190612e9c565b90506001600160a01b03811661189d57826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156116f657600080fd5b505afa15801561170a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172e9190612e9c565b6001600160a01b031663c9c65396601760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561178a57600080fd5b505afa15801561179e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c29190612e9c565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604401602060405180830381600087803b15801561180957600080fd5b505af115801561181d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118419190612e9c565b600880546001600160a01b0319166001600160a01b0392831690811782556000908152601160209081526040808320805460ff1990811660019081179092559454909516835260159091529020805490911690911790556118f4565b600880546001600160a01b0319166001600160a01b0383811691821783556000918252601160209081526040808420805460ff19908116600190811790925595549093168452601590915290912080549092161790555b601780546001600160a01b0319166001600160a01b038516908117909155610e43903090600019611da4565b60006000805160206135d283398151915261193a81611d97565b6001600160a01b03841661194d57600080fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038616906370a082319060240160206040518083038186803b15801561198f57600080fd5b505afa1580156119a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c791906131e6565b60405163a9059cbb60e01b81526001600160a01b038681166004830152602482018390529192509086169063a9059cbb90604401602060405180830381600087803b158015611a1557600080fd5b505af1158015611a29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4d91906130d0565b95945050505050565b600082815260208190526040902060010154611a7181611d97565b610e43838361236a565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6000805160206135d2833981519152611abe81611d97565b601b805461ff0019166101008515150217905560095461271090611ae390849061347d565b611aed919061345b565b601955604080518415158152602081018490527f30e0f7c488b6c70123097f13cf387e140b0e0b8c9d9e3473e502f35b035d377c9101610cd4565b6000805160206135d2833981519152611b4081611d97565b60005b8351811015610c5057611b6f848281518110611b6157611b61613582565b6020026020010151846123da565b7ffc70dcce81b5afebab40f1a9a0fe597f9097cb179cb4508e875b7b166838f88d848281518110611ba257611ba2613582565b602002602001015184604051611bcf9291906001600160a01b039290921682521515602082015260400190565b60405180910390a180611be181613531565b915050611b43565b6060610b006001600160a01b03831660145b60606000611c0a83600261347d565b611c15906002613443565b67ffffffffffffffff811115611c2d57611c2d613598565b6040519080825280601f01601f191660200182016040528015611c57576020820181803683370190505b509050600360fc1b81600081518110611c7257611c72613582565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611ca157611ca1613582565b60200101906001600160f81b031916908160001a9053506000611cc584600261347d565b611cd0906001613443565b90505b6001811115611d48576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611d0457611d04613582565b1a60f81b828281518110611d1a57611d1a613582565b60200101906001600160f81b031916908160001a90535060049490941c93611d41816134df565b9050611cd3565b508315610d005760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610eb4565b611da18133612429565b50565b6001600160a01b038316611e065760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610eb4565b6001600160a01b038216611e675760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610eb4565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000478210611ed657600080fd5b6007546040516001600160a01b03909116906175309084906000818181858888f193505050503d8060008114611f28576040519150601f19603f3d011682016040523d82523d6000602084013e611f2d565b606091505b50508091505081600a6000828254611f459190613443565b909155509092915050565b6000611f5c8484611a7b565b90506000198114610c505781811015611fb75760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610eb4565b610c508484848403611da4565b601b5462010000900460ff1615611fe057610e438383836123cf565b6001600160a01b03831660009081526016602052604090205460ff161561200657600080fd5b6001600160a01b03821660009081526016602052604090205460ff161561202c57600080fd5b601054610100900460ff166120445761204483612482565b61204e83836124f4565b80156120615750601054610100900460ff165b801561206f5750601f5460ff165b156122a457601d5481111561208357600080fd5b6001600160a01b03821660009081526015602052604090205460ff1661212d57601e54816120c6846001600160a01b031660009081526001602052604090205490565b6120d09190613443565b111561212d5760405162461bcd60e51b815260206004820152602660248201527f544f4b454e3a20416d6f756e742065786365656473205472616e73616374696f6044820152656e2073697a6560d01b6064820152608401610eb4565b6001600160a01b03831660009081526011602052604090205460ff16801561216357506017546001600160a01b03838116911614155b801561218857506001600160a01b03821660009081526014602052604090205460ff16155b80156121965750601c5460ff165b156121f4576001600160a01b03821660009081526013602052604090205442116121bf57600080fd5b601c546121d6906301000000900460ff1642613443565b6001600160a01b0383166000908152601360205260409020556122a4565b6001600160a01b03831660009081526011602052604090205460ff1615801561223657506001600160a01b03831660009081526014602052604090205460ff16155b80156122495750601c54610100900460ff165b156122a4576001600160a01b03831660009081526013602052604090205442101561227357600080fd5b601c5461228a906301000000900460ff1642613443565b6001600160a01b0384166000908152601360205260409020555b6122ac6125cd565b156122b9576122b9612649565b60006122c4846128b0565b6122ce57816122d9565b6122d98484846128e0565b9050610c508484836123cf565b6122f082826112b7565b610ec7576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556123263390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61237482826112b7565b15610ec7576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b610e43838383612ae1565b8015612407576001600160a01b0382166000908152601660205260409020805460ff191660011790555050565b506001600160a01b03166000908152601660205260409020805460ff19169055565b61243382826112b7565b610ec75761244081611be9565b61244b836020611bfb565b60405160200161245c929190613296565b60408051601f198184030181529082905262461bcd60e51b8252610eb49160040161330b565b601054610100900460ff16806124b057506001600160a01b03811660009081526012602052604090205460ff165b611da15760405162461bcd60e51b815260206004820152601560248201527428393296a630bab731b410283937ba32b1ba34b7b760591b6044820152606401610eb4565b600061250e6000805160206135d2833981519152846112b7565b158015612530575061252e6000805160206135d2833981519152836112b7565b155b8015612551575061254f6000805160206135d2833981519152326112b7565b155b801561257657506001600160a01b03831660009081526012602052604090205460ff16155b801561259b57506001600160a01b03821660009081526012602052604090205460ff16155b80156125b257506001600160a01b03821661dead14155b8015610d0057506001600160a01b0383163014159392505050565b3360009081526011602052604081205460ff161580156125f65750601b5462010000900460ff16155b80156126095750601b54610100900460ff165b80156126275750601b54601a546126239160ff1690613443565b4210155b801561264457506019543060009081526001602052604090205410155b905090565b601b805462ff00001916620100001790556019546017546126749030906001600160a01b0316611a7b565b1015612694576017546126949030906001600160a01b0316600019611da4565b42601a55601954601854108015906126b55750601b546301000000900460ff165b156127e857601954601880546000906126cf90849061349c565b90915550506019546000906126e69060029061345b565b9050476126f282612c8c565b60006126fe824761349c565b60175460065460405163f305d71960e01b81523060048201526024810187905260006044820181905260648201526001600160a01b0391821660848201524260a4820152929350169063f305d71990839060c4016060604051808303818588803b15801561276b57600080fd5b505af115801561277f573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906127a49190613221565b505060408051838152602081018690527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15050506128a2565b60195447906127f690612c8c565b6000612802824761349c565b600f549091506000906128219061ffff6201000082048116911661341d565b600e5461ffff9182169161283e916201000081048216911661341d565b61284c9061ffff168461347d565b612856919061345b565b905061286181611ec8565b5060195460408051918252602082018490527f05ab84b321981d7d9a13402e494604c50821bcb5f2400d128fa06cd6451113d4910160405180910390a15050505b601b805462ff000019169055565b60105460009060ff168015610b005750506001600160a01b031660009081526014602052604090205460ff161590565b6001600160a01b03821660009081526014602052604081205460ff1615612908575080610d00565b6001600160a01b03831660009081526011602052604090205460ff161561294e57600c5462010000900461ffff161561294957600c805463ffff0000191690555b6129c2565b6001600160a01b03841660009081526011602052604090205460ff161561299a57600c5462010000900461ffff1660011461294957600c805463ffff00001916620100001790556129c2565b600c5461ffff62010000909104166002146129c257600c805463ffff00001916620200001790555b600c5461ffff80821691600f916201000090910416600481106129e7576129e7613582565b601091828204019190066002029054906101000a900461ffff1661ffff1683612a10919061347d565b612a1a919061345b565b600b55601b546301000000900460ff1615612abf57600d54612a499061ffff808216916201000090041661341d565b600f54612a639061ffff808216916201000090041661341d565b612a6d919061341d565b600d5461ffff91821691612a8c9180821691620100009091041661341d565b61ffff16600b54612a9d919061347d565b612aa7919061345b565b60188054600090612ab9908490613443565b90915550505b612acc8430600b546123cf565b600b54612ad9908361349c565b949350505050565b6001600160a01b038316612b455760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610eb4565b6001600160a01b038216612ba75760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610eb4565b6001600160a01b03831660009081526001602052604090205481811015612c1f5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610eb4565b6001600160a01b0380851660008181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c7f9086815260200190565b60405180910390a3610c50565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612cc157612cc1613582565b6001600160a01b03928316602091820292909201810191909152601754604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612d1557600080fd5b505afa158015612d29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4d9190612e9c565b81600181518110612d6057612d60613582565b6001600160a01b03928316602091820292909201015260175460405163791ac94760e01b815291169063791ac94790612da6908590600090869030904290600401613357565b600060405180830381600087803b158015612dc057600080fd5b505af1158015612dd4573d6000803e3d6000fd5b505050505050565b600082601f830112612ded57600080fd5b81356020612e02612dfd836133f9565b6133c8565b80838252828201915082860187848660051b8901011115612e2257600080fd5b60005b85811015612e4a578135612e38816135ae565b84529284019290840190600101612e25565b5090979650505050505050565b803561ffff81168114612e6957600080fd5b919050565b803560ff81168114612e6957600080fd5b600060208284031215612e9157600080fd5b8135610d00816135ae565b600060208284031215612eae57600080fd5b8151610d00816135ae565b60008060408385031215612ecc57600080fd5b8235612ed7816135ae565b91506020830135612ee7816135ae565b809150509250929050565b600080600060608486031215612f0757600080fd5b8335612f12816135ae565b92506020840135612f22816135ae565b929592945050506040919091013590565b600080600060608486031215612f4857600080fd5b8335612f53816135ae565b92506020840135612f63816135c3565b91506040840135612f73816135c3565b809150509250925092565b60008060408385031215612f9157600080fd5b8235612f9c816135ae565b946020939093013593505050565b60008060408385031215612fbd57600080fd5b823567ffffffffffffffff80821115612fd557600080fd5b612fe186838701612ddc565b9350602091508185013581811115612ff857600080fd5b85019050601f8101861361300b57600080fd5b8035613019612dfd826133f9565b80828252848201915084840189868560051b870101111561303957600080fd5b600094505b8385101561305c57803583526001949094019391850191850161303e565b5080955050505050509250929050565b6000806040838503121561307f57600080fd5b823567ffffffffffffffff81111561309657600080fd5b6130a285828601612ddc565b9250506020830135612ee7816135c3565b6000602082840312156130c557600080fd5b8135610d00816135c3565b6000602082840312156130e257600080fd5b8151610d00816135c3565b60008060006060848603121561310257600080fd5b833561310d816135c3565b9250602084013561311d816135c3565b915061312b60408501612e6e565b90509250925092565b6000806040838503121561314757600080fd5b8235612f9c816135c3565b60006020828403121561316457600080fd5b5035919050565b6000806040838503121561317e57600080fd5b823591506020830135612ee7816135ae565b6000602082840312156131a257600080fd5b81356001600160e01b031981168114610d0057600080fd5b6000806000606084860312156131cf57600080fd5b6131d884612e57565b925061311d60208501612e57565b6000602082840312156131f857600080fd5b5051919050565b6000806040838503121561321257600080fd5b50508035926020909101359150565b60008060006060848603121561323657600080fd5b8351925060208401519150604084015190509250925092565b60006020828403121561326157600080fd5b610d0082612e6e565b600081518084526132828160208601602086016134b3565b601f01601f19169290920160200192915050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516132ce8160178501602088016134b3565b7001034b99036b4b9b9b4b733903937b6329607d1b60179184019182015283516132ff8160288401602088016134b3565b01602801949350505050565b602081526000610d00602083018461326a565b600061ffff808716835280861660208401528085166040840152506080606083015261334d608083018461326a565b9695505050505050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156133a75784516001600160a01b031683529383019391830191600101613382565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff811182821017156133f1576133f1613598565b604052919050565b600067ffffffffffffffff82111561341357613413613598565b5060051b60200190565b600061ffff80831681851680830382111561343a5761343a61356c565b01949350505050565b600082198211156134565761345661356c565b500190565b60008261347857634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156134975761349761356c565b500290565b6000828210156134ae576134ae61356c565b500390565b60005b838110156134ce5781810151838201526020016134b6565b83811115610c505750506000910152565b6000816134ee576134ee61356c565b506000190190565b600181811c9082168061350a57607f821691505b6020821081141561352b57634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156135455761354561356c565b5060010190565b600060ff821660ff8114156135635761356361356c565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611da157600080fd5b8015158114611da157600080fdfea49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220f61142ff55f3e1ef396ac62a752e37d27b2f348d9a46039ff4bd4d5c72898c4d64736f6c63430008070033

Deployed Bytecode Sourcemap

47788:15650:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58816:744;;;;;;;;;;;;;:::i;:::-;;42119:204;;;;;;;;;;-1:-1:-1;42119:204:0;;;;;:::i;:::-;;:::i;:::-;;;11850:14:1;;11843:22;11825:41;;11813:2;11798:18;42119:204:0;;;;;;;;13861:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16212:201::-;;;;;;;;;;-1:-1:-1;16212:201:0;;;;;:::i;:::-;;:::i;14981:108::-;;;;;;;;;;-1:-1:-1;15069:12:0;;14981:108;;;12716:25:1;;;12704:2;12689:18;14981:108:0;12570:177:1;50703:170:0;;;;;;;;;;-1:-1:-1;50703:170:0;;;;;:::i;:::-;;:::i;62150:246::-;;;;;;;;;;-1:-1:-1;62150:246:0;;;;;:::i;:::-;;:::i;59707:289::-;;;;;;;;;;-1:-1:-1;59707:289:0;;;;;:::i;:::-;;:::i;16993:295::-;;;;;;;;;;-1:-1:-1;16993:295:0;;;;;:::i;:::-;;:::i;43942:131::-;;;;;;;;;;-1:-1:-1;43942:131:0;;;;;:::i;:::-;44016:7;44043:12;;;;;;;;;;:22;;;;43942:131;49312:47;;;;;;;;;;-1:-1:-1;49312:47:0;;;;;;;;;;;;;;;;;;19752:25:1;;;19808:2;19793:18;;19786:34;;;;19863:14;19856:22;19836:18;;;19829:50;19740:2;19725:18;49312:47:0;19556:329:1;60494:363:0;;;;;;;;;;-1:-1:-1;60494:363:0;;;;;:::i;:::-;;:::i;47913:34::-;;;;;;;;;;-1:-1:-1;47913:34:0;;;;-1:-1:-1;;;;;47913:34:0;;;;;;-1:-1:-1;;;;;10152:32:1;;;10134:51;;10122:2;10107:18;47913:34:0;9988:203:1;44383:147:0;;;;;;;;;;-1:-1:-1;44383:147:0;;;;;:::i;:::-;;:::i;50603:92::-;;;;;;;;;;-1:-1:-1;50603:92:0;;50686:1;20681:36:1;;20669:2;20654:18;50603:92:0;20539:184:1;45527:218:0;;;;;;;;;;-1:-1:-1;45527:218:0;;;;;:::i;:::-;;:::i;17697:238::-;;;;;;;;;;-1:-1:-1;17697:238:0;;;;;:::i;:::-;;:::i;48361:39::-;;;;;;;;;;-1:-1:-1;48361:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;61341:309;;;;;;;;;;-1:-1:-1;61341:309:0;;;;;:::i;:::-;;:::i;52545:397::-;;;;;;;;;;-1:-1:-1;52545:397:0;;;;;:::i;:::-;;:::i;59568:131::-;;;;;;;;;;-1:-1:-1;59568:131:0;;;;;:::i;:::-;;:::i;61956:186::-;;;;;;;;;;-1:-1:-1;61956:186:0;;;;;:::i;:::-;;:::i;60311:175::-;;;;;;;;;;-1:-1:-1;60311:175:0;;;;;:::i;:::-;;:::i;52055:125::-;;;;;;;;;;-1:-1:-1;52160:12:0;;52055:125;;15152:127;;;;;;;;;;-1:-1:-1;15152:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;15253:18:0;15226:7;15253:18;;;:9;:18;;;;;;;15152:127;47973:60;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;47973:60:0;;48584:43;;;;;;;;;;-1:-1:-1;48584:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;51533:514;;;;;;;;;;-1:-1:-1;51533:514:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;42415:147::-;;;;;;;;;;-1:-1:-1;42415:147:0;;;;;:::i;:::-;;:::i;14080:104::-;;;;;;;;;;;;;:::i;49272:29::-;;;;;;;;;;-1:-1:-1;49272:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12113:14:1;;12106:22;12088:41;;12172:14;;12165:22;12160:2;12145:18;;12138:50;12236:4;12224:17;;;12204:18;;;12197:45;;;;12278:17;12273:2;12258:18;;12251:45;12075:3;12060:19;49272:29:0;11877:425:1;62404:183:0;;;;;;;;;;-1:-1:-1;62404:183:0;;;;;:::i;:::-;;:::i;41520:49::-;;;;;;;;;;-1:-1:-1;41520:49:0;41565:4;41520:49;;18438:436;;;;;;;;;;-1:-1:-1;18438:436:0;;;;;:::i;:::-;;:::i;61019:314::-;;;;;;;;;;-1:-1:-1;61019:314:0;;;;;:::i;:::-;;:::i;48302:22::-;;;;;;;;;;-1:-1:-1;48302:22:0;;;;;;;;60865:146;;;;;;;;;;-1:-1:-1;60865:146:0;;;;;:::i;:::-;;:::i;15485:193::-;;;;;;;;;;-1:-1:-1;15485:193:0;;;;;:::i;:::-;;:::i;60004:299::-;;;;;;;;;;-1:-1:-1;60004:299:0;;;;;:::i;:::-;;:::i;49222:43::-;;;;;;;;;;-1:-1:-1;49222:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20183:25:1;;;20239:2;20224:18;;20217:34;;;;20267:18;;;20260:34;;;;20342:4;20330:17;;;20325:2;20310:18;;20303:45;20392:14;20385:22;20379:3;20364:19;;20357:51;20452:14;20445:22;20439:3;20424:19;;20417:51;20512:14;20505:22;20499:3;20484:19;;20477:51;20170:3;20155:19;49222:43:0;19890:644:1;50881::0;;;;;;;;;;-1:-1:-1;50881:644:0;;;;;:::i;:::-;;:::i;62595:296::-;;;;;;;;;;-1:-1:-1;62595:296:0;;;;;:::i;:::-;;:::i;47870:36::-;;;;;;;;;;-1:-1:-1;47870:36:0;;;;-1:-1:-1;;;;;47870:36:0;;;44823:149;;;;;;;;;;-1:-1:-1;44823:149:0;;;;;:::i;:::-;;:::i;15741:151::-;;;;;;;;;;-1:-1:-1;15741:151:0;;;;;:::i;:::-;;:::i;61658:291::-;;;;;;;;;;-1:-1:-1;61658:291:0;;;;;:::i;:::-;;:::i;53331:271::-;;;;;;;;;;-1:-1:-1;53331:271:0;;;;;:::i;:::-;;:::i;48331:23::-;;;;;;;;;;-1:-1:-1;48331:23:0;;;;;;;;;;;58816:744;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;58873:36;:43;;58935:28;:35;;-1:-1:-1;;58935:35:0::1;58912:4;58935:35;::::0;;58981:36;-1:-1:-1;;58981:36:0;;;;;;59065:12:::1;::::0;59087:5:::1;::::0;59065:17:::1;::::0;59080:2:::1;59065:17;:::i;:::-;59064:29;;;;:::i;:::-;59028:33:::0;:65;59104:12:::1;:30:::0;;-1:-1:-1;;59194:39:0;;;;;59279:12:::1;::::0;59299:3:::1;::::0;59279:16:::1;::::0;-1:-1:-1;59279:16:0::1;:::i;:::-;59278:24;;;;:::i;:::-;59244:19;:58:::0;59352:12:::1;::::0;59373:4:::1;::::0;59352:17:::1;::::0;59367:2:::1;59352:17;:::i;:::-;59351:26;;;;:::i;:::-;59313:35:::0;:64;59388:10:::1;:17:::0;;-1:-1:-1;;59388:17:0::1;59313:35;59388:17;::::0;;59416:20:::1;59424:3;59429;59388:10;59416:7;:20::i;:::-;59447;59455:3;59460;59465:1;59447:7;:20::i;:::-;59478:16;59486:1;59489::::0;59492::::1;59478:7;:16::i;:::-;59508:11;:18:::0;;-1:-1:-1;;59508:18:0::1;;;::::0;;59542:10:::1;::::0;::::1;::::0;59508:18;;59542:10:::1;58816:744:::0;:::o;42119:204::-;42204:4;-1:-1:-1;;;;;;42228:47:0;;-1:-1:-1;;;42228:47:0;;:87;;-1:-1:-1;;;;;;;;;;36777:40:0;;;42279:36;42221:94;42119:204;-1:-1:-1;;42119:204:0:o;13861:100::-;13915:13;13948:5;13941:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13861:100;:::o;16212:201::-;16295:4;195:10;16351:32;195:10;16367:7;16376:6;16351:8;:32::i;:::-;-1:-1:-1;16401:4:0;;16212:201;-1:-1:-1;;;16212:201:0:o;50703:170::-;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;-1:-1:-1;;;;;;50802:16:0;;::::1;;::::0;;;:7:::1;:16;::::0;;;;;;;:26;;;::::1;;-1:-1:-1::0;;50802:26:0;;::::1;;::::0;;50839:8:::1;:17:::0;;;;;:26;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;50703:170::o;62150:246::-;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;62272:3:::1;62252:16;:23;;62244:32;;;::::0;::::1;;62307:21;62339:49;62384:3;62352:28;62364:16:::0;62307:21;62352:28:::1;:::i;:::-;62351:36;;;;:::i;:::-;62339:11;:49::i;:::-;;62233:163;62150:246:::0;;:::o;59707:289::-;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;59821:1:::1;59810:7;:12;;:31;;;;;59837:4;59826:7;:15;;59810:31;59802:40;;;::::0;::::1;;59917:7;59904;59888:12;;:24;;;;:::i;:::-;59887:38;;;;:::i;:::-;59853:19;:72:::0;;;59941:47:::1;::::0;12716:25:1;;;59941:47:0::1;::::0;12704:2:1;12689:18;59941:47:0::1;;;;;;;;59707:289:::0;;;:::o;16993:295::-;17124:4;195:10;17182:38;17198:4;195:10;17213:6;17182:15;:38::i;:::-;17231:27;17241:4;17247:2;17251:6;17231:9;:27::i;:::-;17276:4;17269:11;;;16993:295;;;;;;:::o;60494:363::-;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;60628:1:::1;60617:8;:12;;;60609:21;;;::::0;::::1;;60681:8;:11:::0;;;::::1;;;60649:28;60665:12:::0;60649:13;:28:::1;:::i;:::-;:43;;;;60641:52;;;::::0;::::1;;60729:13;60704:12;60717:8;60704:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;60777:12;60753:11;60765:8;60753:21;;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;60837:12;60821:13;:28;;;;:::i;:::-;60800:8;60809;60800:18;;;;;;;;;:::i;:::-;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;60494:363:::0;;;;:::o;44383:147::-;44016:7;44043:12;;;;;;;;;;:22;;;42011:16;42022:4;42011:10;:16::i;:::-;44497:25:::1;44508:4;44514:7;44497:10;:25::i;:::-;44383:147:::0;;;:::o;45527:218::-;-1:-1:-1;;;;;45623:23:0;;195:10;45623:23;45615:83;;;;-1:-1:-1;;;45615:83:0;;17436:2:1;45615:83:0;;;17418:21:1;17475:2;17455:18;;;17448:30;17514:34;17494:18;;;17487:62;-1:-1:-1;;;17565:18:1;;;17558:45;17620:19;;45615:83:0;;;;;;;;;45711:26;45723:4;45729:7;45711:11;:26::i;:::-;45527:218;;:::o;17697:238::-;17785:4;195:10;17841:64;195:10;17857:7;17894:10;17866:25;195:10;17857:7;17866:9;:25::i;:::-;:38;;;;:::i;:::-;17841:8;:64::i;61341:309::-;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;61469:12:::1;:26:::0;::::1;::::0;;;::::1;::::0;::::1;61456:39:::0;;::::1;;;61448:48;;;::::0;::::1;;-1:-1:-1::0;61507:12:0::1;:37:::0;;-1:-1:-1;;61555:37:0;61507;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;61555:37:0;;;;;;::::1;;::::0;;;::::1;-1:-1:-1::0;;61603:39:0::1;61507:37;61603:39:::0;::::1;;::::0;;;::::1;;::::0;;61341:309::o;52545:397::-;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;52691:7:::1;:14;52671:9;:16;:34;52663:68;;;::::0;-1:-1:-1;;;52663:68:0;;15869:2:1;52663:68:0::1;::::0;::::1;15851:21:1::0;15908:2;15888:18;;;15881:30;-1:-1:-1;;;15927:18:1;;;15920:51;15988:18;;52663:68:0::1;15667:345:1::0;52663:68:0::1;52747:7;52742:193;52764:9;:16;52760:1;:20;;;52742:193;;;52837:7;52845:1;52837:10;;;;;;;;;;:::i;:::-;;;;;;;52810:23;52820:12;195:10:::0;;107:107;52810:23:::1;:37;;52802:46;;;::::0;::::1;;52863:60;195:10:::0;52892:9:::1;52902:1;52892:12;;;;;;;;;;:::i;:::-;;;;;;;52906:7;52914:1;52906:10;;;;;;;;;;:::i;:::-;;;;;;;52917:5;52906:16;;;;:::i;:::-;52863:14;:60::i;:::-;52782:3:::0;::::1;::::0;::::1;:::i;:::-;;;;52742:193;;59568:131:::0;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;-1:-1:-1;59653:28:0;:38;;-1:-1:-1;;59653:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;59568:131::o;61956:186::-;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;62043:36;:47;;;::::1;;::::0;::::1;-1:-1:-1::0;;62043:47:0;;::::1;;::::0;;62106:28:::1;::::0;::::1;::::0;::::1;::::0;62082:8;11850:14:1;11843:22;11825:41;;11813:2;11798:18;;11685:187;62106:28:0::1;;;;;;;;61956:186:::0;;:::o;60311:175::-;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;-1:-1:-1;;;;;;60410:19:0;;::::1;;::::0;;;:11:::1;:19;::::0;;;;;;;:25;;;::::1;;-1:-1:-1::0;;60410:25:0;;::::1;;::::0;;60446:15:::1;:23:::0;;;;;:32;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;60311:175::o;51533:514::-;51588:16;51606:19;51626:20;51648:18;51697:1;51686:8;:12;;;51678:21;;;;;;51722:8;51731;51722:18;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;51710:30;;51766:11;51778:8;51766:21;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;51751:36;;51814:12;51827:8;51814:22;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;51798:38;;51850:8;:13;;51862:1;51850:13;51847:192;;;-1:-1:-1;51874:13:0;;;;;;;;;;;;-1:-1:-1;;;51874:13:0;;;;51847:192;;;51906:8;:13;;51918:1;51906:13;51903:136;;;-1:-1:-1;51930:12:0;;;;;;;;;;;;-1:-1:-1;;;51930:12:0;;;;51903:136;;;51961:8;:13;;51973:1;51961:13;51958:81;;;-1:-1:-1;51985:17:0;;;;;;;;;;;;-1:-1:-1;;;51985:17:0;;;;51958:81;;;-1:-1:-1;52027:12:0;;;;;;;;;;;;-1:-1:-1;;;52027:12:0;;;;51958:81;51533:514;;;;;:::o;42415:147::-;42501:4;42525:12;;;;;;;;;;;-1:-1:-1;;;;;42525:29:0;;;;;;;;;;;;;;;42415:147::o;14080:104::-;14136:13;14169:7;14162:14;;;;;:::i;62404:183::-;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;62519:4:::1;62482:16;15253:18:::0;;;:9;:18;;;;;;;62536:43:::1;::::0;62566:2;15253:18;62536:14:::1;:43::i;18438:436::-:0;18531:4;195:10;18531:4;18614:25;195:10;18631:7;18614:9;:25::i;:::-;18587:52;;18678:15;18658:16;:35;;18650:85;;;;-1:-1:-1;;;18650:85:0;;17030:2:1;18650:85:0;;;17012:21:1;17069:2;17049:18;;;17042:30;17108:34;17088:18;;;17081:62;-1:-1:-1;;;17159:18:1;;;17152:35;17204:19;;18650:85:0;16828:401:1;18650:85:0;18771:60;18780:5;18787:7;18815:15;18796:16;:34;18771:8;:60::i;:::-;-1:-1:-1;18862:4:0;;18438:436;-1:-1:-1;;;;18438:436:0:o;61019:314::-;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;61145:21:::1;:46:::0;;-1:-1:-1;;;;;61145:46:0;;::::1;-1:-1:-1::0;;;;;;61145:46:0;;::::1;::::0;::::1;::::0;;;61202:19:::1;:42:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;61260:65:::1;::::0;;10408:34:1;;;10473:2;10458:18;;10451:43;;;;61260:65:0::1;::::0;10343:18:1;61260:65:0::1;10196:304:1::0;60865:146:0;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;60945:10:::1;:21:::0;;-1:-1:-1;;60945:21:0::1;::::0;::::1;;::::0;;::::1;::::0;;;60982::::1;::::0;11825:41:1;;;60982:21:0::1;::::0;11813:2:1;11798:18;60982:21:0::1;11685:187:1::0;15485:193:0;15564:4;195:10;15620:28;195:10;15637:2;15641:6;15620:9;:28::i;60004:299::-;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;60120:1:::1;60109:7;:12;;:31;;;;;60136:4;60125:7;:15;;60109:31;60101:40;;;::::0;::::1;;60217:7;60206;60191:12;;:22;;;;:::i;:::-;60190:34;;;;:::i;:::-;60152:35:::0;:72;;;60240:55:::1;::::0;12716:25:1;;;60240:55:0::1;::::0;12704:2:1;12689:18;60240:55:0::1;12570:177:1::0;50881:644:0;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;50971:15:::1;51007:9;-1:-1:-1::0;;;;;51007:17:0::1;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50989:46:0::1;;51036:6;;;;;;;;;-1:-1:-1::0;;;;;51036:6:0::1;-1:-1:-1::0;;;;;51036:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50989:76;::::0;-1:-1:-1;;;;;;50989:76:0::1;::::0;;;;;;-1:-1:-1;;;;;10426:15:1;;;50989:76:0::1;::::0;::::1;10408:34:1::0;51059:4:0::1;10458:18:1::0;;;10451:43;10343:18;;50989:76:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50971:94:::0;-1:-1:-1;;;;;;51080:21:0;::::1;51076:343;;51143:9;-1:-1:-1::0;;;;;51143:17:0::1;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;51125:49:0::1;;51175:6;;;;;;;;;-1:-1:-1::0;;;;;51175:6:0::1;-1:-1:-1::0;;;;;51175:11:0::1;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51125:79;::::0;-1:-1:-1;;;;;;51125:79:0::1;::::0;;;;;;-1:-1:-1;;;;;10426:15:1;;;51125:79:0::1;::::0;::::1;10408:34:1::0;51198:4:0::1;10458:18:1::0;;;10451:43;10343:18;;51125:79:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51118:4;:86:::0;;-1:-1:-1;;;;;;51118:86:0::1;-1:-1:-1::0;;;;;51118:86:0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;51219:13:0;;;:7:::1;:13;::::0;;;;;;;:20;;-1:-1:-1;;51219:20:0;;::::1;-1:-1:-1::0;51219:20:0;;::::1;::::0;;;51270:4;;;;::::1;51254:21:::0;;:15:::1;:21:::0;;;;;:28;;;;::::1;::::0;;::::1;::::0;;51076:343:::1;;;51315:4;:14:::0;;-1:-1:-1;;;;;;51315:14:0::1;-1:-1:-1::0;;;;;51315:14:0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;51344:13:0;;;:7:::1;:13;::::0;;;;;;;:20;;-1:-1:-1;;51344:20:0;;::::1;-1:-1:-1::0;51344:20:0;;::::1;::::0;;;51395:4;;;;::::1;51379:21:::0;;:15:::1;:21:::0;;;;;;:28;;;;::::1;;::::0;;51076:343:::1;51429:6;:18:::0;;-1:-1:-1;;;;;;51429:18:0::1;-1:-1:-1::0;;;;;51429:18:0;::::1;::::0;;::::1;::::0;;;51458:59:::1;::::0;51475:4:::1;::::0;-1:-1:-1;;51458:8:0::1;:59::i;62595:296::-:0;62689:10;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;-1:-1:-1;;;;;62720:20:0;::::1;62712:29;;;::::0;::::1;;62779:39;::::0;-1:-1:-1;;;62779:39:0;;62812:4:::1;62779:39;::::0;::::1;10134:51:1::0;62752:24:0::1;::::0;-1:-1:-1;;;;;62779:24:0;::::1;::::0;::::1;::::0;10107:18:1;;62779:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62837:46;::::0;-1:-1:-1;;;62837:46:0;;-1:-1:-1;;;;;10986:32:1;;;62837:46:0::1;::::0;::::1;10968:51:1::0;11035:18;;;11028:34;;;62752:66:0;;-1:-1:-1;62837:23:0;;::::1;::::0;::::1;::::0;10941:18:1;;62837:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62829:54:::0;62595:296;-1:-1:-1;;;;;62595:296:0:o;44823:149::-;44016:7;44043:12;;;;;;;;;;:22;;;42011:16;42022:4;42011:10;:16::i;:::-;44938:26:::1;44950:4;44956:7;44938:11;:26::i;15741:151::-:0;-1:-1:-1;;;;;15857:18:0;;;15830:7;15857:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15741:151::o;61658:291::-;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;61760:29;:40;;-1:-1:-1;;61760:40:0::1;;::::0;::::1;;;;::::0;;61848:12:::1;::::0;61877:5:::1;::::0;61848:24:::1;::::0;61864:7;;61848:24:::1;:::i;:::-;61847:36;;;;:::i;:::-;61811:33:::0;:72;61899:42:::1;::::0;;12500:14:1;;12493:22;12475:41;;12547:2;12532:18;;12525:34;;;61899:42:0::1;::::0;12448:18:1;61899:42:0::1;12307:258:1::0;53331:271:0;-1:-1:-1;;;;;;;;;;;42011:16:0;42022:4;42011:10;:16::i;:::-;53440:9:::1;53436:159;53455:4;:11;53451:1;:15;53436:159;;;53488:36;53508:4;53513:1;53508:7;;;;;;;;:::i;:::-;;;;;;;53517:6;53488:19;:36::i;:::-;53544:39;53567:4;53572:1;53567:7;;;;;;;;:::i;:::-;;;;;;;53576:6;53544:39;;;;;;-1:-1:-1::0;;;;;10691:32:1;;;;10673:51;;10767:14;10760:22;10755:2;10740:18;;10733:50;10661:2;10646:18;;10505:284;53544:39:0::1;;;;;;;;53468:3:::0;::::1;::::0;::::1;:::i;:::-;;;;53436:159;;35062:151:::0;35120:13;35153:52;-1:-1:-1;;;;;35165:22:0;;33044:2;34454:451;34529:13;34555:19;34587:10;34591:6;34587:1;:10;:::i;:::-;:14;;34600:1;34587:14;:::i;:::-;34577:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34577:25:0;;34555:47;;-1:-1:-1;;;34613:6:0;34620:1;34613:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;34613:15:0;;;;;;;;;-1:-1:-1;;;34639:6:0;34646:1;34639:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;34639:15:0;;;;;;;;-1:-1:-1;34670:9:0;34682:10;34686:6;34682:1;:10;:::i;:::-;:14;;34695:1;34682:14;:::i;:::-;34670:26;;34665:135;34702:1;34698;:5;34665:135;;;-1:-1:-1;;;34750:5:0;34758:3;34750:11;34737:25;;;;;;;:::i;:::-;;;;34725:6;34732:1;34725:9;;;;;;;;:::i;:::-;;;;:37;-1:-1:-1;;;;;34725:37:0;;;;;;;;-1:-1:-1;34787:1:0;34777:11;;;;;34705:3;;;:::i;:::-;;;34665:135;;;-1:-1:-1;34818:10:0;;34810:55;;;;-1:-1:-1;;;34810:55:0;;13179:2:1;34810:55:0;;;13161:21:1;;;13198:18;;;13191:30;13257:34;13237:18;;;13230:62;13309:18;;34810:55:0;12977:356:1;42866:105:0;42933:30;42944:4;195:10;42933;:30::i;:::-;42866:105;:::o;22465:380::-;-1:-1:-1;;;;;22601:19:0;;22593:68;;;;-1:-1:-1;;;22593:68:0;;16625:2:1;22593:68:0;;;16607:21:1;16664:2;16644:18;;;16637:30;16703:34;16683:18;;;16676:62;-1:-1:-1;;;16754:18:1;;;16747:34;16798:19;;22593:68:0;16423:400:1;22593:68:0;-1:-1:-1;;;;;22680:21:0;;22672:68;;;;-1:-1:-1;;;22672:68:0;;13944:2:1;22672:68:0;;;13926:21:1;13983:2;13963:18;;;13956:30;14022:34;14002:18;;;13995:62;-1:-1:-1;;;14073:18:1;;;14066:32;14115:19;;22672:68:0;13742:398:1;22672:68:0;-1:-1:-1;;;;;22753:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;22805:32;;12716:25:1;;;22805:32:0;;12689:18:1;22805:32:0;;;;;;;22465:380;;;:::o;58525:283::-;58587:13;58638:21;58621:14;:38;58613:47;;;;;;58694:19;;58686:73;;-1:-1:-1;;;;;58694:19:0;;;;58749:5;;58728:14;;58686:73;;;;58728:14;58694:19;58749:5;58686:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58671:88;;;;;58786:14;58770:12;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;58525:283:0;;;-1:-1:-1;;58525:283:0:o;23136:453::-;23271:24;23298:25;23308:5;23315:7;23298:9;:25::i;:::-;23271:52;;-1:-1:-1;;23338:16:0;:37;23334:248;;23420:6;23400:16;:26;;23392:68;;;;-1:-1:-1;;;23392:68:0;;14347:2:1;23392:68:0;;;14329:21:1;14386:2;14366:18;;;14359:30;14425:31;14405:18;;;14398:59;14474:18;;23392:68:0;14145:353:1;23392:68:0;23504:51;23513:5;23520:7;23548:6;23529:16;:25;23504:8;:51::i;53610:1469::-;53705:24;;;;;;;53701:1371;;;53746:32;53761:4;53767:2;53771:6;53746:14;:32::i;53701:1371::-;-1:-1:-1;;;;;53820:17:0;;;;;;:11;:17;;;;;;;;53819:18;53811:27;;;;;;-1:-1:-1;;;;;53862:15:0;;;;;;:11;:15;;;;;;;;53861:16;53853:25;;;;;;53897:11;;;;;;;53893:36;;53910:19;53924:4;53910:13;:19::i;:::-;53947:16;53954:4;53960:2;53947:6;:16::i;:::-;:31;;;;-1:-1:-1;53967:11:0;;;;;;;53947:31;:63;;;;-1:-1:-1;53982:28:0;;;;53947:63;53944:885;;;54048:19;:31;54038:41;;;54030:50;;;;;;-1:-1:-1;;;;;54103:19:0;;;;;;:15;:19;;;;;;;;54099:179;;54180:35;;54170:6;54154:13;54164:2;-1:-1:-1;;;;;15253:18:0;15226:7;15253:18;;;:9;:18;;;;;;;15152:127;54154:13;:22;;;;:::i;:::-;:61;;54146:112;;;;-1:-1:-1;;;54146:112:0;;15112:2:1;54146:112:0;;;15094:21:1;15151:2;15131:18;;;15124:30;15190:34;15170:18;;;15163:62;-1:-1:-1;;;15241:18:1;;;15234:36;15287:19;;54146:112:0;14910:402:1;54146:112:0;-1:-1:-1;;;;;54300:13:0;;;;;;:7;:13;;;;;;;;:38;;;;-1:-1:-1;54331:6:0;;-1:-1:-1;;;;;54317:21:0;;;54331:6;;54317:21;;54300:38;:58;;;;-1:-1:-1;;;;;;54343:15:0;;;;;;:11;:15;;;;;;;;54342:16;54300:58;:93;;;;-1:-1:-1;54362:12:0;:31;;;54300:93;54296:517;;;-1:-1:-1;;;;;54426:12:0;;;;;;:8;:12;;;;;;54441:15;-1:-1:-1;54418:39:0;;;;;;54514:12;:25;54495:45;;54514:25;;;;;54495:15;:45;:::i;:::-;-1:-1:-1;;;;;54480:12:0;;;;;;:8;:12;;;;;:60;54296:517;;;-1:-1:-1;;;;;54571:13:0;;;;;;:7;:13;;;;;;;;54570:14;:36;;;;-1:-1:-1;;;;;;54589:17:0;;;;;;:11;:17;;;;;;;;54588:18;54570:36;:72;;;;-1:-1:-1;54610:12:0;:32;;;;;;54570:72;54566:247;;;-1:-1:-1;;;;;54674:14:0;;;;;;:8;:14;;;;;;54692:15;-1:-1:-1;54674:33:0;54666:42;;;;;;54767:12;:25;54748:45;;54767:25;;;;;54748:15;:45;:::i;:::-;-1:-1:-1;;;;;54731:14:0;;;;;;:8;:14;;;;;:62;54566:247;54847:16;:14;:16::i;:::-;54843:67;;;54884:10;:8;:10::i;:::-;54924:22;54949:19;54963:4;54949:13;:19::i;:::-;:56;;54999:6;54949:56;;;54971:25;54979:4;54985:2;54989:6;54971:7;:25::i;:::-;54924:81;;55020:40;55035:4;55041:2;55045:14;55020;:40::i;47124:238::-;47208:22;47216:4;47222:7;47208;:22::i;:::-;47203:152;;47247:6;:12;;;;;;;;;;;-1:-1:-1;;;;;47247:29:0;;;;;;;;;:36;;-1:-1:-1;;47247:36:0;47279:4;47247:36;;;47330:12;195:10;;107:107;47330:12;-1:-1:-1;;;;;47303:40:0;47321:7;-1:-1:-1;;;;;47303:40:0;47315:4;47303:40;;;;;;;;;;47124:238;;:::o;47542:239::-;47626:22;47634:4;47640:7;47626;:22::i;:::-;47622:152;;;47697:5;47665:12;;;;;;;;;;;-1:-1:-1;;;;;47665:29:0;;;;;;;;;;:37;;-1:-1:-1;;47665:37:0;;;47722:40;195:10;;47665:12;;47722:40;;47697:5;47722:40;47542:239;;:::o;52950:127::-;53036:33;53052:4;53058:2;53062:6;53036:15;:33::i;53085:234::-;53173:11;53169:132;;;-1:-1:-1;;;;;53201:20:0;;;;;;:11;:20;;;;;:27;;-1:-1:-1;;53201:27:0;53224:4;53201:27;;;45527:218;;:::o;53169:132::-;-1:-1:-1;;;;;;53261:20:0;53284:5;53261:20;;;:11;:20;;;;;:28;;-1:-1:-1;;53261:28:0;;;53085:234::o;43261:492::-;43350:22;43358:4;43364:7;43350;:22::i;:::-;43345:401;;43538:28;43558:7;43538:19;:28::i;:::-;43639:38;43667:4;43674:2;43639:19;:38::i;:::-;43443:257;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;43443:257:0;;;;;;;;;;-1:-1:-1;;;43389:345:0;;;;;;;:::i;55089:133::-;55159:11;;;;;;;;:29;;-1:-1:-1;;;;;;55174:14:0;;;;;;:8;:14;;;;;;;;55159:29;55151:63;;;;-1:-1:-1;;;55151:63:0;;15519:2:1;55151:63:0;;;15501:21:1;15558:2;15538:18;;;15531:30;-1:-1:-1;;;15577:18:1;;;15570:51;15638:18;;55151:63:0;15317:345:1;52188:349:0;52252:4;52277:25;-1:-1:-1;;;;;;;;;;;52297:4:0;52277:7;:25::i;:::-;52276:26;:67;;;;;52320:23;-1:-1:-1;;;;;;;;;;;52340:2:0;52320:7;:23::i;:::-;52319:24;52276:67;:115;;;;;52361:30;-1:-1:-1;;;;;;;;;;;52381:9:0;52361:7;:30::i;:::-;52360:31;52276:115;:147;;;;-1:-1:-1;;;;;;52409:14:0;;;;;;:8;:14;;;;;;;;52408:15;52276:147;:177;;;;-1:-1:-1;;;;;;52441:12:0;;;;;;:8;:12;;;;;;;;52440:13;52276:177;:215;;;;-1:-1:-1;;;;;;52470:21:0;;52484:6;52470:21;;52276:215;:253;;;;-1:-1:-1;;;;;;52508:21:0;;52524:4;52508:21;;52269:260;52188:349;-1:-1:-1;;;52188:349:0:o;56214:377::-;195:10;56263:4;56301:21;;;:7;:21;;;;;;;;56300:22;:64;;;;-1:-1:-1;56340:24:0;;;;;;;56339:25;56300:64;:110;;;;-1:-1:-1;56381:29:0;;;;;;;56300:110;:205;;;;-1:-1:-1;56475:30:0;;56446:26;;:59;;56475:30;;;56446:59;:::i;:::-;56427:15;:78;;56300:205;:283;;;;-1:-1:-1;56550:33:0;;56540:4;15226:7;15253:18;;;:9;:18;;;;;;56522:61;;56300:283;56280:303;;56214:377;:::o;56974:1543::-;49397:24;:31;;-1:-1:-1;;49397:31:0;;;;;57070:33;;57059:6:::1;::::0;57026:41:::1;::::0;57044:4:::1;::::0;-1:-1:-1;;;;;57059:6:0::1;57026:9;:41::i;:::-;:77;57023:167;;;57151:6;::::0;57119:59:::1;::::0;57136:4:::1;::::0;-1:-1:-1;;;;;57151:6:0::1;-1:-1:-1::0;;57119:8:0::1;:59::i;:::-;57229:15;57200:26:::0;:44;57304:33;;57200:17:::1;57259:41:::0;:78:::1;::::0;::::1;::::0;:118:::1;;-1:-1:-1::0;57341:36:0;;;;::::1;;;57259:118;57255:1255;;;57439:33:::0;;:17:::1;57394:78:::0;;:41:::1;::::0;:78:::1;::::0;57439:33;;57394:78:::1;:::i;:::-;::::0;;;-1:-1:-1;;57513:33:0;;57487:23:::1;::::0;57513:37:::1;::::0;57549:1:::1;::::0;57513:37:::1;:::i;:::-;57487:63:::0;-1:-1:-1;57591:21:0::1;57627:27;57487:63:::0;57627:10:::1;:27::i;:::-;57669:17;57689:39;57714:13:::0;57689:21:::1;:39;:::i;:::-;57745:6;::::0;57910:21:::1;::::0;57745:235:::1;::::0;-1:-1:-1;;;57745:235:0;;57812:4:::1;57745:235;::::0;::::1;11414:34:1::0;11464:18;;;11457:34;;;57745:6:0::1;11507:18:1::0;;;11500:34;;;11550:18;;;11543:34;-1:-1:-1;;;;;57910:21:0;;::::1;11593:19:1::0;;;11586:44;57950:15:0::1;11646:19:1::0;;;11639:35;57669:59:0;;-1:-1:-1;57745:6:0::1;::::0;:22:::1;::::0;57669:59;;11348:19:1;;57745:235:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;58002:39:0::1;::::0;;19477:25:1;;;19533:2;19518:18;;19511:34;;;58002:39:0::1;::::0;-1:-1:-1;19450:18:1;58002:39:0::1;;;;;;;57379:674;;;57255:1255;;;58147:33:::0;;58100:21:::1;::::0;58136:45:::1;::::0;:10:::1;:45::i;:::-;58196:17;58216:39;58241:13:::0;58216:21:::1;:39;:::i;:::-;58365:8;:11:::0;58196:59;;-1:-1:-1;58272:25:0::1;::::0;58351::::1;::::0;58365:11:::1;::::0;;::::1;::::0;::::1;::::0;58351::::1;:25;:::i;:::-;58331:11;:14:::0;58300:77:::1;::::0;;::::1;::::0;58314:31:::1;::::0;58331:14;;::::1;::::0;::::1;::::0;58314::::1;:31;:::i;:::-;58301:45;::::0;::::1;;:9:::0;:45:::1;:::i;:::-;58300:77;;;;:::i;:::-;58272:105;;58392:30;58404:17;58392:11;:30::i;:::-;-1:-1:-1::0;58453:33:0;;58444:54:::1;::::0;;19477:25:1;;;19533:2;19518:18;;19511:34;;;58444:54:0::1;::::0;19450:18:1;58444:54:0::1;;;;;;;58059:451;;;57255:1255;49451:24:::0;:32;;-1:-1:-1;;49451:32:0;;;56974:1543::o;55230:124::-;55314:10;;55290:4;;55314:10;;:32;;;;-1:-1:-1;;;;;;;55329:17:0;;;;;:11;:17;;;;;;;;55328:18;;55230:124::o;55362:844::-;-1:-1:-1;;;;;55463:15:0;;55439:7;55463:15;;;:11;:15;;;;;;;;55459:61;;;-1:-1:-1;55502:6:0;55495:13;;55459:61;-1:-1:-1;;;;;55533:11:0;;;;;;:7;:11;;;;;;;;55530:261;;;55564:7;;;;;;;:12;55561:45;;55595:7;:11;;-1:-1:-1;;55595:11:0;;;55561:45;55530:261;;;-1:-1:-1;;;;;55627:13:0;;;;;;:7;:13;;;;;;;;55624:167;;;55659:7;;;;;;;55670:1;55659:12;55656:45;;55690:7;:11;;-1:-1:-1;;55690:11:0;;;;;55624:167;;;55737:7;;;;;;;;;:12;55734:45;;55768:7;:11;;-1:-1:-1;;55768:11:0;;;;;55734:45;55846:14;;;;;;;55825:8;;55834:7;;;;;55825:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;55816:26;;:6;:26;;;;:::i;:::-;55815:45;;;;:::i;:::-;55803:9;:57;55874:36;;;;;;;55871:231;;;56073:12;:15;56055:33;;56073:15;;;;;56055;;;;:33;:::i;:::-;56039:8;:11;56025:25;;56039:11;;;;;56025;;;;:25;:::i;:::-;56024:65;;;;:::i;:::-;56003:12;:15;55971:119;;;;;55985:33;;56003:15;;;;55985;;;;;:33;:::i;:::-;55972:47;;:9;;:47;;;;:::i;:::-;55971:119;;;;:::i;:::-;55926:17;:164;;:41;;:164;;;;;:::i;:::-;;;;-1:-1:-1;;55871:231:0;56114:46;56129:4;56143;56150:9;;56114:14;:46::i;:::-;56189:9;;56180:18;;:6;:18;:::i;:::-;56173:25;55362:844;-1:-1:-1;;;;55362:844:0:o;19344:840::-;-1:-1:-1;;;;;19475:18:0;;19467:68;;;;-1:-1:-1;;;19467:68:0;;16219:2:1;19467:68:0;;;16201:21:1;16258:2;16238:18;;;16231:30;16297:34;16277:18;;;16270:62;-1:-1:-1;;;16348:18:1;;;16341:35;16393:19;;19467:68:0;16017:401:1;19467:68:0;-1:-1:-1;;;;;19554:16:0;;19546:64;;;;-1:-1:-1;;;19546:64:0;;13540:2:1;19546:64:0;;;13522:21:1;13579:2;13559:18;;;13552:30;13618:34;13598:18;;;13591:62;-1:-1:-1;;;13669:18:1;;;13662:33;13712:19;;19546:64:0;13338:399:1;19546:64:0;-1:-1:-1;;;;;19696:15:0;;19674:19;19696:15;;;:9;:15;;;;;;19730:21;;;;19722:72;;;;-1:-1:-1;;;19722:72:0;;14705:2:1;19722:72:0;;;14687:21:1;14744:2;14724:18;;;14717:30;14783:34;14763:18;;;14756:62;-1:-1:-1;;;14834:18:1;;;14827:36;14880:19;;19722:72:0;14503:402:1;19722:72:0;-1:-1:-1;;;;;19830:15:0;;;;;;;:9;:15;;;;;;19848:20;;;19830:38;;20048:13;;;;;;;;;;:23;;;;;;20100:26;;;;;;19862:6;12716:25:1;;12704:2;12689:18;;12570:177;20100:26:0;;;;;;;;20139:37;44383:147;56599:367;56679:16;;;56693:1;56679:16;;;;;;;;56655:21;;56679:16;;;;;;;;;;-1:-1:-1;56679:16:0;56655:40;;56724:4;56706;56711:1;56706:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56706:23:0;;;:7;;;;;;;;;;:23;;;;56750:6;;:13;;;-1:-1:-1;;;56750:13:0;;;;:6;;;;;:11;;:13;;;;;56706:7;;56750:13;;;;;:6;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56740:4;56745:1;56740:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;56740:23:0;;;:7;;;;;;;;;:23;56776:6;;:182;;-1:-1:-1;;;56776:182:0;;:6;;;:57;;:182;;56848:6;;56776;;56885:4;;56912;;56932:15;;56776:182;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56644:322;56599:367;:::o;14:748:1:-;68:5;121:3;114:4;106:6;102:17;98:27;88:55;;139:1;136;129:12;88:55;175:6;162:20;201:4;225:60;241:43;281:2;241:43;:::i;:::-;225:60;:::i;:::-;307:3;331:2;326:3;319:15;359:2;354:3;350:12;343:19;;394:2;386:6;382:15;446:3;441:2;435;432:1;428:10;420:6;416:23;412:32;409:41;406:61;;;463:1;460;453:12;406:61;485:1;495:238;509:2;506:1;503:9;495:238;;;580:3;567:17;597:31;622:5;597:31;:::i;:::-;641:18;;679:12;;;;711;;;;527:1;520:9;495:238;;;-1:-1:-1;751:5:1;;14:748;-1:-1:-1;;;;;;;14:748:1:o;767:159::-;834:20;;894:6;883:18;;873:29;;863:57;;916:1;913;906:12;863:57;767:159;;;:::o;931:156::-;997:20;;1057:4;1046:16;;1036:27;;1026:55;;1077:1;1074;1067:12;1092:247;1151:6;1204:2;1192:9;1183:7;1179:23;1175:32;1172:52;;;1220:1;1217;1210:12;1172:52;1259:9;1246:23;1278:31;1303:5;1278:31;:::i;1344:251::-;1414:6;1467:2;1455:9;1446:7;1442:23;1438:32;1435:52;;;1483:1;1480;1473:12;1435:52;1515:9;1509:16;1534:31;1559:5;1534:31;:::i;1600:388::-;1668:6;1676;1729:2;1717:9;1708:7;1704:23;1700:32;1697:52;;;1745:1;1742;1735:12;1697:52;1784:9;1771:23;1803:31;1828:5;1803:31;:::i;:::-;1853:5;-1:-1:-1;1910:2:1;1895:18;;1882:32;1923:33;1882:32;1923:33;:::i;:::-;1975:7;1965:17;;;1600:388;;;;;:::o;1993:456::-;2070:6;2078;2086;2139:2;2127:9;2118:7;2114:23;2110:32;2107:52;;;2155:1;2152;2145:12;2107:52;2194:9;2181:23;2213:31;2238:5;2213:31;:::i;:::-;2263:5;-1:-1:-1;2320:2:1;2305:18;;2292:32;2333:33;2292:32;2333:33;:::i;:::-;1993:456;;2385:7;;-1:-1:-1;;;2439:2:1;2424:18;;;;2411:32;;1993:456::o;2454:517::-;2525:6;2533;2541;2594:2;2582:9;2573:7;2569:23;2565:32;2562:52;;;2610:1;2607;2600:12;2562:52;2649:9;2636:23;2668:31;2693:5;2668:31;:::i;:::-;2718:5;-1:-1:-1;2775:2:1;2760:18;;2747:32;2788:30;2747:32;2788:30;:::i;:::-;2837:7;-1:-1:-1;2896:2:1;2881:18;;2868:32;2909:30;2868:32;2909:30;:::i;:::-;2958:7;2948:17;;;2454:517;;;;;:::o;2976:315::-;3044:6;3052;3105:2;3093:9;3084:7;3080:23;3076:32;3073:52;;;3121:1;3118;3111:12;3073:52;3160:9;3147:23;3179:31;3204:5;3179:31;:::i;:::-;3229:5;3281:2;3266:18;;;;3253:32;;-1:-1:-1;;;2976:315:1:o;3296:1149::-;3414:6;3422;3475:2;3463:9;3454:7;3450:23;3446:32;3443:52;;;3491:1;3488;3481:12;3443:52;3531:9;3518:23;3560:18;3601:2;3593:6;3590:14;3587:34;;;3617:1;3614;3607:12;3587:34;3640:61;3693:7;3684:6;3673:9;3669:22;3640:61;:::i;:::-;3630:71;;3720:2;3710:12;;3775:2;3764:9;3760:18;3747:32;3804:2;3794:8;3791:16;3788:36;;;3820:1;3817;3810:12;3788:36;3843:24;;;-1:-1:-1;3898:4:1;3890:13;;3886:27;-1:-1:-1;3876:55:1;;3927:1;3924;3917:12;3876:55;3963:2;3950:16;3986:60;4002:43;4042:2;4002:43;:::i;3986:60::-;4068:3;4092:2;4087:3;4080:15;4120:2;4115:3;4111:12;4104:19;;4151:2;4147;4143:11;4199:7;4194:2;4188;4185:1;4181:10;4177:2;4173:19;4169:28;4166:41;4163:61;;;4220:1;4217;4210:12;4163:61;4242:1;4233:10;;4252:163;4266:2;4263:1;4260:9;4252:163;;;4323:17;;4311:30;;4284:1;4277:9;;;;;4361:12;;;;4393;;4252:163;;;4256:3;4434:5;4424:15;;;;;;;3296:1149;;;;;:::o;4450:477::-;4540:6;4548;4601:2;4589:9;4580:7;4576:23;4572:32;4569:52;;;4617:1;4614;4607:12;4569:52;4657:9;4644:23;4690:18;4682:6;4679:30;4676:50;;;4722:1;4719;4712:12;4676:50;4745:61;4798:7;4789:6;4778:9;4774:22;4745:61;:::i;:::-;4735:71;;;4856:2;4845:9;4841:18;4828:32;4869:28;4891:5;4869:28;:::i;4932:241::-;4988:6;5041:2;5029:9;5020:7;5016:23;5012:32;5009:52;;;5057:1;5054;5047:12;5009:52;5096:9;5083:23;5115:28;5137:5;5115:28;:::i;5178:245::-;5245:6;5298:2;5286:9;5277:7;5273:23;5269:32;5266:52;;;5314:1;5311;5304:12;5266:52;5346:9;5340:16;5365:28;5387:5;5365:28;:::i;5428:446::-;5497:6;5505;5513;5566:2;5554:9;5545:7;5541:23;5537:32;5534:52;;;5582:1;5579;5572:12;5534:52;5621:9;5608:23;5640:28;5662:5;5640:28;:::i;:::-;5687:5;-1:-1:-1;5744:2:1;5729:18;;5716:32;5757:30;5716:32;5757:30;:::i;:::-;5806:7;-1:-1:-1;5832:36:1;5864:2;5849:18;;5832:36;:::i;:::-;5822:46;;5428:446;;;;;:::o;5879:309::-;5944:6;5952;6005:2;5993:9;5984:7;5980:23;5976:32;5973:52;;;6021:1;6018;6011:12;5973:52;6060:9;6047:23;6079:28;6101:5;6079:28;:::i;6193:180::-;6252:6;6305:2;6293:9;6284:7;6280:23;6276:32;6273:52;;;6321:1;6318;6311:12;6273:52;-1:-1:-1;6344:23:1;;6193:180;-1:-1:-1;6193:180:1:o;6378:315::-;6446:6;6454;6507:2;6495:9;6486:7;6482:23;6478:32;6475:52;;;6523:1;6520;6513:12;6475:52;6559:9;6546:23;6536:33;;6619:2;6608:9;6604:18;6591:32;6632:31;6657:5;6632:31;:::i;6698:286::-;6756:6;6809:2;6797:9;6788:7;6784:23;6780:32;6777:52;;;6825:1;6822;6815:12;6777:52;6851:23;;-1:-1:-1;;;;;;6903:32:1;;6893:43;;6883:71;;6950:1;6947;6940:12;7268:326;7341:6;7349;7357;7410:2;7398:9;7389:7;7385:23;7381:32;7378:52;;;7426:1;7423;7416:12;7378:52;7449:28;7467:9;7449:28;:::i;:::-;7439:38;;7496:37;7529:2;7518:9;7514:18;7496:37;:::i;7784:184::-;7854:6;7907:2;7895:9;7886:7;7882:23;7878:32;7875:52;;;7923:1;7920;7913:12;7875:52;-1:-1:-1;7946:16:1;;7784:184;-1:-1:-1;7784:184:1:o;7973:248::-;8041:6;8049;8102:2;8090:9;8081:7;8077:23;8073:32;8070:52;;;8118:1;8115;8108:12;8070:52;-1:-1:-1;;8141:23:1;;;8211:2;8196:18;;;8183:32;;-1:-1:-1;7973:248:1:o;8226:306::-;8314:6;8322;8330;8383:2;8371:9;8362:7;8358:23;8354:32;8351:52;;;8399:1;8396;8389:12;8351:52;8428:9;8422:16;8412:26;;8478:2;8467:9;8463:18;8457:25;8447:35;;8522:2;8511:9;8507:18;8501:25;8491:35;;8226:306;;;;;:::o;8537:182::-;8594:6;8647:2;8635:9;8626:7;8622:23;8618:32;8615:52;;;8663:1;8660;8653:12;8615:52;8686:27;8703:9;8686:27;:::i;8724:258::-;8766:3;8804:5;8798:12;8831:6;8826:3;8819:19;8847:63;8903:6;8896:4;8891:3;8887:14;8880:4;8873:5;8869:16;8847:63;:::i;:::-;8964:2;8943:15;-1:-1:-1;;8939:29:1;8930:39;;;;8971:4;8926:50;;8724:258;-1:-1:-1;;8724:258:1:o;9197:786::-;9608:25;9603:3;9596:38;9578:3;9663:6;9657:13;9679:62;9734:6;9729:2;9724:3;9720:12;9713:4;9705:6;9701:17;9679:62;:::i;:::-;-1:-1:-1;;;9800:2:1;9760:16;;;9792:11;;;9785:40;9850:13;;9872:63;9850:13;9921:2;9913:11;;9906:4;9894:17;;9872:63;:::i;:::-;9955:17;9974:2;9951:26;;9197:786;-1:-1:-1;;;;9197:786:1:o;12752:220::-;12901:2;12890:9;12883:21;12864:4;12921:45;12962:2;12951:9;12947:18;12939:6;12921:45;:::i;17650:481::-;17840:4;17869:6;17914:2;17906:6;17902:15;17891:9;17884:34;17966:2;17958:6;17954:15;17949:2;17938:9;17934:18;17927:43;18018:2;18010:6;18006:15;18001:2;17990:9;17986:18;17979:43;;18058:3;18053:2;18042:9;18038:18;18031:31;18079:46;18120:3;18109:9;18105:19;18097:6;18079:46;:::i;:::-;18071:54;17650:481;-1:-1:-1;;;;;;17650:481:1:o;18318:980::-;18580:4;18628:3;18617:9;18613:19;18659:6;18648:9;18641:25;18685:2;18723:6;18718:2;18707:9;18703:18;18696:34;18766:3;18761:2;18750:9;18746:18;18739:31;18790:6;18825;18819:13;18856:6;18848;18841:22;18894:3;18883:9;18879:19;18872:26;;18933:2;18925:6;18921:15;18907:29;;18954:1;18964:195;18978:6;18975:1;18972:13;18964:195;;;19043:13;;-1:-1:-1;;;;;19039:39:1;19027:52;;19134:15;;;;19099:12;;;;19075:1;18993:9;18964:195;;;-1:-1:-1;;;;;;;19215:32:1;;;;19210:2;19195:18;;19188:60;-1:-1:-1;;;19279:3:1;19264:19;19257:35;19176:3;18318:980;-1:-1:-1;;;18318:980:1:o;20728:275::-;20799:2;20793:9;20864:2;20845:13;;-1:-1:-1;;20841:27:1;20829:40;;20899:18;20884:34;;20920:22;;;20881:62;20878:88;;;20946:18;;:::i;:::-;20982:2;20975:22;20728:275;;-1:-1:-1;20728:275:1:o;21008:183::-;21068:4;21101:18;21093:6;21090:30;21087:56;;;21123:18;;:::i;:::-;-1:-1:-1;21168:1:1;21164:14;21180:4;21160:25;;21008:183::o;21196:224::-;21235:3;21263:6;21296:2;21293:1;21289:10;21326:2;21323:1;21319:10;21357:3;21353:2;21349:12;21344:3;21341:21;21338:47;;;21365:18;;:::i;:::-;21401:13;;21196:224;-1:-1:-1;;;;21196:224:1:o;21425:128::-;21465:3;21496:1;21492:6;21489:1;21486:13;21483:39;;;21502:18;;:::i;:::-;-1:-1:-1;21538:9:1;;21425:128::o;21558:217::-;21598:1;21624;21614:132;;21668:10;21663:3;21659:20;21656:1;21649:31;21703:4;21700:1;21693:15;21731:4;21728:1;21721:15;21614:132;-1:-1:-1;21760:9:1;;21558:217::o;21780:168::-;21820:7;21886:1;21882;21878:6;21874:14;21871:1;21868:21;21863:1;21856:9;21849:17;21845:45;21842:71;;;21893:18;;:::i;:::-;-1:-1:-1;21933:9:1;;21780:168::o;21953:125::-;21993:4;22021:1;22018;22015:8;22012:34;;;22026:18;;:::i;:::-;-1:-1:-1;22063:9:1;;21953:125::o;22083:258::-;22155:1;22165:113;22179:6;22176:1;22173:13;22165:113;;;22255:11;;;22249:18;22236:11;;;22229:39;22201:2;22194:10;22165:113;;;22296:6;22293:1;22290:13;22287:48;;;-1:-1:-1;;22331:1:1;22313:16;;22306:27;22083:258::o;22346:136::-;22385:3;22413:5;22403:39;;22422:18;;:::i;:::-;-1:-1:-1;;;22458:18:1;;22346:136::o;22487:380::-;22566:1;22562:12;;;;22609;;;22630:61;;22684:4;22676:6;22672:17;22662:27;;22630:61;22737:2;22729:6;22726:14;22706:18;22703:38;22700:161;;;22783:10;22778:3;22774:20;22771:1;22764:31;22818:4;22815:1;22808:15;22846:4;22843:1;22836:15;22700:161;;22487:380;;;:::o;22872:135::-;22911:3;-1:-1:-1;;22932:17:1;;22929:43;;;22952:18;;:::i;:::-;-1:-1:-1;22999:1:1;22988:13;;22872:135::o;23012:175::-;23049:3;23093:4;23086:5;23082:16;23122:4;23113:7;23110:17;23107:43;;;23130:18;;:::i;:::-;23179:1;23166:15;;23012:175;-1:-1:-1;;23012:175:1:o;23192:127::-;23253:10;23248:3;23244:20;23241:1;23234:31;23284:4;23281:1;23274:15;23308:4;23305:1;23298:15;23324:127;23385:10;23380:3;23376:20;23373:1;23366:31;23416:4;23413:1;23406:15;23440:4;23437:1;23430:15;23456:127;23517:10;23512:3;23508:20;23505:1;23498:31;23548:4;23545:1;23538:15;23572:4;23569:1;23562:15;23588:131;-1:-1:-1;;;;;23663:31:1;;23653:42;;23643:70;;23709:1;23706;23699:12;23724:118;23810:5;23803:13;23796:21;23789:5;23786:32;23776:60;;23832:1;23829;23822:12

Swarm Source

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