ETH Price: $3,280.68 (-5.59%)

Contract

0x2F05577606f1Ae37DC3a553f28916e22dE49A2F9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve212579092024-11-24 13:29:5955 days ago1732454999IN
0x2F055776...2dE49A2F9
0 ETH0.0003119811.42679099
Approve212579062024-11-24 13:29:2355 days ago1732454963IN
0x2F055776...2dE49A2F9
0 ETH0.0005456711.5602441
Approve211979082024-11-16 4:36:3563 days ago1731731795IN
0x2F055776...2dE49A2F9
0 ETH0.0009233719.68689556
Exclude From Fee211978952024-11-16 4:33:5963 days ago1731731639IN
0x2F055776...2dE49A2F9
0 ETH0.0004176717.09100887
Approve211978732024-11-16 4:29:3563 days ago1731731375IN
0x2F055776...2dE49A2F9
0 ETH0.0005099318.88443536
Approve211978682024-11-16 4:28:3563 days ago1731731315IN
0x2F055776...2dE49A2F9
0 ETH0.0007510216.01236491
Exclude From Fee211978472024-11-16 4:24:2363 days ago1731731063IN
0x2F055776...2dE49A2F9
0 ETH0.0003851215.7593241
Approve211978312024-11-16 4:21:1163 days ago1731730871IN
0x2F055776...2dE49A2F9
0 ETH0.0005893619.77549869
Exclude From Fee211978162024-11-16 4:18:1163 days ago1731730691IN
0x2F055776...2dE49A2F9
0 ETH0.0004010516.41104527
Approve211977982024-11-16 4:14:2363 days ago1731730463IN
0x2F055776...2dE49A2F9
0 ETH0.0007099415.13640409
Exclude From Fee211977912024-11-16 4:12:5963 days ago1731730379IN
0x2F055776...2dE49A2F9
0 ETH0.0004181917.11250699
Approve194008182024-03-09 23:26:59314 days ago1710026819IN
0x2F055776...2dE49A2F9
0 ETH0.0028826861.476353
Exclude From Fee194007962024-03-09 23:22:35314 days ago1710026555IN
0x2F055776...2dE49A2F9
0 ETH0.0014079657.61357337
Approve184661822023-10-30 23:14:59445 days ago1698707699IN
0x2F055776...2dE49A2F9
0 ETH0.0013877629.4
Approve175987012023-07-01 10:45:35567 days ago1688208335IN
0x2F055776...2dE49A2F9
0 ETH0.0007430615.75
Approve172152872023-05-08 10:49:23621 days ago1683542963IN
0x2F055776...2dE49A2F9
0 ETH0.004121187.35043656
Approve165510692023-02-03 21:53:23714 days ago1675461203IN
0x2F055776...2dE49A2F9
0 ETH0.0013721329.08366818
Approve165509882023-02-03 21:37:11714 days ago1675460231IN
0x2F055776...2dE49A2F9
0 ETH0.0018103938.37288149
Approve158401672022-10-27 15:00:23814 days ago1666882823IN
0x2F055776...2dE49A2F9
0 ETH0.000892718.89769587
Approve158401592022-10-27 14:58:47814 days ago1666882727IN
0x2F055776...2dE49A2F9
0 ETH0.0010835423.0841679
Approve157439402022-10-14 4:23:35827 days ago1665721415IN
0x2F055776...2dE49A2F9
0 ETH0.0006663914.1068314
Approve157439282022-10-14 4:21:11827 days ago1665721271IN
0x2F055776...2dE49A2F9
0 ETH0.0006957714.72888587
Approve156159662022-09-26 7:10:11845 days ago1664176211IN
0x2F055776...2dE49A2F9
0 ETH0.000295776.2612896
Approve155475362022-09-16 17:03:23855 days ago1663347803IN
0x2F055776...2dE49A2F9
0 ETH0.0008685818.38698185
Approve154872042022-09-07 0:29:01864 days ago1662510541IN
0x2F055776...2dE49A2F9
0 ETH0.002272948.11498307
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
THICCETH

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-23
*/

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol

//  SPDX-License-Identifier: MIT
pragma solidity >=0.6.2;

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

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

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

// File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol

pragma solidity >=0.6.2;


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

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

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol

pragma solidity >=0.5.0;

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

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

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

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

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

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

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

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

    function initialize(address, address) external;
}

// File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol

pragma solidity >=0.5.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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 functionCall(target, data, "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");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(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) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(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) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason 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 {
            // 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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

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

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

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

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

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

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

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

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

// File: contracts/ethTHICC.sol

pragma solidity 0.8.1;







contract THICCETH is IERC20 {
    using SafeMath for uint256;
    using Address for address;

    address constant ThiccFund = 0x8b694C1c3339B77148614A0334D93453873a0148;
    address constant Competitions = 0x29c7D6de798821013f6Bfd9EB82BC81814DCC745;
    address private GameRewards = 0x683dea848582eC23efbfF4bbE9F870C5C238844F;
    address constant Marketing = 0x33663752493958b7A7B19De530bd03582326C484;
    address constant ProjectExpansion = 0xCF3584eD03Fb17637981b77d9a352C793EA8d7Ad;
    address private stakingReward= 0x5eF52D199F2d5cb5Fd5af0e104FD05Dc7E7E0B36;


    // here we store Token holder who have more than one THICC token.
    address[] private TokenHolders;
    // here we store partner contract address.
    address private PartnerContractAddress;
    // here we store the NFT holder address
    address private nftContractAddress;
    // here we store bridge contract address.
    address private ethBridgeContract;

    uint256 constant holderFeePercent = 2;
    uint256 constant nftHolderFeePercent = 2;
    uint256 constant partnerHoldersFeePercent = 5;
    uint256 constant GameRewardPercent = 1;

    address private immutable owner;

    mapping(address => bool) private _isBots;
    mapping(address => bool) private _HolderExist;

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

    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcluded;
    address[] private _excluded;

    uint256 constant minimumTokenHolder = 1 * (10**_decimals);
    uint256 private constant MAX = ~uint256(0);
    // total supply is ten trillion
    uint256 constant _tTotal = 10000000000000 * 10**_decimals; 
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string constant _name = "Thicc Frens Token";
    string constant _symbol = "THICC";
    uint8 constant _decimals = 9;

    uint256 private _taxFee;
    uint256 private _previousTaxFee = _taxFee;

    // This _liquidityFee is for normal user
    uint256 private _liquidityFee = 10;
    // This _botliquidityFee is for bot
    uint256 constant _botliquidityFee = 30;

    uint256 private _previousLiquidityFee = _liquidityFee;

    IUniswapV2Router02 private uniswapV2Router;
    address private uniswapV2Pair;

    bool tradingOpen = false;

    constructor() {
        owner = _msgSender();

        uint256 rToken = _rTotal / 100;
        uint256 tToken = _tTotal / 100;

        uint256 rTokenOnePercent = rToken * 1;
        uint256 tTokenOnePercent = tToken * 1;

        uint256 rTokenTwoPercent = rToken * 2;
        uint256 tTokenTwoPercent = tToken * 2;

        uint256 rTokenFourPercent = rToken *4 ;
        uint256 tTokenFourPercent = tToken *4 ;

        uint256 rTokenEightPercent = rToken * 8;
        uint256 tTokenEightPercent = tToken * 8;

        uint256 rTokenEightyPercent = rToken * 80;
        uint256 tTokenEightyPercent = tToken * 80;

        _rOwned[_msgSender()] = rTokenEightyPercent;
        emit Transfer(address(0), _msgSender(), tTokenEightyPercent);

         _rOwned[stakingReward] = rTokenEightPercent;
        emit Transfer(address(0),stakingReward, tTokenEightPercent);


        _rOwned[ThiccFund] = rTokenOnePercent;
        emit Transfer(address(0), ThiccFund, tTokenOnePercent);

        _rOwned[Competitions] = rTokenOnePercent;
        emit Transfer(address(0), Competitions, tTokenOnePercent);

        _rOwned[GameRewards] = rTokenFourPercent;
        emit Transfer(address(0), GameRewards, tTokenFourPercent);

        _rOwned[Marketing] = rTokenTwoPercent;
        emit Transfer(address(0), Marketing, tTokenTwoPercent);

        _rOwned[ProjectExpansion] = rTokenFourPercent;
        emit Transfer(address(0), ProjectExpansion, tTokenFourPercent);
        TokenHolders.push(ThiccFund);
        TokenHolders.push(Competitions);
        TokenHolders.push(GameRewards);
        TokenHolders.push(Marketing);
        TokenHolders.push(ProjectExpansion);
        TokenHolders.push(stakingReward);

    }

    function initContract() external onlyOwner {
        // Uniswap V2: 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());

        uniswapV2Router = _uniswapV2Router;

        _isExcludedFromFee[owner] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[ThiccFund] = true;
        _isExcludedFromFee[Competitions] = true;
        _isExcludedFromFee[GameRewards] = true;
        _isExcludedFromFee[Marketing] = true;
        _isExcludedFromFee[ProjectExpansion] = true;
        _isExcludedFromFee[stakingReward] = true;
        _isExcludedFromFee[nftContractAddress] = true;
        _isExcludedFromFee[PartnerContractAddress] = true;
        
    }

    function openTrading() external onlyOwner {
        _liquidityFee = _previousLiquidityFee;
        _taxFee = _previousTaxFee;
        tradingOpen = true;
    }
    function getPartnerContract() external view returns(address){
        return PartnerContractAddress;

    }
    function getNFTContract() external view returns(address){
        return nftContractAddress;
        
    }
    function getEthBridgeContract() external view returns(address){
        return ethBridgeContract;
        
    }
    function getStakingReward() external view returns(address){
        return stakingReward;
    }

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

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

    modifier onlyOwner() {
        require(
            ContractOwner() == _msgSender(),
            "Ownable: caller is not the owner"
        );
        _;
    }

    modifier zeroAddress(address _account) {
        require(_account != address(0), "address can't be zero address");
        _;
    }

    // This function is used to change bridge Contract address
    function addBridgeContract(address _bridgeAddress)
        external
        onlyOwner
        zeroAddress(_bridgeAddress)
    {
        ethBridgeContract = _bridgeAddress;
        _isExcludedFromFee[_bridgeAddress]= true;

    }

    // This function is used to change GameRewards address
    function GameRewardsContract(address _changeGameRewardAddress)
        external
        onlyOwner
        zeroAddress(_changeGameRewardAddress)
    {
        GameRewards = _changeGameRewardAddress;
        _isExcludedFromFee[_changeGameRewardAddress]= true;
    }
    function stakingRewardContract(address _changeStakingAddress) external onlyOwner zeroAddress(_changeStakingAddress){
        stakingReward=_changeStakingAddress;
        _isExcludedFromFee[_changeStakingAddress]= true;
        
             

    }

    // here we add/change partner contract address
    function addPartnerContractAddress(address _partnerContractaddress)
        external
        onlyOwner
        zeroAddress(_partnerContractaddress)
        returns (bool)
    {
        PartnerContractAddress = _partnerContractaddress;
        _isExcludedFromFee[_partnerContractaddress]= true;

        return true;
    }

    // here we add bot address manually
    function BotAddress(address _BotAddress)
        external
        zeroAddress(_BotAddress)
        onlyOwner
        returns (bool)
    {
        _isBots[_BotAddress] = true;
        return true;
    }

    // here we add token holder manually to the TokenHolders
    function addTokenHolders(address _tokenHolders)
        external
        onlyOwner
        zeroAddress(_tokenHolders)
        returns (bool)
    {
        TokenHolders.push(_tokenHolders);
        _HolderExist[_tokenHolders] = true;

        return true;
    }

    // This function is used to change/add the NFT holder address.
    function addNftContractAddress(address _nftContractAddress)
        external
        onlyOwner
        zeroAddress(_nftContractAddress)
        returns (address)
    {
        nftContractAddress = _nftContractAddress;
        return nftContractAddress;
    }

    // This function is used to clean token holder manually
    function cleanOldTokenHolders(uint256 size) external onlyOwner {
        address deleteaddress;
        for (uint256 i = 0; i < size; i++) {
            deleteaddress = TokenHolders[i];
            _HolderExist[deleteaddress] = false;
        }
        uint256 j = 0;
        for (uint256 i = size; i < TokenHolders.length; i++) {
            TokenHolders[j] = TokenHolders[i];
            j++;
        }
        for (uint256 k = 0; k < size; k++) {
            TokenHolders.pop();
        }
    }

    //Removing the holder on demand or only creator can call this function in case he thinks some of the liquidity pool or other address should be removed.
    function _removeHolder(address holderAddress) private returns (bool) {
        uint256 holderindex = TokenHolders.length;
        for (uint256 i = 0; i < TokenHolders.length; i++) {
            if (TokenHolders[i] == holderAddress) {
                holderindex = i;
                break;
            }
        }
        if (holderindex == TokenHolders.length) {
            return false;
        }
        if (TokenHolders.length == 1) {
            TokenHolders.pop();
            _HolderExist[holderAddress] = false;
            return true;
        } else if (holderindex == TokenHolders.length - 1) {
            TokenHolders.pop();
            _HolderExist[holderAddress] = false;
            return true;
        } else {
            for (uint256 i = holderindex; i < TokenHolders.length - 1; i++) {
                TokenHolders[i] = TokenHolders[i + 1];
            }
            TokenHolders.pop();
            _HolderExist[holderAddress] = false;
            return true;
        }
    }

    function name() external pure returns (string memory) {
        return _name;
    }

    function symbol() external pure returns (string memory) {
        return _symbol;
    }

    function decimals() external pure returns (uint8) {
        return _decimals;
    }

    function totalSupply() external pure override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return _tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount)
        external
        override
        returns (bool)
    {
        _transfer(_msgSender(), recipient, amount);

        uint256 balanceOfUser = balanceOf(recipient);
        balanceOfUser = balanceOfUser + amount;

        if (
            balanceOfUser >= minimumTokenHolder &&
            !_isBots[recipient] &&
            !_HolderExist[recipient]
        ) {
            TokenHolders.push(recipient);
            _HolderExist[recipient] = true;
        }
        return true;
    }

    function allowance(address _owner, address spender)
        external
        view
        override
        returns (uint256)
    {
        return _allowances[_owner][spender];
    }

    function approve(address spender, uint256 amount)
        public
        override
        returns (bool)
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        if (msg.sender != ethBridgeContract) {
            _approve(
                sender,
                _msgSender(),
                _allowances[sender][_msgSender()].sub(
                    amount,
                    "ERC20: transfer amount exceeds allowance"
                )
            );
        }
        _transfer(sender, recipient, amount);

        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].add(addedValue)
        );
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    function _tokenFromReflection(uint256 rAmount)
        private
        view
        returns (uint256)
    {
        require(rAmount <= _rTotal, "Amount greater than rTotal");
        uint256 currentRate = _getRate();
        return rAmount.div(currentRate);
    }

    function excludeFromReward(address account) external onlyOwner {
        require(!_isExcluded[account], "Account is already excluded");
        if (_rOwned[account] > 0) {
            _tOwned[account] = _tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function _approve(
        address _owner,
        address spender,
        uint256 amount
    ) private {
        require(_owner != address(0), "Cannot approve zero address");
        require(spender != address(0), "Cannot approve zero address");

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) private {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        bool isBot = false;

        // buy
        if (
            from == uniswapV2Pair &&
            to != address(uniswapV2Router) &&
            !_isExcludedFromFee[to]
        ) {
            require(tradingOpen, "Trading not yet enabled.");
        }

        if (!_isBots[from] && _HolderExist[from]) {
            uint256 beforeTransferBalance = balanceOf(from);
            uint256 remainingTokenBalance = beforeTransferBalance - amount;
            if (remainingTokenBalance < minimumTokenHolder) {
                _removeHolder(from);
            }
        }

        bool takeFee = false;

        //take fee only on swaps
        if (
            (from == uniswapV2Pair || to == uniswapV2Pair) &&
            !(_isExcludedFromFee[from] || _isExcludedFromFee[to])
        ) {
            takeFee = true;
        }

        if (_isBots[from] || _isBots[to]) {
            isBot = true;
        }

        _tokenTransfer(from, to, amount, takeFee, isBot);
    }

    function _tokenTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool takeFee,
        bool isBot
    ) private {
        if (!takeFee) _removeAllFee();

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount, isBot);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount, isBot);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount, isBot);
        } else {
            _transferStandard(sender, recipient, amount, isBot);
        }

        if (!takeFee) _restoreAllFee();
    }

    function _transferStandard(
        address sender,
        address recipient,
        uint256 tAmount,
        bool isBot
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount, isBot);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);

        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);

        if (isBot) {
            _takeBotLiquidity(tLiquidity);
        } else {
            _takeLiquidity(tLiquidity);
        }

        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(
        address sender,
        address recipient,
        uint256 tAmount,
        bool isBot
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount, isBot);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(
        address sender,
        address recipient,
        uint256 tAmount,
        bool isBot
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount, isBot);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(
        address sender,
        address recipient,
        uint256 tAmount,
        bool isBot
    ) private {
        (
            uint256 rAmount,
            uint256 rTransferAmount,
            uint256 rFee,
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getValues(tAmount, isBot);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeLiquidity(tLiquidity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    function _getValues(uint256 tAmount, bool isBot)
        private
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        (
            uint256 tTransferAmount,
            uint256 tFee,
            uint256 tLiquidity
        ) = _getTValues(tAmount, isBot);
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(
            tAmount,
            tFee,
            tLiquidity,
            _getRate()
        );
        return (
            rAmount,
            rTransferAmount,
            rFee,
            tTransferAmount,
            tFee,
            tLiquidity
        );
    }

    function _getTValues(uint256 tAmount, bool isBot)
        private
        view
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 tFee = _calculateTaxFee(tAmount);
        uint256 tLiquidity = _calculateLiquidityFee(tAmount, isBot);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tLiquidity);
        return (tTransferAmount, tFee, tLiquidity);
    }

    function _getRValues(
        uint256 tAmount,
        uint256 tFee,
        uint256 tLiquidity,
        uint256 currentRate
    )
        private
        pure
        returns (
            uint256,
            uint256,
            uint256
        )
    {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rLiquidity = tLiquidity.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee).sub(rLiquidity);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns (uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns (uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (
                _rOwned[_excluded[i]] > rSupply ||
                _tOwned[_excluded[i]] > tSupply
            ) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    // here we calculate the actual distribution of 10% and 30% liquidity fee
    function _takeLiquidity(uint256 tLiquidity) private {
        uint256 onePercentRate = tLiquidity / 10;
        uint256 tLiquidityHolder = onePercentRate * holderFeePercent;
        uint256 tLiquidityPartnerHolder = onePercentRate *
            partnerHoldersFeePercent;
        uint256 tLiquidityNftHolder = onePercentRate * nftHolderFeePercent;
        uint256 tLiquidityGameAmount = onePercentRate * GameRewardPercent;

        // here we calculate 2% liquidity for token holder
        uint256 currentRate = _getRate();
        uint256 rLiquidityHolder = tLiquidityHolder.mul(currentRate);
        uint256 rLiquidityPerHolder = rLiquidityHolder / TokenHolders.length;
        uint256 tLiquidityPerHolder = tLiquidityHolder / TokenHolders.length;
        // here we calculate 5% liquidity for partner holder
        uint256 rLiquidityPartner = tLiquidityPartnerHolder.mul(currentRate);

        // here we calculate 1% liquidity for staking contract.

        uint256 rLiquidityGame = tLiquidityGameAmount.mul(currentRate);

        // here we calculate 2% liquidity for NFT holder

        uint256 rLiquidityNFT = tLiquidityNftHolder.mul(currentRate);

        // here we transfer 2% to NFT contract address
        _rOwned[nftContractAddress] = _rOwned[nftContractAddress].add(
            rLiquidityNFT
        );

        _tOwned[nftContractAddress] = _tOwned[nftContractAddress].add(
            tLiquidityNftHolder
        );

        // here we transfer 1% to game contract address (buy and sell).
        _rOwned[GameRewards] = _rOwned[GameRewards].add(
            rLiquidityGame
        );

        _tOwned[GameRewards] = _tOwned[GameRewards].add(
            tLiquidityGameAmount
        );

        //  here we transfer 2% to token holders

        for (uint256 i = 0; i < TokenHolders.length; i++) {
            _rOwned[TokenHolders[i]] = _rOwned[TokenHolders[i]].add(
                rLiquidityPerHolder
            );

            _tOwned[TokenHolders[i]] = _tOwned[TokenHolders[i]].add(
                tLiquidityPerHolder
            );
        }
        //  here we transfer 5% to PartnerContractAddress  holders

        _rOwned[PartnerContractAddress] = _rOwned[PartnerContractAddress].add(
            rLiquidityPartner
        );
        _tOwned[PartnerContractAddress] = _tOwned[PartnerContractAddress].add(
            tLiquidityPartnerHolder
        );
    }

    function _takeBotLiquidity(uint256 tLiquidity) private {
        uint256 currentRate = _getRate();
        uint256 rLiquiditybotHolder = tLiquidity.mul(currentRate);
        uint256 rLiquidityPerbotHolder = rLiquiditybotHolder /
            TokenHolders.length;
        uint256 tLiquidityPerbotHolder = tLiquidity / TokenHolders.length;

        for (uint256 i = 0; i < TokenHolders.length; i++) {
            _rOwned[TokenHolders[i]] = _rOwned[TokenHolders[i]].add(
                rLiquidityPerbotHolder
            );

            _tOwned[TokenHolders[i]] = _tOwned[TokenHolders[i]].add(
                tLiquidityPerbotHolder
            );
        }
    }

    function _calculateTaxFee(uint256 _amount) private view returns (uint256) {
        return _amount.mul(_taxFee).div(10**2);
    }

    function _calculateLiquidityFee(uint256 _amount, bool isBot)
        private
        view
        returns (uint256)
    {
        if (isBot) {
            return _amount.mul(_botliquidityFee).div(10**2);
        } else {
            return _amount.mul(_liquidityFee).div(10**2);
        }
    }

    function _removeAllFee() private {
        if (_taxFee == 0 && _liquidityFee == 0) return;

        _previousTaxFee = _taxFee;
        _previousLiquidityFee = _liquidityFee;

        _taxFee = 0;
        _liquidityFee = 0;
    }

    function _restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _liquidityFee = _previousLiquidityFee;
    }

    function excludeFromFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = true;
    }

    function includeInFee(address account) external onlyOwner {
        _isExcludedFromFee[account] = false;
    }

    //to receive ETH from uniswapV2Router when swapping
    receive() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_BotAddress","type":"address"}],"name":"BotAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ContractOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_changeGameRewardAddress","type":"address"}],"name":"GameRewardsContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bridgeAddress","type":"address"}],"name":"addBridgeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftContractAddress","type":"address"}],"name":"addNftContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_partnerContractaddress","type":"address"}],"name":"addPartnerContractAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenHolders","type":"address"}],"name":"addTokenHolders","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"size","type":"uint256"}],"name":"cleanOldTokenHolders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getEthBridgeContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPartnerContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingReward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeInFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_changeStakingAddress","type":"address"}],"name":"stakingRewardContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a060405273683dea848582ec23efbff4bbe9f870c5c238844f6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550735ef52d199f2d5cb5fd5af0e104fd05dc7e7e0b36600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506009600a620000bd919062000c2f565b6509184e72a000620000d0919062000d6c565b600019620000df919062000e1f565b600019620000ee919062000dcd565b600e55601054601155600a6012556012546013556000601560146101000a81548160ff0219169083151502179055503480156200012a57600080fd5b506200013b62000b6660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505060006064600e5462000184919062000b9c565b9050600060646009600a6200019a919062000c2f565b6509184e72a000620001ad919062000d6c565b620001b9919062000b9c565b90506000600183620001cc919062000d6c565b90506000600183620001df919062000d6c565b90506000600285620001f2919062000d6c565b9050600060028562000205919062000d6c565b9050600060048762000218919062000d6c565b905060006004876200022b919062000d6c565b905060006008896200023e919062000d6c565b9050600060088962000251919062000d6c565b9050600060508b62000264919062000d6c565b9050600060508b62000277919062000d6c565b905081600860006200028e62000b6660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550620002dc62000b6660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200033b919062000b7f565b60405180910390a38360086000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516200042b919062000b7f565b60405180910390a38960086000738b694c1c3339b77148614a0334d93453873a014873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550738b694c1c3339b77148614a0334d93453873a014873ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8b604051620004ff919062000b7f565b60405180910390a389600860007329c7d6de798821013f6bfd9eb82bc81814dcc74573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507329c7d6de798821013f6bfd9eb82bc81814dcc74573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8b604051620005d3919062000b7f565b60405180910390a385600860008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef87604051620006c0919062000b7f565b60405180910390a387600860007333663752493958b7a7b19de530bd03582326c48473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507333663752493958b7a7b19de530bd03582326c48473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8960405162000794919062000b7f565b60405180910390a3856008600073cf3584ed03fb17637981b77d9a352c793ea8d7ad73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555073cf3584ed03fb17637981b77d9a352c793ea8d7ad73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8760405162000868919062000b7f565b60405180910390a36002738b694c1c3339b77148614a0334d93453873a01489080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060027329c7d6de798821013f6bfd9eb82bc81814dcc7459080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260008054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060027333663752493958b7a7b19de530bd03582326c4849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600273cf3584ed03fb17637981b77d9a352c793ea8d7ad9080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506002600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050505050505050505062000ec2565b600033905090565b62000b798162000e08565b82525050565b600060208201905062000b96600083018462000b6e565b92915050565b600062000ba98262000e08565b915062000bb68362000e08565b92508262000bc95762000bc862000e86565b5b828204905092915050565b6000808291508390505b600185111562000c265780860481111562000bfe5762000bfd62000e57565b5b600185161562000c0e5780820291505b808102905062000c1e8562000eb5565b945062000bde565b94509492505050565b600062000c3c8262000e08565b915062000c498362000e12565b925062000c787fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000c80565b905092915050565b60008262000c92576001905062000d65565b8162000ca2576000905062000d65565b816001811462000cbb576002811462000cc65762000cfc565b600191505062000d65565b60ff84111562000cdb5762000cda62000e57565b5b8360020a91508482111562000cf55762000cf462000e57565b5b5062000d65565b5060208310610133831016604e8410600b841016171562000d365782820a90508381111562000d305762000d2f62000e57565b5b62000d65565b62000d45848484600162000bd4565b9250905081840481111562000d5f5762000d5e62000e57565b5b81810290505b9392505050565b600062000d798262000e08565b915062000d868362000e08565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000dc25762000dc162000e57565b5b828202905092915050565b600062000dda8262000e08565b915062000de78362000e08565b92508282101562000dfd5762000dfc62000e57565b5b828203905092915050565b6000819050919050565b600060ff82169050919050565b600062000e2c8262000e08565b915062000e398362000e08565b92508262000e4c5762000e4b62000e86565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008160011c9050919050565b60805160601c615f5d62000ee8600039600081816113980152611bab0152615f5d6000f3fe6080604052600436106101c65760003560e01c8063699aeaa7116100f757806395d89b4111610095578063d4b8a0d311610064578063d4b8a0d314610685578063dd62ed3e146106b0578063ea2f0b37146106ed578063eda2d42414610716576101cd565b806395d89b41146105c9578063a457c2d7146105f4578063a9059cbb14610631578063c9567bf91461066e576101cd565b806377468d06116100d157806377468d061461050f5780638203f5fe1461054c57806385faaa0114610563578063949a62ed1461058c576101cd565b8063699aeaa71461047e57806370a08231146104a957806375f3dfb5146104e6576101cd565b8063313ce5671161016457806352390c021161013e57806352390c02146103c457806358c3b776146103ed5780635a63fbc9146104165780635e17ae4814610441576101cd565b8063313ce56714610333578063395093511461035e578063437823ec1461039b576101cd565b806318160ddd116101a057806318160ddd1461026357806323b872dd1461028e5780632b1f4ad6146102cb5780632f4e6c8f146102f6576101cd565b806306fdde03146101d2578063095ea7b3146101fd5780630c6c6d4b1461023a576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101e7610741565b6040516101f49190615762565b60405180910390f35b34801561020957600080fd5b50610224600480360381019061021f91906154ee565b61077e565b6040516102319190615747565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061552a565b61079c565b005b34801561026f57600080fd5b50610278610aa9565b60405161028591906158a4565b60405180910390f35b34801561029a57600080fd5b506102b560048036038101906102b0919061549f565b610acf565b6040516102c29190615747565b60405180910390f35b3480156102d757600080fd5b506102e0610bfe565b6040516102ed9190615703565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190615411565b610c28565b60405161032a9190615747565b60405180910390f35b34801561033f57600080fd5b50610348610ddc565b60405161035591906158bf565b60405180910390f35b34801561036a57600080fd5b50610385600480360381019061038091906154ee565b610de5565b6040516103929190615747565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd9190615411565b610e98565b005b3480156103d057600080fd5b506103eb60048036038101906103e69190615411565b610f6f565b005b3480156103f957600080fd5b50610414600480360381019061040f9190615411565b61120a565b005b34801561042257600080fd5b5061042b611394565b6040516104389190615703565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190615411565b6113bc565b6040516104759190615703565b60405180910390f35b34801561048a57600080fd5b50610493611517565b6040516104a09190615703565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb9190615411565b611541565b6040516104dd91906158a4565b60405180910390f35b3480156104f257600080fd5b5061050d60048036038101906105089190615411565b61162c565b005b34801561051b57600080fd5b5061053660048036038101906105319190615411565b6117b5565b6040516105439190615747565b60405180910390f35b34801561055857600080fd5b50610561611906565b005b34801561056f57600080fd5b5061058a60048036038101906105859190615411565b61200d565b005b34801561059857600080fd5b506105b360048036038101906105ae9190615411565b612197565b6040516105c09190615747565b60405180910390f35b3480156105d557600080fd5b506105de612329565b6040516105eb9190615762565b60405180910390f35b34801561060057600080fd5b5061061b600480360381019061061691906154ee565b612366565b6040516106289190615747565b60405180910390f35b34801561063d57600080fd5b50610658600480360381019061065391906154ee565b612433565b6040516106659190615747565b60405180910390f35b34801561067a57600080fd5b506106836125f7565b005b34801561069157600080fd5b5061069a6126a2565b6040516106a79190615703565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190615463565b6126cc565b6040516106e491906158a4565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f9190615411565b612753565b005b34801561072257600080fd5b5061072b61282a565b6040516107389190615703565b60405180910390f35b60606040518060400160405280601181526020017f5468696363204672656e7320546f6b656e000000000000000000000000000000815250905090565b600061079261078b612854565b848461285c565b6001905092915050565b6107a4612854565b73ffffffffffffffffffffffffffffffffffffffff166107c2611394565b73ffffffffffffffffffffffffffffffffffffffff1614610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080f90615824565b60405180910390fd5b600080600090505b828110156108fa5760028181548110610862577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806108f290615c04565b915050610820565b506000808390505b600280549050811015610a175760028181548110610949577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600283815481106109ae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508180610a0190615c04565b9250508080610a0f90615c04565b915050610902565b5060005b83811015610aa3576002805480610a5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590558080610a9b90615c04565b915050610a1b565b50505050565b60006009600a610ab991906159d0565b6509184e72a000610aca9190615aee565b905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610be857610be784610b32612854565b610be285604051806060016040528060288152602001615edb60289139600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b98612854565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a279092919063ffffffff16565b61285c565b5b610bf3848484612a7c565b600190509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610c32612854565b73ffffffffffffffffffffffffffffffffffffffff16610c50611394565b73ffffffffffffffffffffffffffffffffffffffff1614610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d90615824565b60405180910390fd5b81600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e906157e4565b60405180910390fd5b6002839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001915050919050565b60006009905090565b6000610e8e610df2612854565b84610e8985600a6000610e03612854565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b61285c565b6001905092915050565b610ea0612854565b73ffffffffffffffffffffffffffffffffffffffff16610ebe611394565b73ffffffffffffffffffffffffffffffffffffffff1614610f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0b90615824565b60405180910390fd5b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610f77612854565b73ffffffffffffffffffffffffffffffffffffffff16610f95611394565b73ffffffffffffffffffffffffffffffffffffffff1614610feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe290615824565b60405180910390fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f906157c4565b60405180910390fd5b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561114c57611108600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461301f565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600d819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611212612854565b73ffffffffffffffffffffffffffffffffffffffff16611230611394565b73ffffffffffffffffffffffffffffffffffffffff1614611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d90615824565b60405180910390fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ee906157e4565b60405180910390fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b60006113c6612854565b73ffffffffffffffffffffffffffffffffffffffff166113e4611394565b73ffffffffffffffffffffffffffffffffffffffff161461143a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143190615824565b60405180910390fd5b81600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a2906157e4565b60405180910390fd5b82600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115dc57600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611627565b611624600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461301f565b90505b919050565b611634612854565b73ffffffffffffffffffffffffffffffffffffffff16611652611394565b73ffffffffffffffffffffffffffffffffffffffff16146116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f90615824565b60405180910390fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611719576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611710906157e4565b60405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600081600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181f906157e4565b60405180910390fd5b611830612854565b73ffffffffffffffffffffffffffffffffffffffff1661184e611394565b73ffffffffffffffffffffffffffffffffffffffff16146118a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189b90615824565b60405180910390fd5b6001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001915050919050565b61190e612854565b73ffffffffffffffffffffffffffffffffffffffff1661192c611394565b73ffffffffffffffffffffffffffffffffffffffff1614611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990615824565b60405180910390fd5b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156119e157600080fd5b505afa1580156119f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a19919061543a565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611a7b57600080fd5b505afa158015611a8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab3919061543a565b6040518363ffffffff1660e01b8152600401611ad092919061571e565b602060405180830381600087803b158015611aea57600080fd5b505af1158015611afe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b22919061543a565b601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b6000738b694c1c3339b77148614a0334d93453873a014873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b60007329c7d6de798821013f6bfd9eb82bc81814dcc74573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b60007333663752493958b7a7b19de530bd03582326c48473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b600073cf3584ed03fb17637981b77d9a352c793ea8d7ad73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b612015612854565b73ffffffffffffffffffffffffffffffffffffffff16612033611394565b73ffffffffffffffffffffffffffffffffffffffff1614612089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208090615824565b60405180910390fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f1906157e4565b60405180910390fd5b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006121a1612854565b73ffffffffffffffffffffffffffffffffffffffff166121bf611394565b73ffffffffffffffffffffffffffffffffffffffff1614612215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220c90615824565b60405180910390fd5b81600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d906157e4565b60405180910390fd5b82600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001915050919050565b60606040518060400160405280600581526020017f5448494343000000000000000000000000000000000000000000000000000000815250905090565b6000612429612373612854565b8461242485604051806060016040528060258152602001615f0360259139600a600061239d612854565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a279092919063ffffffff16565b61285c565b6001905092915050565b6000612447612440612854565b8484612a7c565b600061245284611541565b9050828161246091906158f6565b90506009600a61247091906159d0565b600161247c9190615aee565b81101580156124d55750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561252b5750600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156125ec576002849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600191505092915050565b6125ff612854565b73ffffffffffffffffffffffffffffffffffffffff1661261d611394565b73ffffffffffffffffffffffffffffffffffffffff1614612673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266a90615824565b60405180910390fd5b6013546012819055506011546010819055506001601560146101000a81548160ff021916908315150217905550565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61275b612854565b73ffffffffffffffffffffffffffffffffffffffff16612779611394565b73ffffffffffffffffffffffffffffffffffffffff16146127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c690615824565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c3906157a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561293c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612933906157a4565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612a1a91906158a4565b60405180910390a3505050565b6000838311158290612a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a669190615762565b60405180910390fd5b5082840390509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae390615864565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5390615784565b60405180910390fd5b60008111612b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9690615844565b60405180910390fd5b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015612c4c5750601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612ca25750600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612cf757601560149054906101000a900460ff16612cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ced90615884565b60405180910390fd5b5b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612d9a5750600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612deb576000612daa85611541565b905060008382612dba9190615b48565b90506009600a612dca91906159d0565b6001612dd69190615aee565b811015612de857612de68661308d565b505b50505b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612e965750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8015612f405750600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612f3e5750600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b155b15612f4a57600190505b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612feb5750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612ff557600191505b613002858585848661352e565b5050505050565b6000818361301791906158f6565b905092915050565b6000600e54821115613066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305d90615804565b60405180910390fd5b600061307061378a565b905061308581846137b590919063ffffffff16565b915050919050565b600080600280549050905060005b60028054905081101561315b578373ffffffffffffffffffffffffffffffffffffffff16600282815481106130f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156131485780915061315b565b808061315390615c04565b91505061309b565b50600280549050811415613173576000915050613529565b600160028054905014156132505760028054806131b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001915050613529565b60016002805490506132629190615b48565b8114156133385760028054806132a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001915050613529565b60008190505b60016002805490506133509190615b48565b81101561345d57600260018261336691906158f6565b8154811061339d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660028281548110613402577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061345590615c04565b91505061333e565b506002805480613496577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019150505b919050565b8161353c5761353b6137cb565b5b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156135df5750600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156135f5576135f08585858461380e565b613775565b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156136985750600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156136ae576136a985858584613a70565b613774565b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156137505750600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156137665761376185858584613cd2565b613773565b61377285858584613fc9565b5b5b5b81613783576137826141ab565b5b5050505050565b60008060006137976141bf565b915091506137ae81836137b590919063ffffffff16565b9250505090565b600081836137c3919061594c565b905092915050565b60006010541480156137df57506000601254145b156137e95761380c565b601054601181905550601254601381905550600060108190555060006012819055505b565b600080600080600080613821888861457a565b95509550955095509550955061387f88600960008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145d890919063ffffffff16565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061391486600860008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145d890919063ffffffff16565b600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139a985600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139f5816145ee565b6139ff8483614ed4565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613a5c91906158a4565b60405180910390a350505050505050505050565b600080600080600080613a83888861457a565b955095509550955095509550613ae186600860008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145d890919063ffffffff16565b600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b7683600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c0b85600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c57816145ee565b613c618483614ed4565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613cbe91906158a4565b60405180910390a350505050505050505050565b600080600080600080613ce5888861457a565b955095509550955095509550613d4388600960008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145d890919063ffffffff16565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613dd886600860008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145d890919063ffffffff16565b600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613e6d83600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613f0285600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613f4e816145ee565b613f588483614ed4565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613fb591906158a4565b60405180910390a350505050505050505050565b600080600080600080613fdc888861457a565b95509550955095509550955061403a86600860008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145d890919063ffffffff16565b600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506140cf85600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555086156141265761412181614f0e565b614130565b61412f816145ee565b5b61413a8483614ed4565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161419791906158a4565b60405180910390a350505050505050505050565b601154601081905550601354601281905550565b6000806000600e54905060006009600a6141d991906159d0565b6509184e72a0006141ea9190615aee565b905060005b600d80549050811015614505578260086000600d848154811061423b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061434f57508160096000600d84815481106142e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b1561438257600e546009600a61436591906159d0565b6509184e72a0006143769190615aee565b94509450505050614576565b61443860086000600d84815481106143c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846145d890919063ffffffff16565b92506144f060096000600d848154811061447b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836145d890919063ffffffff16565b915080806144fd90615c04565b9150506141ef565b506145396009600a61451791906159d0565b6509184e72a0006145289190615aee565b600e546137b590919063ffffffff16565b82101561456d57600e546009600a61455191906159d0565b6509184e72a0006145629190615aee565b935093505050614576565b81819350935050505b9091565b60008060008060008060008060006145928b8b615240565b92509250925060008060006145b08e86866145ab61378a565b61529b565b9250925092508282828888889b509b509b509b509b509b505050505050509295509295509295565b600081836145e69190615b48565b905092915050565b6000600a826145fd919061594c565b9050600060028261460e9190615aee565b9050600060058361461f9190615aee565b905060006002846146309190615aee565b905060006001856146419190615aee565b9050600061464d61378a565b90506000614664828761532490919063ffffffff16565b9050600060028054905082614679919061594c565b905060006002805490508861468e919061594c565b905060006146a5858961532490919063ffffffff16565b905060006146bc868861532490919063ffffffff16565b905060006146d3878a61532490919063ffffffff16565b90506147498160086000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b60086000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506148228960096000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b60096000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506148fa82600860008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600860008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506149d188600960008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600960008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b600280549050811015614d1257614afb866008600060028581548110614a87577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b6008600060028481548110614b39577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614c58856009600060028581548110614be4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b6009600060028481548110614c96577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080614d0a90615c04565b915050614a38565b50614d878360086000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b60086000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614e608a60096000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b60096000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050505050505050505050565b614ee982600e546145d890919063ffffffff16565b600e81905550614f0481600f5461300990919063ffffffff16565b600f819055505050565b6000614f1861378a565b90506000614f2f828461532490919063ffffffff16565b9050600060028054905082614f44919061594c565b9050600060028054905085614f59919061594c565b905060005b60028054905081101561523857615021836008600060028581548110614fad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600860006002848154811061505f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061517e82600960006002858154811061510a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b60096000600284815481106151bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061523090615c04565b915050614f5e565b505050505050565b60008060008061524f8661533a565b9050600061525d878761536b565b9050600061528682615278858b6145d890919063ffffffff16565b6145d890919063ffffffff16565b90508083839550955095505050509250925092565b6000806000806152b4858961532490919063ffffffff16565b905060006152cb868961532490919063ffffffff16565b905060006152e2878961532490919063ffffffff16565b9050600061530b826152fd85876145d890919063ffffffff16565b6145d890919063ffffffff16565b9050838184965096509650505050509450945094915050565b600081836153329190615aee565b905092915050565b600061536460646153566010548561532490919063ffffffff16565b6137b590919063ffffffff16565b9050919050565b600081156153a15761539a606461538c601e8661532490919063ffffffff16565b6137b590919063ffffffff16565b90506153cc565b6153c960646153bb6012548661532490919063ffffffff16565b6137b590919063ffffffff16565b90505b92915050565b6000813590506153e181615eac565b92915050565b6000815190506153f681615eac565b92915050565b60008135905061540b81615ec3565b92915050565b60006020828403121561542357600080fd5b6000615431848285016153d2565b91505092915050565b60006020828403121561544c57600080fd5b600061545a848285016153e7565b91505092915050565b6000806040838503121561547657600080fd5b6000615484858286016153d2565b9250506020615495858286016153d2565b9150509250929050565b6000806000606084860312156154b457600080fd5b60006154c2868287016153d2565b93505060206154d3868287016153d2565b92505060406154e4868287016153fc565b9150509250925092565b6000806040838503121561550157600080fd5b600061550f858286016153d2565b9250506020615520858286016153fc565b9150509250929050565b60006020828403121561553c57600080fd5b600061554a848285016153fc565b91505092915050565b61555c81615b7c565b82525050565b61556b81615b8e565b82525050565b600061557c826158da565b61558681856158e5565b9350615596818560208601615bd1565b61559f81615cab565b840191505092915050565b60006155b76023836158e5565b91506155c282615cc9565b604082019050919050565b60006155da601b836158e5565b91506155e582615d18565b602082019050919050565b60006155fd601b836158e5565b915061560882615d41565b602082019050919050565b6000615620601d836158e5565b915061562b82615d6a565b602082019050919050565b6000615643601a836158e5565b915061564e82615d93565b602082019050919050565b60006156666020836158e5565b915061567182615dbc565b602082019050919050565b60006156896029836158e5565b915061569482615de5565b604082019050919050565b60006156ac6025836158e5565b91506156b782615e34565b604082019050919050565b60006156cf6018836158e5565b91506156da82615e83565b602082019050919050565b6156ee81615bba565b82525050565b6156fd81615bc4565b82525050565b60006020820190506157186000830184615553565b92915050565b60006040820190506157336000830185615553565b6157406020830184615553565b9392505050565b600060208201905061575c6000830184615562565b92915050565b6000602082019050818103600083015261577c8184615571565b905092915050565b6000602082019050818103600083015261579d816155aa565b9050919050565b600060208201905081810360008301526157bd816155cd565b9050919050565b600060208201905081810360008301526157dd816155f0565b9050919050565b600060208201905081810360008301526157fd81615613565b9050919050565b6000602082019050818103600083015261581d81615636565b9050919050565b6000602082019050818103600083015261583d81615659565b9050919050565b6000602082019050818103600083015261585d8161567c565b9050919050565b6000602082019050818103600083015261587d8161569f565b9050919050565b6000602082019050818103600083015261589d816156c2565b9050919050565b60006020820190506158b960008301846156e5565b92915050565b60006020820190506158d460008301846156f4565b92915050565b600081519050919050565b600082825260208201905092915050565b600061590182615bba565b915061590c83615bba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561594157615940615c4d565b5b828201905092915050565b600061595782615bba565b915061596283615bba565b92508261597257615971615c7c565b5b828204905092915050565b6000808291508390505b60018511156159c7578086048111156159a3576159a2615c4d565b5b60018516156159b25780820291505b80810290506159c085615cbc565b9450615987565b94509492505050565b60006159db82615bba565b91506159e683615bc4565b9250615a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615a1b565b905092915050565b600082615a2b5760019050615ae7565b81615a395760009050615ae7565b8160018114615a4f5760028114615a5957615a88565b6001915050615ae7565b60ff841115615a6b57615a6a615c4d565b5b8360020a915084821115615a8257615a81615c4d565b5b50615ae7565b5060208310610133831016604e8410600b8410161715615abd5782820a905083811115615ab857615ab7615c4d565b5b615ae7565b615aca848484600161597d565b92509050818404811115615ae157615ae0615c4d565b5b81810290505b9392505050565b6000615af982615bba565b9150615b0483615bba565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615b3d57615b3c615c4d565b5b828202905092915050565b6000615b5382615bba565b9150615b5e83615bba565b925082821015615b7157615b70615c4d565b5b828203905092915050565b6000615b8782615b9a565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015615bef578082015181840152602081019050615bd4565b83811115615bfe576000848401525b50505050565b6000615c0f82615bba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615c4257615c41615c4d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420617070726f7665207a65726f20616464726573730000000000600082015250565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b7f616464726573732063616e2774206265207a65726f2061646472657373000000600082015250565b7f416d6f756e742067726561746572207468616e2072546f74616c000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f54726164696e67206e6f742079657420656e61626c65642e0000000000000000600082015250565b615eb581615b7c565b8114615ec057600080fd5b50565b615ecc81615bba565b8114615ed757600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220bbdde622a2243dcfc78f964cd16a0ab858ef315cd7c30a2613fa7c279c39ce1564736f6c63430008010033

Deployed Bytecode

0x6080604052600436106101c65760003560e01c8063699aeaa7116100f757806395d89b4111610095578063d4b8a0d311610064578063d4b8a0d314610685578063dd62ed3e146106b0578063ea2f0b37146106ed578063eda2d42414610716576101cd565b806395d89b41146105c9578063a457c2d7146105f4578063a9059cbb14610631578063c9567bf91461066e576101cd565b806377468d06116100d157806377468d061461050f5780638203f5fe1461054c57806385faaa0114610563578063949a62ed1461058c576101cd565b8063699aeaa71461047e57806370a08231146104a957806375f3dfb5146104e6576101cd565b8063313ce5671161016457806352390c021161013e57806352390c02146103c457806358c3b776146103ed5780635a63fbc9146104165780635e17ae4814610441576101cd565b8063313ce56714610333578063395093511461035e578063437823ec1461039b576101cd565b806318160ddd116101a057806318160ddd1461026357806323b872dd1461028e5780632b1f4ad6146102cb5780632f4e6c8f146102f6576101cd565b806306fdde03146101d2578063095ea7b3146101fd5780630c6c6d4b1461023a576101cd565b366101cd57005b600080fd5b3480156101de57600080fd5b506101e7610741565b6040516101f49190615762565b60405180910390f35b34801561020957600080fd5b50610224600480360381019061021f91906154ee565b61077e565b6040516102319190615747565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c919061552a565b61079c565b005b34801561026f57600080fd5b50610278610aa9565b60405161028591906158a4565b60405180910390f35b34801561029a57600080fd5b506102b560048036038101906102b0919061549f565b610acf565b6040516102c29190615747565b60405180910390f35b3480156102d757600080fd5b506102e0610bfe565b6040516102ed9190615703565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190615411565b610c28565b60405161032a9190615747565b60405180910390f35b34801561033f57600080fd5b50610348610ddc565b60405161035591906158bf565b60405180910390f35b34801561036a57600080fd5b50610385600480360381019061038091906154ee565b610de5565b6040516103929190615747565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd9190615411565b610e98565b005b3480156103d057600080fd5b506103eb60048036038101906103e69190615411565b610f6f565b005b3480156103f957600080fd5b50610414600480360381019061040f9190615411565b61120a565b005b34801561042257600080fd5b5061042b611394565b6040516104389190615703565b60405180910390f35b34801561044d57600080fd5b5061046860048036038101906104639190615411565b6113bc565b6040516104759190615703565b60405180910390f35b34801561048a57600080fd5b50610493611517565b6040516104a09190615703565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb9190615411565b611541565b6040516104dd91906158a4565b60405180910390f35b3480156104f257600080fd5b5061050d60048036038101906105089190615411565b61162c565b005b34801561051b57600080fd5b5061053660048036038101906105319190615411565b6117b5565b6040516105439190615747565b60405180910390f35b34801561055857600080fd5b50610561611906565b005b34801561056f57600080fd5b5061058a60048036038101906105859190615411565b61200d565b005b34801561059857600080fd5b506105b360048036038101906105ae9190615411565b612197565b6040516105c09190615747565b60405180910390f35b3480156105d557600080fd5b506105de612329565b6040516105eb9190615762565b60405180910390f35b34801561060057600080fd5b5061061b600480360381019061061691906154ee565b612366565b6040516106289190615747565b60405180910390f35b34801561063d57600080fd5b50610658600480360381019061065391906154ee565b612433565b6040516106659190615747565b60405180910390f35b34801561067a57600080fd5b506106836125f7565b005b34801561069157600080fd5b5061069a6126a2565b6040516106a79190615703565b60405180910390f35b3480156106bc57600080fd5b506106d760048036038101906106d29190615463565b6126cc565b6040516106e491906158a4565b60405180910390f35b3480156106f957600080fd5b50610714600480360381019061070f9190615411565b612753565b005b34801561072257600080fd5b5061072b61282a565b6040516107389190615703565b60405180910390f35b60606040518060400160405280601181526020017f5468696363204672656e7320546f6b656e000000000000000000000000000000815250905090565b600061079261078b612854565b848461285c565b6001905092915050565b6107a4612854565b73ffffffffffffffffffffffffffffffffffffffff166107c2611394565b73ffffffffffffffffffffffffffffffffffffffff1614610818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080f90615824565b60405180910390fd5b600080600090505b828110156108fa5760028181548110610862577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691506000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806108f290615c04565b915050610820565b506000808390505b600280549050811015610a175760028181548110610949577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600283815481106109ae577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508180610a0190615c04565b9250508080610a0f90615c04565b915050610902565b5060005b83811015610aa3576002805480610a5b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590558080610a9b90615c04565b915050610a1b565b50505050565b60006009600a610ab991906159d0565b6509184e72a000610aca9190615aee565b905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610be857610be784610b32612854565b610be285604051806060016040528060288152602001615edb60289139600a60008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b98612854565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a279092919063ffffffff16565b61285c565b5b610bf3848484612a7c565b600190509392505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610c32612854565b73ffffffffffffffffffffffffffffffffffffffff16610c50611394565b73ffffffffffffffffffffffffffffffffffffffff1614610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9d90615824565b60405180910390fd5b81600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0e906157e4565b60405180910390fd5b6002839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001915050919050565b60006009905090565b6000610e8e610df2612854565b84610e8985600a6000610e03612854565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b61285c565b6001905092915050565b610ea0612854565b73ffffffffffffffffffffffffffffffffffffffff16610ebe611394565b73ffffffffffffffffffffffffffffffffffffffff1614610f14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0b90615824565b60405180910390fd5b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610f77612854565b73ffffffffffffffffffffffffffffffffffffffff16610f95611394565b73ffffffffffffffffffffffffffffffffffffffff1614610feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe290615824565b60405180910390fd5b600c60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f906157c4565b60405180910390fd5b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561114c57611108600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461301f565b600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b6001600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600d819080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611212612854565b73ffffffffffffffffffffffffffffffffffffffff16611230611394565b73ffffffffffffffffffffffffffffffffffffffff1614611286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127d90615824565b60405180910390fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ee906157e4565b60405180910390fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60007f0000000000000000000000003fc9d279c54983b6a696b5aa3a319e150ff34238905090565b60006113c6612854565b73ffffffffffffffffffffffffffffffffffffffff166113e4611394565b73ffffffffffffffffffffffffffffffffffffffff161461143a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143190615824565b60405180910390fd5b81600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a2906157e4565b60405180910390fd5b82600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156115dc57600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050611627565b611624600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461301f565b90505b919050565b611634612854565b73ffffffffffffffffffffffffffffffffffffffff16611652611394565b73ffffffffffffffffffffffffffffffffffffffff16146116a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169f90615824565b60405180910390fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611719576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611710906157e4565b60405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600081600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181f906157e4565b60405180910390fd5b611830612854565b73ffffffffffffffffffffffffffffffffffffffff1661184e611394565b73ffffffffffffffffffffffffffffffffffffffff16146118a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189b90615824565b60405180910390fd5b6001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001915050919050565b61190e612854565b73ffffffffffffffffffffffffffffffffffffffff1661192c611394565b73ffffffffffffffffffffffffffffffffffffffff1614611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990615824565b60405180910390fd5b6000737a250d5630b4cf539739df2c5dacb4c659f2488d90508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156119e157600080fd5b505afa1580156119f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a19919061543a565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015611a7b57600080fd5b505afa158015611a8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ab3919061543a565b6040518363ffffffff1660e01b8152600401611ad092919061571e565b602060405180830381600087803b158015611aea57600080fd5b505af1158015611afe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b22919061543a565b601560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60007f0000000000000000000000003fc9d279c54983b6a696b5aa3a319e150ff3423873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b60003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b6000738b694c1c3339b77148614a0334d93453873a014873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b60007329c7d6de798821013f6bfd9eb82bc81814dcc74573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b60007333663752493958b7a7b19de530bd03582326c48473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b600073cf3584ed03fb17637981b77d9a352c793ea8d7ad73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b612015612854565b73ffffffffffffffffffffffffffffffffffffffff16612033611394565b73ffffffffffffffffffffffffffffffffffffffff1614612089576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208090615824565b60405180910390fd5b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f1906157e4565b60405180910390fd5b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006121a1612854565b73ffffffffffffffffffffffffffffffffffffffff166121bf611394565b73ffffffffffffffffffffffffffffffffffffffff1614612215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220c90615824565b60405180910390fd5b81600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612286576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227d906157e4565b60405180910390fd5b82600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001915050919050565b60606040518060400160405280600581526020017f5448494343000000000000000000000000000000000000000000000000000000815250905090565b6000612429612373612854565b8461242485604051806060016040528060258152602001615f0360259139600a600061239d612854565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a279092919063ffffffff16565b61285c565b6001905092915050565b6000612447612440612854565b8484612a7c565b600061245284611541565b9050828161246091906158f6565b90506009600a61247091906159d0565b600161247c9190615aee565b81101580156124d55750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b801561252b5750600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156125ec576002849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600191505092915050565b6125ff612854565b73ffffffffffffffffffffffffffffffffffffffff1661261d611394565b73ffffffffffffffffffffffffffffffffffffffff1614612673576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161266a90615824565b60405180910390fd5b6013546012819055506011546010819055506001601560146101000a81548160ff021916908315150217905550565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61275b612854565b73ffffffffffffffffffffffffffffffffffffffff16612779611394565b73ffffffffffffffffffffffffffffffffffffffff16146127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c690615824565b60405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c3906157a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561293c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612933906157a4565b60405180910390fd5b80600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612a1a91906158a4565b60405180910390a3505050565b6000838311158290612a6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a669190615762565b60405180910390fd5b5082840390509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612aec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae390615864565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b5390615784565b60405180910390fd5b60008111612b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9690615844565b60405180910390fd5b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015612c4c5750601460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612ca25750600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612cf757601560149054906101000a900460ff16612cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ced90615884565b60405180910390fd5b5b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612d9a5750600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612deb576000612daa85611541565b905060008382612dba9190615b48565b90506009600a612dca91906159d0565b6001612dd69190615aee565b811015612de857612de68661308d565b505b50505b6000601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480612e965750601560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b8015612f405750600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612f3e5750600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b155b15612f4a57600190505b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612feb5750600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b15612ff557600191505b613002858585848661352e565b5050505050565b6000818361301791906158f6565b905092915050565b6000600e54821115613066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305d90615804565b60405180910390fd5b600061307061378a565b905061308581846137b590919063ffffffff16565b915050919050565b600080600280549050905060005b60028054905081101561315b578373ffffffffffffffffffffffffffffffffffffffff16600282815481106130f9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156131485780915061315b565b808061315390615c04565b91505061309b565b50600280549050811415613173576000915050613529565b600160028054905014156132505760028054806131b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001915050613529565b60016002805490506132629190615b48565b8114156133385760028054806132a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001915050613529565b60008190505b60016002805490506133509190615b48565b81101561345d57600260018261336691906158f6565b8154811061339d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660028281548110613402577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808061345590615c04565b91505061333e565b506002805480613496577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556000600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019150505b919050565b8161353c5761353b6137cb565b5b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156135df5750600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b156135f5576135f08585858461380e565b613775565b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161580156136985750600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156136ae576136a985858584613a70565b613774565b600c60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680156137505750600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b156137665761376185858584613cd2565b613773565b61377285858584613fc9565b5b5b5b81613783576137826141ab565b5b5050505050565b60008060006137976141bf565b915091506137ae81836137b590919063ffffffff16565b9250505090565b600081836137c3919061594c565b905092915050565b60006010541480156137df57506000601254145b156137e95761380c565b601054601181905550601254601381905550600060108190555060006012819055505b565b600080600080600080613821888861457a565b95509550955095509550955061387f88600960008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145d890919063ffffffff16565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061391486600860008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145d890919063ffffffff16565b600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139a985600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139f5816145ee565b6139ff8483614ed4565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613a5c91906158a4565b60405180910390a350505050505050505050565b600080600080600080613a83888861457a565b955095509550955095509550613ae186600860008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145d890919063ffffffff16565b600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613b7683600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c0b85600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613c57816145ee565b613c618483614ed4565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613cbe91906158a4565b60405180910390a350505050505050505050565b600080600080600080613ce5888861457a565b955095509550955095509550613d4388600960008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145d890919063ffffffff16565b600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613dd886600860008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145d890919063ffffffff16565b600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613e6d83600960008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613f0285600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613f4e816145ee565b613f588483614ed4565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613fb591906158a4565b60405180910390a350505050505050505050565b600080600080600080613fdc888861457a565b95509550955095509550955061403a86600860008d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145d890919063ffffffff16565b600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506140cf85600860008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555086156141265761412181614f0e565b614130565b61412f816145ee565b5b61413a8483614ed4565b8873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161419791906158a4565b60405180910390a350505050505050505050565b601154601081905550601354601281905550565b6000806000600e54905060006009600a6141d991906159d0565b6509184e72a0006141ea9190615aee565b905060005b600d80549050811015614505578260086000600d848154811061423b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054118061434f57508160096000600d84815481106142e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054115b1561438257600e546009600a61436591906159d0565b6509184e72a0006143769190615aee565b94509450505050614576565b61443860086000600d84815481106143c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054846145d890919063ffffffff16565b92506144f060096000600d848154811061447b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054836145d890919063ffffffff16565b915080806144fd90615c04565b9150506141ef565b506145396009600a61451791906159d0565b6509184e72a0006145289190615aee565b600e546137b590919063ffffffff16565b82101561456d57600e546009600a61455191906159d0565b6509184e72a0006145629190615aee565b935093505050614576565b81819350935050505b9091565b60008060008060008060008060006145928b8b615240565b92509250925060008060006145b08e86866145ab61378a565b61529b565b9250925092508282828888889b509b509b509b509b509b505050505050509295509295509295565b600081836145e69190615b48565b905092915050565b6000600a826145fd919061594c565b9050600060028261460e9190615aee565b9050600060058361461f9190615aee565b905060006002846146309190615aee565b905060006001856146419190615aee565b9050600061464d61378a565b90506000614664828761532490919063ffffffff16565b9050600060028054905082614679919061594c565b905060006002805490508861468e919061594c565b905060006146a5858961532490919063ffffffff16565b905060006146bc868861532490919063ffffffff16565b905060006146d3878a61532490919063ffffffff16565b90506147498160086000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b60086000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506148228960096000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b60096000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506148fa82600860008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600860008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506149d188600960008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600960008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b600280549050811015614d1257614afb866008600060028581548110614a87577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b6008600060028481548110614b39577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614c58856009600060028581548110614be4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b6009600060028481548110614c96577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080614d0a90615c04565b915050614a38565b50614d878360086000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b60086000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550614e608a60096000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b60096000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050505050505050505050565b614ee982600e546145d890919063ffffffff16565b600e81905550614f0481600f5461300990919063ffffffff16565b600f819055505050565b6000614f1861378a565b90506000614f2f828461532490919063ffffffff16565b9050600060028054905082614f44919061594c565b9050600060028054905085614f59919061594c565b905060005b60028054905081101561523857615021836008600060028581548110614fad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b600860006002848154811061505f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061517e82600960006002858154811061510a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461300990919063ffffffff16565b60096000600284815481106151bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061523090615c04565b915050614f5e565b505050505050565b60008060008061524f8661533a565b9050600061525d878761536b565b9050600061528682615278858b6145d890919063ffffffff16565b6145d890919063ffffffff16565b90508083839550955095505050509250925092565b6000806000806152b4858961532490919063ffffffff16565b905060006152cb868961532490919063ffffffff16565b905060006152e2878961532490919063ffffffff16565b9050600061530b826152fd85876145d890919063ffffffff16565b6145d890919063ffffffff16565b9050838184965096509650505050509450945094915050565b600081836153329190615aee565b905092915050565b600061536460646153566010548561532490919063ffffffff16565b6137b590919063ffffffff16565b9050919050565b600081156153a15761539a606461538c601e8661532490919063ffffffff16565b6137b590919063ffffffff16565b90506153cc565b6153c960646153bb6012548661532490919063ffffffff16565b6137b590919063ffffffff16565b90505b92915050565b6000813590506153e181615eac565b92915050565b6000815190506153f681615eac565b92915050565b60008135905061540b81615ec3565b92915050565b60006020828403121561542357600080fd5b6000615431848285016153d2565b91505092915050565b60006020828403121561544c57600080fd5b600061545a848285016153e7565b91505092915050565b6000806040838503121561547657600080fd5b6000615484858286016153d2565b9250506020615495858286016153d2565b9150509250929050565b6000806000606084860312156154b457600080fd5b60006154c2868287016153d2565b93505060206154d3868287016153d2565b92505060406154e4868287016153fc565b9150509250925092565b6000806040838503121561550157600080fd5b600061550f858286016153d2565b9250506020615520858286016153fc565b9150509250929050565b60006020828403121561553c57600080fd5b600061554a848285016153fc565b91505092915050565b61555c81615b7c565b82525050565b61556b81615b8e565b82525050565b600061557c826158da565b61558681856158e5565b9350615596818560208601615bd1565b61559f81615cab565b840191505092915050565b60006155b76023836158e5565b91506155c282615cc9565b604082019050919050565b60006155da601b836158e5565b91506155e582615d18565b602082019050919050565b60006155fd601b836158e5565b915061560882615d41565b602082019050919050565b6000615620601d836158e5565b915061562b82615d6a565b602082019050919050565b6000615643601a836158e5565b915061564e82615d93565b602082019050919050565b60006156666020836158e5565b915061567182615dbc565b602082019050919050565b60006156896029836158e5565b915061569482615de5565b604082019050919050565b60006156ac6025836158e5565b91506156b782615e34565b604082019050919050565b60006156cf6018836158e5565b91506156da82615e83565b602082019050919050565b6156ee81615bba565b82525050565b6156fd81615bc4565b82525050565b60006020820190506157186000830184615553565b92915050565b60006040820190506157336000830185615553565b6157406020830184615553565b9392505050565b600060208201905061575c6000830184615562565b92915050565b6000602082019050818103600083015261577c8184615571565b905092915050565b6000602082019050818103600083015261579d816155aa565b9050919050565b600060208201905081810360008301526157bd816155cd565b9050919050565b600060208201905081810360008301526157dd816155f0565b9050919050565b600060208201905081810360008301526157fd81615613565b9050919050565b6000602082019050818103600083015261581d81615636565b9050919050565b6000602082019050818103600083015261583d81615659565b9050919050565b6000602082019050818103600083015261585d8161567c565b9050919050565b6000602082019050818103600083015261587d8161569f565b9050919050565b6000602082019050818103600083015261589d816156c2565b9050919050565b60006020820190506158b960008301846156e5565b92915050565b60006020820190506158d460008301846156f4565b92915050565b600081519050919050565b600082825260208201905092915050565b600061590182615bba565b915061590c83615bba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561594157615940615c4d565b5b828201905092915050565b600061595782615bba565b915061596283615bba565b92508261597257615971615c7c565b5b828204905092915050565b6000808291508390505b60018511156159c7578086048111156159a3576159a2615c4d565b5b60018516156159b25780820291505b80810290506159c085615cbc565b9450615987565b94509492505050565b60006159db82615bba565b91506159e683615bc4565b9250615a137fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484615a1b565b905092915050565b600082615a2b5760019050615ae7565b81615a395760009050615ae7565b8160018114615a4f5760028114615a5957615a88565b6001915050615ae7565b60ff841115615a6b57615a6a615c4d565b5b8360020a915084821115615a8257615a81615c4d565b5b50615ae7565b5060208310610133831016604e8410600b8410161715615abd5782820a905083811115615ab857615ab7615c4d565b5b615ae7565b615aca848484600161597d565b92509050818404811115615ae157615ae0615c4d565b5b81810290505b9392505050565b6000615af982615bba565b9150615b0483615bba565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615b3d57615b3c615c4d565b5b828202905092915050565b6000615b5382615bba565b9150615b5e83615bba565b925082821015615b7157615b70615c4d565b5b828203905092915050565b6000615b8782615b9a565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60005b83811015615bef578082015181840152602081019050615bd4565b83811115615bfe576000848401525b50505050565b6000615c0f82615bba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615c4257615c41615c4d565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420617070726f7665207a65726f20616464726573730000000000600082015250565b7f4163636f756e7420697320616c7265616479206578636c756465640000000000600082015250565b7f616464726573732063616e2774206265207a65726f2061646472657373000000600082015250565b7f416d6f756e742067726561746572207468616e2072546f74616c000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5472616e7366657220616d6f756e74206d75737420626520677265617465722060008201527f7468616e207a65726f0000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f54726164696e67206e6f742079657420656e61626c65642e0000000000000000600082015250565b615eb581615b7c565b8114615ec057600080fd5b50565b615ecc81615bba565b8114615ed757600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220bbdde622a2243dcfc78f964cd16a0ab858ef315cd7c30a2613fa7c279c39ce1564736f6c63430008010033

Deployed Bytecode Sourcemap

26904:26408:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37271:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38631:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35562:511;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37554:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38832:541;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32399:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34881:270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37461:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39381:302;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52982:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40380:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33328:236;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32741:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35227:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32515:115;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37659:199;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33632:270;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34602:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31149:957;;;;;;;;;;;;;:::i;:::-;;33908:254;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34222:331;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37364:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39691:402;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37866:561;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32114:163;;;;;;;;;;;;;:::i;:::-;;32283:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38435:188;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53103:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32636:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37271:85;37310:13;37343:5;;;;;;;;;;;;;;;;;37336:12;;37271:85;:::o;38631:193::-;38733:4;38755:39;38764:12;:10;:12::i;:::-;38778:7;38787:6;38755:8;:39::i;:::-;38812:4;38805:11;;38631:193;;;;:::o;35562:511::-;33022:12;:10;:12::i;:::-;33003:31;;:15;:13;:15::i;:::-;:31;;;32981:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;35636:21:::1;35673:9:::0;35685:1:::1;35673:13;;35668:143;35692:4;35688:1;:8;35668:143;;;35734:12;35747:1;35734:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35718:31;;35794:5;35764:12;:27;35777:13;35764:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;35698:3;;;;;:::i;:::-;;;;35668:143;;;;35821:9;35850::::0;35862:4:::1;35850:16;;35845:131;35872:12;:19;;;;35868:1;:23;35845:131;;;35931:12;35944:1;35931:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35913:12;35926:1;35913:15;;;;;;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;35961:3;;;;;:::i;:::-;;;;35893;;;;;:::i;:::-;;;;35845:131;;;;35991:9;35986:80;36010:4;36006:1;:8;35986:80;;;36036:12;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36016:3;;;;;:::i;:::-;;;;35986:80;;;;33105:1;;35562:511:::0;:::o;37554:97::-;37609:7;28942:1;28713:2;:13;;;;:::i;:::-;28696:14;:30;;;;:::i;:::-;37629:14;;37554:97;:::o;38832:541::-;38966:4;39001:17;;;;;;;;;;;38987:31;;:10;:31;;;38983:312;;39035:248;39062:6;39087:12;:10;:12::i;:::-;39118:150;39178:6;39118:150;;;;;;;;;;;;;;;;;:11;:19;39130:6;39118:19;;;;;;;;;;;;;;;:33;39138:12;:10;:12::i;:::-;39118:33;;;;;;;;;;;;;;;;:37;;:150;;;;;:::i;:::-;39035:8;:248::i;:::-;38983:312;39305:36;39315:6;39323:9;39334:6;39305:9;:36::i;:::-;39361:4;39354:11;;38832:541;;;;;:::o;32399:110::-;32447:7;32473:18;;;;;;;;;;;32466:25;;32399:110;:::o;34881:270::-;35020:4;33022:12;:10;:12::i;:::-;33003:31;;:15;:13;:15::i;:::-;:31;;;32981:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;34987:13:::1;33200:1;33180:22;;:8;:22;;;;33172:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;35042:12:::2;35060:13;35042:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35115:4;35085:12;:27;35098:13;35085:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;35139:4;35132:11;;33105:1:::1;34881:270:::0;;;:::o;37461:85::-;37504:5;28942:1;37522:16;;37461:85;:::o;39381:302::-;39498:4;39520:133;39543:12;:10;:12::i;:::-;39570:7;39592:50;39631:10;39592:11;:25;39604:12;:10;:12::i;:::-;39592:25;;;;;;;;;;;;;;;:34;39618:7;39592:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;39520:8;:133::i;:::-;39671:4;39664:11;;39381:302;;;;:::o;52982:113::-;33022:12;:10;:12::i;:::-;33003:31;;:15;:13;:15::i;:::-;:31;;;32981:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;53083:4:::1;53053:18;:27;53072:7;53053:27;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;52982:113:::0;:::o;40380:335::-;33022:12;:10;:12::i;:::-;33003:31;;:15;:13;:15::i;:::-;:31;;;32981:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;40463:11:::1;:20;40475:7;40463:20;;;;;;;;;;;;;;;;;;;;;;;;;40462:21;40454:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;40549:1;40530:7;:16;40538:7;40530:16;;;;;;;;;;;;;;;;:20;40526:110;;;40586:38;40607:7;:16;40615:7;40607:16;;;;;;;;;;;;;;;;40586:20;:38::i;:::-;40567:7;:16;40575:7;40567:16;;;;;;;;;;;;;;;:57;;;;40526:110;40669:4;40646:11;:20;40658:7;40646:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;40684:9;40699:7;40684:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40380:335:::0;:::o;33328:236::-;33022:12;:10;:12::i;:::-;33003:31;;:15;:13;:15::i;:::-;:31;;;32981:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;33437:14:::1;33200:1;33180:22;;:8;:22;;;;33172:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33489:14:::2;33469:17;;:34;;;;;;;;;;;;;;;;;;33550:4;33514:18;:34;33533:14;33514:34;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;33105:1:::1;33328:236:::0;:::o;32741:94::-;32795:7;32822:5;32815:12;;32741:94;:::o;35227:266::-;35384:7;33022:12;:10;:12::i;:::-;33003:31;;:15;:13;:15::i;:::-;:31;;;32981:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;35345:19:::1;33200:1;33180:22;;:8;:22;;;;33172:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;35430:19:::2;35409:18;;:40;;;;;;;;;;;;;;;;;;35467:18;;;;;;;;;;;35460:25;;33105:1:::1;35227:266:::0;;;:::o;32515:115::-;32569:7;32595:17;;;;;;;;;;;32588:24;;32515:115;:::o;37659:199::-;37725:7;37749:11;:20;37761:7;37749:20;;;;;;;;;;;;;;;;;;;;;;;;;37745:49;;;37778:7;:16;37786:7;37778:16;;;;;;;;;;;;;;;;37771:23;;;;37745:49;37812:38;37833:7;:16;37841:7;37833:16;;;;;;;;;;;;;;;;37812:20;:38::i;:::-;37805:45;;37659:199;;;;:::o;33632:270::-;33022:12;:10;:12::i;:::-;33003:31;;:15;:13;:15::i;:::-;:31;;;32981:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;33753:24:::1;33200:1;33180:22;;:8;:22;;;;33172:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33809:24:::2;33795:11;::::0;:38:::2;;;;;;;;;;;;;;;;;;33890:4;33844:18;:44;33863:24;33844:44;;;;;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;33105:1:::1;33632:270:::0;:::o;34602:209::-;34732:4;34682:11;33200:1;33180:22;;:8;:22;;;;33172:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33022:12:::1;:10;:12::i;:::-;33003:31;;:15;:13;:15::i;:::-;:31;;;32981:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;34777:4:::2;34754:7;:20;34762:11;34754:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;34799:4;34792:11;;34602:209:::0;;;;:::o;31149:957::-;33022:12;:10;:12::i;:::-;33003:31;;:15;:13;:15::i;:::-;:31;;;32981:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;31270:35:::1;31341:42;31270:124;;31439:16;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31421:70;;;31500:4;31507:16;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31421:110;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31405:13;;:126;;;;;;;;;;;;;;;;;;31562:16;31544:15;;:34;;;;;;;;;;;;;;;;;;31619:4;31591:18;:25;31610:5;31591:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;31670:4;31634:18;:33;31661:4;31634:33;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;31717:4;31685:18;:29;27035:42;31685:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;31767:4;31732:18;:32;27116:42;31732:32;;;;;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;;;31816:4;31782:18;:31;31801:11:::0;::::1;;;;;;;;;;31782:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;31863:4;31831:18;:29;27273:42;31831:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;31917:4;31878:18;:36;27358:42;31878:36;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;31968:4;31932:18;:33;31951:13;;;;;;;;;;;31932:33;;;;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;32024:4;31983:18;:38;32002:18;;;;;;;;;;;31983:38;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;32084:4;32039:18;:42;32058:22;;;;;;;;;;;32039:42;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;33105:1;31149:957::o:0;33908:254::-;33022:12;:10;:12::i;:::-;33003:31;;:15;:13;:15::i;:::-;:31;;;32981:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;34001:21:::1;33200:1;33180:22;;:8;:22;;;;33172:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;34048:21:::2;34034:13;;:35;;;;;;;;;;;;;;;;;;34123:4;34080:18;:41;34099:21;34080:41;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;33105:1:::1;33908:254:::0;:::o;34222:331::-;34391:4;33022:12;:10;:12::i;:::-;33003:31;;:15;:13;:15::i;:::-;:31;;;32981:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;34348:23:::1;33200:1;33180:22;;:8;:22;;;;33172:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;34438:23:::2;34413:22;;:48;;;;;;;;;;;;;;;;;;34517:4;34472:18;:43;34491:23;34472:43;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;34541:4;34534:11;;33105:1:::1;34222:331:::0;;;:::o;37364:89::-;37405:13;37438:7;;;;;;;;;;;;;;;;;37431:14;;37364:89;:::o;39691:402::-;39813:4;39835:228;39858:12;:10;:12::i;:::-;39885:7;39907:145;39964:15;39907:145;;;;;;;;;;;;;;;;;:11;:25;39919:12;:10;:12::i;:::-;39907:25;;;;;;;;;;;;;;;:34;39933:7;39907:34;;;;;;;;;;;;;;;;:38;;:145;;;;;:::i;:::-;39835:8;:228::i;:::-;40081:4;40074:11;;39691:402;;;;:::o;37866:561::-;37973:4;37995:42;38005:12;:10;:12::i;:::-;38019:9;38030:6;37995:9;:42::i;:::-;38050:21;38074:20;38084:9;38074;:20::i;:::-;38050:44;;38137:6;38121:13;:22;;;;:::i;:::-;38105:38;;28942:1;28562:2;:13;;;;:::i;:::-;28557:1;:19;;;;:::i;:::-;38174:13;:35;;:71;;;;;38227:7;:18;38235:9;38227:18;;;;;;;;;;;;;;;;;;;;;;;;;38226:19;38174:71;:112;;;;;38263:12;:23;38276:9;38263:23;;;;;;;;;;;;;;;;;;;;;;;;;38262:24;38174:112;38156:242;;;38313:12;38331:9;38313:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38382:4;38356:12;:23;38369:9;38356:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;38156:242;38415:4;38408:11;;;37866:561;;;;:::o;32114:163::-;33022:12;:10;:12::i;:::-;33003:31;;:15;:13;:15::i;:::-;:31;;;32981:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;32183:21:::1;;32167:13;:37;;;;32225:15;;32215:7;:25;;;;32265:4;32251:11;;:18;;;;;;;;;;;;;;;;;;32114:163::o:0;32283:110::-;32335:7;32361:22;;;;;;;;;;;32354:29;;32283:110;:::o;38435:188::-;38555:7;38587:11;:19;38599:6;38587:19;;;;;;;;;;;;;;;:28;38607:7;38587:28;;;;;;;;;;;;;;;;38580:35;;38435:188;;;;:::o;53103:112::-;33022:12;:10;:12::i;:::-;33003:31;;:15;:13;:15::i;:::-;:31;;;32981:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;53202:5:::1;53172:18;:27;53191:7;53172:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;53103:112:::0;:::o;32636:97::-;32686:7;32712:13;;;;;;;;;;;32705:20;;32636:97;:::o;32843:98::-;32896:7;32923:10;32916:17;;32843:98;:::o;40723:359::-;40869:1;40851:20;;:6;:20;;;;40843:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;40941:1;40922:21;;:7;:21;;;;40914:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;41019:6;40988:11;:19;41000:6;40988:19;;;;;;;;;;;;;;;:28;41008:7;40988:28;;;;;;;;;;;;;;;:37;;;;41058:7;41041:33;;41050:6;41041:33;;;41067:6;41041:33;;;;;;:::i;:::-;;;;;;;;40723:359;;;:::o;22066:240::-;22186:7;22244:1;22239;:6;;22247:12;22231:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;22286:1;22282;:5;22275:12;;22066:240;;;;;:::o;41090:1343::-;41228:1;41212:18;;:4;:18;;;;41204:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41305:1;41291:16;;:2;:16;;;;41283:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;41375:1;41366:6;:10;41358:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;41433:10;41506:13;;;;;;;;;;;41498:21;;:4;:21;;;:68;;;;;41550:15;;;;;;;;;;;41536:30;;:2;:30;;;;41498:68;:108;;;;;41584:18;:22;41603:2;41584:22;;;;;;;;;;;;;;;;;;;;;;;;;41583:23;41498:108;41480:213;;;41641:11;;;;;;;;;;;41633:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;41480:213;41710:7;:13;41718:4;41710:13;;;;;;;;;;;;;;;;;;;;;;;;;41709:14;:36;;;;;41727:12;:18;41740:4;41727:18;;;;;;;;;;;;;;;;;;;;;;;;;41709:36;41705:309;;;41762:29;41794:15;41804:4;41794:9;:15::i;:::-;41762:47;;41824:29;41880:6;41856:21;:30;;;;:::i;:::-;41824:62;;28942:1;28562:2;:13;;;;:::i;:::-;28557:1;:19;;;;:::i;:::-;41905:21;:42;41901:102;;;41968:19;41982:4;41968:13;:19::i;:::-;;41901:102;41705:309;;;42026:12;42120:13;;;;;;;;;;;42112:21;;:4;:21;;;:44;;;;42143:13;;;;;;;;;;;42137:19;;:2;:19;;;42112:44;42111:116;;;;;42176:18;:24;42195:4;42176:24;;;;;;;;;;;;;;;;;;;;;;;;;:50;;;;42204:18;:22;42223:2;42204:22;;;;;;;;;;;;;;;;;;;;;;;;;42176:50;42174:53;42111:116;42093:187;;;42264:4;42254:14;;42093:187;42296:7;:13;42304:4;42296:13;;;;;;;;;;;;;;;;;;;;;;;;;:28;;;;42313:7;:11;42321:2;42313:11;;;;;;;;;;;;;;;;;;;;;;;;;42296:28;42292:73;;;42349:4;42341:12;;42292:73;42377:48;42392:4;42398:2;42402:6;42410:7;42419:5;42377:14;:48::i;:::-;41090:1343;;;;;:::o;19787:98::-;19845:7;19876:1;19872;:5;;;;:::i;:::-;19865:12;;19787:98;;;;:::o;40101:271::-;40197:7;40241;;40230;:18;;40222:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;40290:19;40312:10;:8;:10::i;:::-;40290:32;;40340:24;40352:11;40340:7;:11;;:24;;;;:::i;:::-;40333:31;;;40101:271;;;:::o;36238:1025::-;36301:4;36318:19;36340:12;:19;;;;36318:41;;36375:9;36370:188;36394:12;:19;;;;36390:1;:23;36370:188;;;36458:13;36439:32;;:12;36452:1;36439:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;36435:112;;;36506:1;36492:15;;36526:5;;36435:112;36415:3;;;;;:::i;:::-;;;;36370:188;;;;36587:12;:19;;;;36572:11;:34;36568:79;;;36630:5;36623:12;;;;;36568:79;36684:1;36661:12;:19;;;;:24;36657:599;;;36702:12;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36765:5;36735:12;:27;36748:13;36735:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;36792:4;36785:11;;;;;36657:599;36855:1;36833:12;:19;;;;:23;;;;:::i;:::-;36818:11;:38;36814:442;;;36873:12;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36936:5;36906:12;:27;36919:13;36906:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;36963:4;36956:11;;;;;36814:442;37005:9;37017:11;37005:23;;37000:136;37056:1;37034:12;:19;;;;:23;;;;:::i;:::-;37030:1;:27;37000:136;;;37101:12;37118:1;37114;:5;;;;:::i;:::-;37101:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37083:12;37096:1;37083:15;;;;;;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;37059:3;;;;;:::i;:::-;;;;37000:136;;;;37150:12;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37213:5;37183:12;:27;37196:13;37183:27;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;37240:4;37233:11;;;36238:1025;;;;:::o;42441:759::-;42618:7;42613:29;;42627:15;:13;:15::i;:::-;42613:29;42659:11;:19;42671:6;42659:19;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;;42683:11;:22;42695:9;42683:22;;;;;;;;;;;;;;;;;;;;;;;;;42682:23;42659:46;42655:495;;;42722:55;42744:6;42752:9;42763:6;42771:5;42722:21;:55::i;:::-;42655:495;;;42800:11;:19;42812:6;42800:19;;;;;;;;;;;;;;;;;;;;;;;;;42799:20;:46;;;;;42823:11;:22;42835:9;42823:22;;;;;;;;;;;;;;;;;;;;;;;;;42799:46;42795:355;;;42862:53;42882:6;42890:9;42901:6;42909:5;42862:19;:53::i;:::-;42795:355;;;42937:11;:19;42949:6;42937:19;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;;;42960:11;:22;42972:9;42960:22;;;;;;;;;;;;;;;;;;;;;;;;;42937:45;42933:217;;;42999:55;43021:6;43029:9;43040:6;43048:5;42999:21;:55::i;:::-;42933:217;;;43087:51;43105:6;43113:9;43124:6;43132:5;43087:17;:51::i;:::-;42933:217;42795:355;42655:495;43167:7;43162:30;;43176:16;:14;:16::i;:::-;43162:30;42441:759;;;;;:::o;48150:164::-;48192:7;48213:15;48230;48249:19;:17;:19::i;:::-;48212:56;;;;48286:20;48298:7;48286;:11;;:20;;;;:::i;:::-;48279:27;;;;48150:164;:::o;20924:98::-;20982:7;21013:1;21009;:5;;;;:::i;:::-;21002:12;;20924:98;;;;:::o;52604:236::-;52663:1;52652:7;;:12;:34;;;;;52685:1;52668:13;;:18;52652:34;52648:47;;;52688:7;;52648:47;52725:7;;52707:15;:25;;;;52767:13;;52743:21;:37;;;;52803:1;52793:7;:11;;;;52831:1;52815:13;:17;;;;52604:236;:::o;44708:714::-;44880:15;44910:23;44948:12;44975:23;45013:12;45040:18;45072:26;45083:7;45092:5;45072:10;:26::i;:::-;44865:233;;;;;;;;;;;;45127:28;45147:7;45127;:15;45135:6;45127:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;45109:7;:15;45117:6;45109:15;;;;;;;;;;;;;;;:46;;;;45184:28;45204:7;45184;:15;45192:6;45184:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;45166:7;:15;45174:6;45166:15;;;;;;;;;;;;;;;:46;;;;45244:39;45267:15;45244:7;:18;45252:9;45244:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;45223:7;:18;45231:9;45223:18;;;;;;;;;;;;;;;:60;;;;45294:26;45309:10;45294:14;:26::i;:::-;45331:23;45343:4;45349;45331:11;:23::i;:::-;45387:9;45370:44;;45379:6;45370:44;;;45398:15;45370:44;;;;;;:::i;:::-;;;;;;;;44708:714;;;;;;;;;;:::o;43974:726::-;44144:15;44174:23;44212:12;44239:23;44277:12;44304:18;44336:26;44347:7;44356:5;44336:10;:26::i;:::-;44129:233;;;;;;;;;;;;44391:28;44411:7;44391;:15;44399:6;44391:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;44373:7;:15;44381:6;44373:15;;;;;;;;;;;;;;;:46;;;;44451:39;44474:15;44451:7;:18;44459:9;44451:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;44430:7;:18;44438:9;44430:18;;;;;;;;;;;;;;;:60;;;;44522:39;44545:15;44522:7;:18;44530:9;44522:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;44501:7;:18;44509:9;44501:18;;;;;;;;;;;;;;;:60;;;;44572:26;44587:10;44572:14;:26::i;:::-;44609:23;44621:4;44627;44609:11;:23::i;:::-;44665:9;44648:44;;44657:6;44648:44;;;44676:15;44648:44;;;;;;:::i;:::-;;;;;;;;43974:726;;;;;;;;;;:::o;45430:785::-;45602:15;45632:23;45670:12;45697:23;45735:12;45762:18;45794:26;45805:7;45814:5;45794:10;:26::i;:::-;45587:233;;;;;;;;;;;;45849:28;45869:7;45849;:15;45857:6;45849:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;45831:7;:15;45839:6;45831:15;;;;;;;;;;;;;;;:46;;;;45906:28;45926:7;45906;:15;45914:6;45906:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;45888:7;:15;45896:6;45888:15;;;;;;;;;;;;;;;:46;;;;45966:39;45989:15;45966:7;:18;45974:9;45966:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;45945:7;:18;45953:9;45945:18;;;;;;;;;;;;;;;:60;;;;46037:39;46060:15;46037:7;:18;46045:9;46037:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;46016:7;:18;46024:9;46016:18;;;;;;;;;;;;;;;:60;;;;46087:26;46102:10;46087:14;:26::i;:::-;46124:23;46136:4;46142;46124:11;:23::i;:::-;46180:9;46163:44;;46172:6;46163:44;;;46191:15;46163:44;;;;;;:::i;:::-;;;;;;;;45430:785;;;;;;;;;;:::o;43208:758::-;43376:15;43406:23;43444:12;43471:23;43509:12;43536:18;43568:26;43579:7;43588:5;43568:10;:26::i;:::-;43361:233;;;;;;;;;;;;43623:28;43643:7;43623;:15;43631:6;43623:15;;;;;;;;;;;;;;;;:19;;:28;;;;:::i;:::-;43605:7;:15;43613:6;43605:15;;;;;;;;;;;;;;;:46;;;;43685:39;43708:15;43685:7;:18;43693:9;43685:18;;;;;;;;;;;;;;;;:22;;:39;;;;:::i;:::-;43664:7;:18;43672:9;43664:18;;;;;;;;;;;;;;;:60;;;;43741:5;43737:126;;;43763:29;43781:10;43763:17;:29::i;:::-;43737:126;;;43825:26;43840:10;43825:14;:26::i;:::-;43737:126;43875:23;43887:4;43893;43875:11;:23::i;:::-;43931:9;43914:44;;43923:6;43914:44;;;43942:15;43914:44;;;;;;:::i;:::-;;;;;;;;43208:758;;;;;;;;;;:::o;52848:126::-;52903:15;;52893:7;:25;;;;52945:21;;52929:13;:37;;;;52848:126::o;48322:605::-;48373:7;48382;48402:15;48420:7;;48402:25;;48438:15;28942:1;28713:2;:13;;;;:::i;:::-;28696:14;:30;;;;:::i;:::-;48438:25;;48479:9;48474:338;48498:9;:16;;;;48494:1;:20;48474:338;;;48582:7;48558;:21;48566:9;48576:1;48566:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48558:21;;;;;;;;;;;;;;;;:31;:83;;;;48634:7;48610;:21;48618:9;48628:1;48618:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48610:21;;;;;;;;;;;;;;;;:31;48558:83;48536:146;;;48665:7;;28942:1;28713:2;:13;;;;:::i;:::-;28696:14;:30;;;;:::i;:::-;48657:25;;;;;;;;;48536:146;48707:34;48719:7;:21;48727:9;48737:1;48727:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48719:21;;;;;;;;;;;;;;;;48707:7;:11;;:34;;;;:::i;:::-;48697:44;;48766:34;48778:7;:21;48786:9;48796:1;48786:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48778:21;;;;;;;;;;;;;;;;48766:7;:11;;:34;;;;:::i;:::-;48756:44;;48516:3;;;;;:::i;:::-;;;;48474:338;;;;48836:20;28942:1;28713:2;:13;;;;:::i;:::-;28696:14;:30;;;;:::i;:::-;48836:7;;:11;;:20;;;;:::i;:::-;48826:7;:30;48822:61;;;48866:7;;28942:1;28713:2;:13;;;;:::i;:::-;28696:14;:30;;;;:::i;:::-;48858:25;;;;;;;;48822:61;48902:7;48911;48894:25;;;;;;48322:605;;;:::o;46378:761::-;46490:7;46512;46534;46556;46578;46600;46650:23;46688:12;46715:18;46747:27;46759:7;46768:5;46747:11;:27::i;:::-;46635:139;;;;;;46786:15;46803:23;46828:12;46844:113;46870:7;46892:4;46911:10;46936;:8;:10::i;:::-;46844:11;:113::i;:::-;46785:172;;;;;;46990:7;47012:15;47042:4;47061:15;47091:4;47110:10;46968:163;;;;;;;;;;;;;;;;;;46378:761;;;;;;;;:::o;20168:98::-;20226:7;20257:1;20253;:5;;;;:::i;:::-;20246:12;;20168:98;;;;:::o;49014:2447::-;49077:22;49115:2;49102:10;:15;;;;:::i;:::-;49077:40;;49128:24;27903:1;49155:14;:33;;;;:::i;:::-;49128:60;;49199:31;28002:1;49233:14;:54;;;;:::i;:::-;49199:88;;49298:27;27950:1;49328:14;:36;;;;:::i;:::-;49298:66;;49375:28;28047:1;49406:14;:34;;;;:::i;:::-;49375:65;;49513:19;49535:10;:8;:10::i;:::-;49513:32;;49556:24;49583:33;49604:11;49583:16;:20;;:33;;;;:::i;:::-;49556:60;;49627:27;49676:12;:19;;;;49657:16;:38;;;;:::i;:::-;49627:68;;49706:27;49755:12;:19;;;;49736:16;:38;;;;:::i;:::-;49706:68;;49847:25;49875:40;49903:11;49875:23;:27;;:40;;;;:::i;:::-;49847:68;;49995:22;50020:37;50045:11;50020:20;:24;;:37;;;;:::i;:::-;49995:62;;50130:21;50154:36;50178:11;50154:19;:23;;:36;;;;:::i;:::-;50130:60;;50289:70;50335:13;50289:7;:27;50297:18;;;;;;;;;;;50289:27;;;;;;;;;;;;;;;;:31;;:70;;;;:::i;:::-;50259:7;:27;50267:18;;;;;;;;;;;50259:27;;;;;;;;;;;;;;;:100;;;;50402:76;50448:19;50402:7;:27;50410:18;;;;;;;;;;;50402:27;;;;;;;;;;;;;;;;:31;;:76;;;;:::i;:::-;50372:7;:27;50380:18;;;;;;;;;;;50372:27;;;;;;;;;;;;;;;:106;;;;50587:64;50626:14;50587:7;:20;50595:11;;;;;;;;;;;50587:20;;;;;;;;;;;;;;;;:24;;:64;;;;:::i;:::-;50564:7;:20;50572:11;;;;;;;;;;;50564:20;;;;;;;;;;;;;;;:87;;;;50687:70;50726:20;50687:7;:20;50695:11;;;;;;;;;;;50687:20;;;;;;;;;;;;;;;;:24;;:70;;;;:::i;:::-;50664:7;:20;50672:11;;;;;;;;;;;50664:20;;;;;;;;;;;;;;;:93;;;;50827:9;50822:310;50846:12;:19;;;;50842:1;:23;50822:310;;;50914:81;50961:19;50914:7;:24;50922:12;50935:1;50922:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50914:24;;;;;;;;;;;;;;;;:28;;:81;;;;:::i;:::-;50887:7;:24;50895:12;50908:1;50895:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50887:24;;;;;;;;;;;;;;;:108;;;;51039:81;51086:19;51039:7;:24;51047:12;51060:1;51047:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51039:24;;;;;;;;;;;;;;;;:28;;:81;;;;:::i;:::-;51012:7;:24;51020:12;51033:1;51020:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51012:24;;;;;;;;;;;;;;;:108;;;;50867:3;;;;;:::i;:::-;;;;50822:310;;;;51246:78;51296:17;51246:7;:31;51254:22;;;;;;;;;;;51246:31;;;;;;;;;;;;;;;;:35;;:78;;;;:::i;:::-;51212:7;:31;51220:22;;;;;;;;;;;51212:31;;;;;;;;;;;;;;;:112;;;;51369:84;51419:23;51369:7;:31;51377:22;;;;;;;;;;;51369:31;;;;;;;;;;;;;;;;:35;;:84;;;;:::i;:::-;51335:7;:31;51343:22;;;;;;;;;;;51335:31;;;;;;;;;;;;;;;:118;;;;49014:2447;;;;;;;;;;;;;:::o;46223:147::-;46301:17;46313:4;46301:7;;:11;;:17;;;;:::i;:::-;46291:7;:27;;;;46342:20;46357:4;46342:10;;:14;;:20;;;;:::i;:::-;46329:10;:33;;;;46223:147;;:::o;51469:676::-;51535:19;51557:10;:8;:10::i;:::-;51535:32;;51578:27;51608;51623:11;51608:10;:14;;:27;;;;:::i;:::-;51578:57;;51646:30;51714:12;:19;;;;51679;:54;;;;:::i;:::-;51646:87;;51744:30;51790:12;:19;;;;51777:10;:32;;;;:::i;:::-;51744:65;;51827:9;51822:316;51846:12;:19;;;;51842:1;:23;51822:316;;;51914:84;51961:22;51914:7;:24;51922:12;51935:1;51922:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51914:24;;;;;;;;;;;;;;;;:28;;:84;;;;:::i;:::-;51887:7;:24;51895:12;51908:1;51895:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51887:24;;;;;;;;;;;;;;;:111;;;;52042:84;52089:22;52042:7;:24;52050:12;52063:1;52050:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52042:24;;;;;;;;;;;;;;;;:28;;:84;;;;:::i;:::-;52015:7;:24;52023:12;52036:1;52023:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52015:24;;;;;;;;;;;;;;;:111;;;;51867:3;;;;;:::i;:::-;;;;51822:316;;;;51469:676;;;;;:::o;47147:433::-;47260:7;47282;47304;47339:12;47354:25;47371:7;47354:16;:25::i;:::-;47339:40;;47390:18;47411:38;47434:7;47443:5;47411:22;:38::i;:::-;47390:59;;47460:23;47486:33;47508:10;47486:17;47498:4;47486:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;47460:59;;47538:15;47555:4;47561:10;47530:42;;;;;;;;;47147:433;;;;;:::o;47588:554::-;47787:7;47809;47831;47866:15;47884:24;47896:11;47884:7;:11;;:24;;;;:::i;:::-;47866:42;;47919:12;47934:21;47943:11;47934:4;:8;;:21;;;;:::i;:::-;47919:36;;47966:18;47987:27;48002:11;47987:10;:14;;:27;;;;:::i;:::-;47966:48;;48025:23;48051:33;48073:10;48051:17;48063:4;48051:7;:11;;:17;;;;:::i;:::-;:21;;:33;;;;:::i;:::-;48025:59;;48103:7;48112:15;48129:4;48095:39;;;;;;;;;;47588:554;;;;;;;;:::o;20525:98::-;20583:7;20614:1;20610;:5;;;;:::i;:::-;20603:12;;20525:98;;;;:::o;52153:131::-;52218:7;52245:31;52270:5;52245:20;52257:7;;52245;:11;;:20;;;;:::i;:::-;:24;;:31;;;;:::i;:::-;52238:38;;52153:131;;;:::o;52292:304::-;52402:7;52431:5;52427:162;;;52460:40;52494:5;52460:29;29196:2;52460:7;:11;;:29;;;;:::i;:::-;:33;;:40;;;;:::i;:::-;52453:47;;;;52427:162;52540:37;52571:5;52540:26;52552:13;;52540:7;:11;;:26;;;;:::i;:::-;:30;;:37;;;;:::i;:::-;52533:44;;52292:304;;;;;:::o;7:139:1:-;;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:143::-;;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;215:80;;;;:::o;301:139::-;;385:6;372:20;363:29;;401:33;428:5;401:33;:::i;:::-;353:87;;;;:::o;446:262::-;;554:2;542:9;533:7;529:23;525:32;522:2;;;570:1;567;560:12;522:2;613:1;638:53;683:7;674:6;663:9;659:22;638:53;:::i;:::-;628:63;;584:117;512:196;;;;:::o;714:284::-;;833:2;821:9;812:7;808:23;804:32;801:2;;;849:1;846;839:12;801:2;892:1;917:64;973:7;964:6;953:9;949:22;917:64;:::i;:::-;907:74;;863:128;791:207;;;;:::o;1004:407::-;;;1129:2;1117:9;1108:7;1104:23;1100:32;1097:2;;;1145:1;1142;1135:12;1097:2;1188:1;1213:53;1258:7;1249:6;1238:9;1234:22;1213:53;:::i;:::-;1203:63;;1159:117;1315:2;1341:53;1386:7;1377:6;1366:9;1362:22;1341:53;:::i;:::-;1331:63;;1286:118;1087:324;;;;;:::o;1417:552::-;;;;1559:2;1547:9;1538:7;1534:23;1530:32;1527:2;;;1575:1;1572;1565:12;1527:2;1618:1;1643:53;1688:7;1679:6;1668:9;1664:22;1643:53;:::i;:::-;1633:63;;1589:117;1745:2;1771:53;1816:7;1807:6;1796:9;1792:22;1771:53;:::i;:::-;1761:63;;1716:118;1873:2;1899:53;1944:7;1935:6;1924:9;1920:22;1899:53;:::i;:::-;1889:63;;1844:118;1517:452;;;;;:::o;1975:407::-;;;2100:2;2088:9;2079:7;2075:23;2071:32;2068:2;;;2116:1;2113;2106:12;2068:2;2159:1;2184:53;2229:7;2220:6;2209:9;2205:22;2184:53;:::i;:::-;2174:63;;2130:117;2286:2;2312:53;2357:7;2348:6;2337:9;2333:22;2312:53;:::i;:::-;2302:63;;2257:118;2058:324;;;;;:::o;2388:262::-;;2496:2;2484:9;2475:7;2471:23;2467:32;2464:2;;;2512:1;2509;2502:12;2464:2;2555:1;2580:53;2625:7;2616:6;2605:9;2601:22;2580:53;:::i;:::-;2570:63;;2526:117;2454:196;;;;:::o;2656:118::-;2743:24;2761:5;2743:24;:::i;:::-;2738:3;2731:37;2721:53;;:::o;2780:109::-;2861:21;2876:5;2861:21;:::i;:::-;2856:3;2849:34;2839:50;;:::o;2895:364::-;;3011:39;3044:5;3011:39;:::i;:::-;3066:71;3130:6;3125:3;3066:71;:::i;:::-;3059:78;;3146:52;3191:6;3186:3;3179:4;3172:5;3168:16;3146:52;:::i;:::-;3223:29;3245:6;3223:29;:::i;:::-;3218:3;3214:39;3207:46;;2987:272;;;;;:::o;3265:366::-;;3428:67;3492:2;3487:3;3428:67;:::i;:::-;3421:74;;3504:93;3593:3;3504:93;:::i;:::-;3622:2;3617:3;3613:12;3606:19;;3411:220;;;:::o;3637:366::-;;3800:67;3864:2;3859:3;3800:67;:::i;:::-;3793:74;;3876:93;3965:3;3876:93;:::i;:::-;3994:2;3989:3;3985:12;3978:19;;3783:220;;;:::o;4009:366::-;;4172:67;4236:2;4231:3;4172:67;:::i;:::-;4165:74;;4248:93;4337:3;4248:93;:::i;:::-;4366:2;4361:3;4357:12;4350:19;;4155:220;;;:::o;4381:366::-;;4544:67;4608:2;4603:3;4544:67;:::i;:::-;4537:74;;4620:93;4709:3;4620:93;:::i;:::-;4738:2;4733:3;4729:12;4722:19;;4527:220;;;:::o;4753:366::-;;4916:67;4980:2;4975:3;4916:67;:::i;:::-;4909:74;;4992:93;5081:3;4992:93;:::i;:::-;5110:2;5105:3;5101:12;5094:19;;4899:220;;;:::o;5125:366::-;;5288:67;5352:2;5347:3;5288:67;:::i;:::-;5281:74;;5364:93;5453:3;5364:93;:::i;:::-;5482:2;5477:3;5473:12;5466:19;;5271:220;;;:::o;5497:366::-;;5660:67;5724:2;5719:3;5660:67;:::i;:::-;5653:74;;5736:93;5825:3;5736:93;:::i;:::-;5854:2;5849:3;5845:12;5838:19;;5643:220;;;:::o;5869:366::-;;6032:67;6096:2;6091:3;6032:67;:::i;:::-;6025:74;;6108:93;6197:3;6108:93;:::i;:::-;6226:2;6221:3;6217:12;6210:19;;6015:220;;;:::o;6241:366::-;;6404:67;6468:2;6463:3;6404:67;:::i;:::-;6397:74;;6480:93;6569:3;6480:93;:::i;:::-;6598:2;6593:3;6589:12;6582:19;;6387:220;;;:::o;6613:118::-;6700:24;6718:5;6700:24;:::i;:::-;6695:3;6688:37;6678:53;;:::o;6737:112::-;6820:22;6836:5;6820:22;:::i;:::-;6815:3;6808:35;6798:51;;:::o;6855:222::-;;6986:2;6975:9;6971:18;6963:26;;6999:71;7067:1;7056:9;7052:17;7043:6;6999:71;:::i;:::-;6953:124;;;;:::o;7083:332::-;;7242:2;7231:9;7227:18;7219:26;;7255:71;7323:1;7312:9;7308:17;7299:6;7255:71;:::i;:::-;7336:72;7404:2;7393:9;7389:18;7380:6;7336:72;:::i;:::-;7209:206;;;;;:::o;7421:210::-;;7546:2;7535:9;7531:18;7523:26;;7559:65;7621:1;7610:9;7606:17;7597:6;7559:65;:::i;:::-;7513:118;;;;:::o;7637:313::-;;7788:2;7777:9;7773:18;7765:26;;7837:9;7831:4;7827:20;7823:1;7812:9;7808:17;7801:47;7865:78;7938:4;7929:6;7865:78;:::i;:::-;7857:86;;7755:195;;;;:::o;7956:419::-;;8160:2;8149:9;8145:18;8137:26;;8209:9;8203:4;8199:20;8195:1;8184:9;8180:17;8173:47;8237:131;8363:4;8237:131;:::i;:::-;8229:139;;8127:248;;;:::o;8381:419::-;;8585:2;8574:9;8570:18;8562:26;;8634:9;8628:4;8624:20;8620:1;8609:9;8605:17;8598:47;8662:131;8788:4;8662:131;:::i;:::-;8654:139;;8552:248;;;:::o;8806:419::-;;9010:2;8999:9;8995:18;8987:26;;9059:9;9053:4;9049:20;9045:1;9034:9;9030:17;9023:47;9087:131;9213:4;9087:131;:::i;:::-;9079:139;;8977:248;;;:::o;9231:419::-;;9435:2;9424:9;9420:18;9412:26;;9484:9;9478:4;9474:20;9470:1;9459:9;9455:17;9448:47;9512:131;9638:4;9512:131;:::i;:::-;9504:139;;9402:248;;;:::o;9656:419::-;;9860:2;9849:9;9845:18;9837:26;;9909:9;9903:4;9899:20;9895:1;9884:9;9880:17;9873:47;9937:131;10063:4;9937:131;:::i;:::-;9929:139;;9827:248;;;:::o;10081:419::-;;10285:2;10274:9;10270:18;10262:26;;10334:9;10328:4;10324:20;10320:1;10309:9;10305:17;10298:47;10362:131;10488:4;10362:131;:::i;:::-;10354:139;;10252:248;;;:::o;10506:419::-;;10710:2;10699:9;10695:18;10687:26;;10759:9;10753:4;10749:20;10745:1;10734:9;10730:17;10723:47;10787:131;10913:4;10787:131;:::i;:::-;10779:139;;10677:248;;;:::o;10931:419::-;;11135:2;11124:9;11120:18;11112:26;;11184:9;11178:4;11174:20;11170:1;11159:9;11155:17;11148:47;11212:131;11338:4;11212:131;:::i;:::-;11204:139;;11102:248;;;:::o;11356:419::-;;11560:2;11549:9;11545:18;11537:26;;11609:9;11603:4;11599:20;11595:1;11584:9;11580:17;11573:47;11637:131;11763:4;11637:131;:::i;:::-;11629:139;;11527:248;;;:::o;11781:222::-;;11912:2;11901:9;11897:18;11889:26;;11925:71;11993:1;11982:9;11978:17;11969:6;11925:71;:::i;:::-;11879:124;;;;:::o;12009:214::-;;12136:2;12125:9;12121:18;12113:26;;12149:67;12213:1;12202:9;12198:17;12189:6;12149:67;:::i;:::-;12103:120;;;;:::o;12229:99::-;;12315:5;12309:12;12299:22;;12288:40;;;:::o;12334:169::-;;12452:6;12447:3;12440:19;12492:4;12487:3;12483:14;12468:29;;12430:73;;;;:::o;12509:305::-;;12568:20;12586:1;12568:20;:::i;:::-;12563:25;;12602:20;12620:1;12602:20;:::i;:::-;12597:25;;12756:1;12688:66;12684:74;12681:1;12678:81;12675:2;;;12762:18;;:::i;:::-;12675:2;12806:1;12803;12799:9;12792:16;;12553:261;;;;:::o;12820:185::-;;12877:20;12895:1;12877:20;:::i;:::-;12872:25;;12911:20;12929:1;12911:20;:::i;:::-;12906:25;;12950:1;12940:2;;12955:18;;:::i;:::-;12940:2;12997:1;12994;12990:9;12985:14;;12862:143;;;;:::o;13011:848::-;;;13103:6;13094:15;;13127:5;13118:14;;13141:712;13162:1;13152:8;13149:15;13141:712;;;13257:4;13252:3;13248:14;13242:4;13239:24;13236:2;;;13266:18;;:::i;:::-;13236:2;13316:1;13306:8;13302:16;13299:2;;;13731:4;13724:5;13720:16;13711:25;;13299:2;13781:4;13775;13771:15;13763:23;;13811:32;13834:8;13811:32;:::i;:::-;13799:44;;13141:712;;;13084:775;;;;;;;:::o;13865:281::-;;13947:23;13965:4;13947:23;:::i;:::-;13939:31;;13991:25;14007:8;13991:25;:::i;:::-;13979:37;;14035:104;14072:66;14062:8;14056:4;14035:104;:::i;:::-;14026:113;;13929:217;;;;:::o;14152:1073::-;;14397:8;14387:2;;14418:1;14409:10;;14420:5;;14387:2;14446:4;14436:2;;14463:1;14454:10;;14465:5;;14436:2;14532:4;14580:1;14575:27;;;;14616:1;14611:191;;;;14525:277;;14575:27;14593:1;14584:10;;14595:5;;;14611:191;14656:3;14646:8;14643:17;14640:2;;;14663:18;;:::i;:::-;14640:2;14712:8;14709:1;14705:16;14696:25;;14747:3;14740:5;14737:14;14734:2;;;14754:18;;:::i;:::-;14734:2;14787:5;;;14525:277;;14911:2;14901:8;14898:16;14892:3;14886:4;14883:13;14879:36;14861:2;14851:8;14848:16;14843:2;14837:4;14834:12;14830:35;14814:111;14811:2;;;14967:8;14961:4;14957:19;14948:28;;15002:3;14995:5;14992:14;14989:2;;;15009:18;;:::i;:::-;14989:2;15042:5;;14811:2;15082:42;15120:3;15110:8;15104:4;15101:1;15082:42;:::i;:::-;15067:57;;;;15156:4;15151:3;15147:14;15140:5;15137:25;15134:2;;;15165:18;;:::i;:::-;15134:2;15214:4;15207:5;15203:16;15194:25;;14212:1013;;;;;;:::o;15231:348::-;;15294:20;15312:1;15294:20;:::i;:::-;15289:25;;15328:20;15346:1;15328:20;:::i;:::-;15323:25;;15516:1;15448:66;15444:74;15441:1;15438:81;15433:1;15426:9;15419:17;15415:105;15412:2;;;15523:18;;:::i;:::-;15412:2;15571:1;15568;15564:9;15553:20;;15279:300;;;;:::o;15585:191::-;;15645:20;15663:1;15645:20;:::i;:::-;15640:25;;15679:20;15697:1;15679:20;:::i;:::-;15674:25;;15718:1;15715;15712:8;15709:2;;;15723:18;;:::i;:::-;15709:2;15768:1;15765;15761:9;15753:17;;15630:146;;;;:::o;15782:96::-;;15848:24;15866:5;15848:24;:::i;:::-;15837:35;;15827:51;;;:::o;15884:90::-;;15961:5;15954:13;15947:21;15936:32;;15926:48;;;:::o;15980:126::-;;16057:42;16050:5;16046:54;16035:65;;16025:81;;;:::o;16112:77::-;;16178:5;16167:16;;16157:32;;;:::o;16195:86::-;;16270:4;16263:5;16259:16;16248:27;;16238:43;;;:::o;16287:307::-;16355:1;16365:113;16379:6;16376:1;16373:13;16365:113;;;16464:1;16459:3;16455:11;16449:18;16445:1;16440:3;16436:11;16429:39;16401:2;16398:1;16394:10;16389:15;;16365:113;;;16496:6;16493:1;16490:13;16487:2;;;16576:1;16567:6;16562:3;16558:16;16551:27;16487:2;16336:258;;;;:::o;16600:233::-;;16662:24;16680:5;16662:24;:::i;:::-;16653:33;;16708:66;16701:5;16698:77;16695:2;;;16778:18;;:::i;:::-;16695:2;16825:1;16818:5;16814:13;16807:20;;16643:190;;;:::o;16839:180::-;16887:77;16884:1;16877:88;16984:4;16981:1;16974:15;17008:4;17005:1;16998:15;17025:180;17073:77;17070:1;17063:88;17170:4;17167:1;17160:15;17194:4;17191:1;17184:15;17211:102;;17303:2;17299:7;17294:2;17287:5;17283:14;17279:28;17269:38;;17259:54;;;:::o;17319:102::-;;17408:5;17405:1;17401:13;17380:34;;17370:51;;;:::o;17427:222::-;17567:34;17563:1;17555:6;17551:14;17544:58;17636:5;17631:2;17623:6;17619:15;17612:30;17533:116;:::o;17655:177::-;17795:29;17791:1;17783:6;17779:14;17772:53;17761:71;:::o;17838:177::-;17978:29;17974:1;17966:6;17962:14;17955:53;17944:71;:::o;18021:179::-;18161:31;18157:1;18149:6;18145:14;18138:55;18127:73;:::o;18206:176::-;18346:28;18342:1;18334:6;18330:14;18323:52;18312:70;:::o;18388:182::-;18528:34;18524:1;18516:6;18512:14;18505:58;18494:76;:::o;18576:228::-;18716:34;18712:1;18704:6;18700:14;18693:58;18785:11;18780:2;18772:6;18768:15;18761:36;18682:122;:::o;18810:224::-;18950:34;18946:1;18938:6;18934:14;18927:58;19019:7;19014:2;19006:6;19002:15;18995:32;18916:118;:::o;19040:174::-;19180:26;19176:1;19168:6;19164:14;19157:50;19146:68;:::o;19220:122::-;19293:24;19311:5;19293:24;:::i;:::-;19286:5;19283:35;19273:2;;19332:1;19329;19322:12;19273:2;19263:79;:::o;19348:122::-;19421:24;19439:5;19421:24;:::i;:::-;19414:5;19411:35;19401:2;;19460:1;19457;19450:12;19401:2;19391:79;:::o

Swarm Source

ipfs://bbdde622a2243dcfc78f964cd16a0ab858ef315cd7c30a2613fa7c279c39ce15

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.