ETH Price: $2,286.82 (+0.44%)

Token

Digital Files (DIFI)
 

Overview

Max Total Supply

10,000,000 DIFI

Holders

375 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH (+1.33%)

Onchain Market Cap

$3,461.60

Circulating Supply Market Cap

$3,461.59

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 DIFI

Value
$0.00
0xd6bcad28a88a1ea2ffb030ee5ab1169c0fe3ae3b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

DIFI is a decentralized electronic document trading platform, where you can sell videos, codes, audio, pictures, games, databases, etc., using DIFI tokens for transactions.

# Exchange Pair Price  24H Volume % Volume
1
Raydium
FZFRZDAADSYXUWK5IBV9CAMNLMMX9DRUTFMEJBQM751U-SO11111111111111111111111111111111111111112$0.0003
0.0000002 Eth
$256.77
1,015,974.403 FZFRZDAADSYXUWK5IBV9CAMNLMMX9DRUTFMEJBQM751U
100.0000%
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
DividendTokenWithAntibot

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

library Clones {
    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create opcode, which should never revert.
     */
    function clone(address implementation) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create(0, ptr, 0x37)
        }
        require(instance != address(0), "ERC1167: create failed");
    }

    /**
     * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
     *
     * This function uses the create2 opcode and a `salt` to deterministically deploy
     * the clone. Using the same `implementation` and `salt` multiple time will revert, since
     * the clones cannot be deployed twice at the same address.
     */
    function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create2(0, ptr, 0x37, salt)
        }
        require(instance != address(0), "ERC1167: create2 failed");
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(
        address implementation,
        bytes32 salt,
        address deployer
    ) internal pure returns (address predicted) {
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000)
            mstore(add(ptr, 0x38), shl(0x60, deployer))
            mstore(add(ptr, 0x4c), salt)
            mstore(add(ptr, 0x6c), keccak256(ptr, 0x37))
            predicted := keccak256(add(ptr, 0x37), 0x55)
        }
    }

    /**
     * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
     */
    function predictDeterministicAddress(address implementation, bytes32 salt)
        internal
        view
        returns (address predicted)
    {
        return predictDeterministicAddress(implementation, salt, address(this));
    }
}

pragma solidity >=0.5.0;

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

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

pragma solidity >=0.6.2;

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library AddressUpgradeable {
    /**
     * @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 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);
            }
        }
    }
}

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

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `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);

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

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

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

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

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

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

interface IERC20Upgradeable {
    /**
     * @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);

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

abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        // If the contract is initializing we ignore whether _initialized is set in order to support multiple
        // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
        // contract may have been reentered.
        require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }

    /**
     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
     * {initializer} modifier, directly or indirectly.
     */
    modifier onlyInitializing() {
        require(_initializing, "Initializable: contract is not initializing");
        _;
    }

    function _isConstructor() private view returns (bool) {
        return !AddressUpgradeable.isContract(address(this));
    }
}

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

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}
abstract contract ContextUpgradeable is Initializable {
    function __Context_init() internal onlyInitializing {
    }

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[50] private __gap;
}

contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20Upgradeable, IERC20MetadataUpgradeable {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

    function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

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

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[45] private __gap;
}

abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init() internal onlyInitializing {
        __Ownable_init_unchained();
    }

    function __Ownable_init_unchained() internal onlyInitializing {
        _transferOwnership(_msgSender());
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    /**
     * @dev This empty reserved space is put in place to allow future versions to add new
     * variables without shifting down storage in the inheritance chain.
     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps
     */
    uint256[49] private __gap;
}

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

library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

pragma solidity ^0.8.18;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}



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

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

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

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

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

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

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

contract DividendPayingToken is
    ERC20Upgradeable,
    OwnableUpgradeable,
    DividendPayingTokenInterface,
    DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;
    using SafeERC20 for IERC20;
    address public rewardToken;

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

    uint256 internal magnifiedDividendPerShare;

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

    uint256 public totalDividendsDistributed;

    function __DividendPayingToken_init(
        address _rewardToken,
        string memory _name,
        string memory _symbol
    ) internal onlyInitializing {
        __Ownable_init();
        __ERC20_init(_name, _symbol);
        rewardToken = _rewardToken;
    }

    function distributeCAKEDividends(uint256 amount) public onlyOwner {
        require(totalSupply() > 0);

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

            totalDividendsDistributed = totalDividendsDistributed.add(amount);
        }
    }

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

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

            return _withdrawableDividend;
        }

        return 0;
    }

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

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

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

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

    /// @dev Internal function that transfer tokens from one address to another.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param from The address to transfer from.
    /// @param to The address to transfer to.
    /// @param value The amount to be transferred.
    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal virtual override {
        require(false);

        int256 _magCorrection = magnifiedDividendPerShare
            .mul(value)
            .toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from]
            .add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(
            _magCorrection
        );
    }

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

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

    /// @dev Internal function that burns an amount of the token of a given account.
    /// Update magnifiedDividendCorrections to keep dividends unchanged.
    /// @param account The account whose tokens will be burnt.
    /// @param value The amount that will be burnt.
    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);

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

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);

        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }
}

contract DividendTokenDividendTracker is OwnableUpgradeable, DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;
    uint256 public lastProcessedIndex;

    mapping(address => bool) public excludedFromDividends;

    mapping(address => uint256) public lastClaimTimes;

    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;

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

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

    constructor() {
        
    }

    function initialize(
        address rewardToken_,
        uint256 minimumTokenBalanceForDividends_
    ) external initializer {
        DividendPayingToken.__DividendPayingToken_init(
            rewardToken_,
            "DIVIDEND_TRACKER",
            "DIVIDEND_TRACKER"
        );
        claimWait = 3600;
        minimumTokenBalanceForDividends = minimumTokenBalanceForDividends_;
    }

    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "Dividend_Tracker: No transfers allowed");
    }

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

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

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

        emit ExcludeFromDividends(account);
    }

    function isExcludedFromDividends(address account)
        public
        view
        returns (bool)
    {
        return excludedFromDividends[account];
    }

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

    function updateMinimumTokenBalanceForDividends(uint256 amount)
        external
        onlyOwner
    {
        minimumTokenBalanceForDividends = amount;
    }

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

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

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

        index = tokenHoldersMap.getIndexOfKey(account);

        iterationsUntilProcessed = -1;

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

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

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

        lastClaimTime = lastClaimTimes[account];

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

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

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

        address account = tokenHoldersMap.getKeyAtIndex(index);

        return getAccount(account);
    }

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

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

    function setBalance(address payable account, uint256 newBalance)
        external
        onlyOwner
    {
        if (excludedFromDividends[account]) {
            return;
        }
        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
            tokenHoldersMap.set(account, newBalance);
        } else {
            _setBalance(account, 0);
            tokenHoldersMap.remove(account);
        }
        processAccount(account, true);
    }

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

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

        uint256 _lastProcessedIndex = lastProcessedIndex;

        uint256 gasUsed = 0;

        uint256 gasLeft = gasleft();

        uint256 iterations = 0;
        uint256 claims = 0;

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

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

            address account = tokenHoldersMap.keys[_lastProcessedIndex];

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

            iterations++;

            uint256 newGasLeft = gasleft();

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

            gasLeft = newGasLeft;
        }

        lastProcessedIndex = _lastProcessedIndex;

        return (iterations, claims, lastProcessedIndex);
    }

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

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

        return false;
    }
}


interface IGemAntiBot {
    function setTokenOwner(address owner) external;

    function onPreTransferCheck(
        address from,
        address to,
        uint256 amount
    ) external;
}
interface IFee {
    function payFee(
        uint256 _tokenType
    ) external payable;
}
interface IUniswapV2Caller {
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        address router,
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        uint256 deadline
    ) external;
}
contract DividendTokenWithAntibot is ERC20, Ownable {
    using SafeERC20 for IERC20;
    uint256 private constant MAX = ~uint256(0);
    IUniswapV2Caller public constant uniswapV2Caller =
        IUniswapV2Caller(0x1CcFE8c40eF259566433716002E379dFfFbf5a3e);
    IFee public constant feeContract = IFee(0xfd6439AEfF9d2389856B7486b9e74a6DacaDcDCe);
    address public tokenForMarketingFee;
    address public gemAntiBot;
    bool public antiBotEnabled;
    uint8 private _decimals;
    address public baseTokenForPair;
    address public uniswapV2Router;
    address public uniswapV2Pair;

    bool private swapping;

    address public dividendTracker;

    address public rewardToken;

    uint256 public swapTokensAtAmount;

    uint16 public sellRewardFee;
    uint16 public buyRewardFee;

    uint16 public sellLiquidityFee;
    uint16 public buyLiquidityFee;

    uint16 public sellMarketingFee;
    uint16 public buyMarketingFee;

    address public _marketingWalletAddress;
    uint256 public gasForProcessing;

    uint256 public maxWallet;
    uint256 public maxTransactionAmount;
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public isExcludedFromMaxTransactionAmount;
    uint256 private _liquidityFeeTokens;
    uint256 private _marketingFeeTokens;

    mapping(address => bool) public automatedMarketMakerPairs;

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

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );
    event ExcludeFromFees(address indexed account, bool isExcluded);
    event UpdateSwapTokensAtAmount(uint256 newSwapTokensAtAmount, uint256 oldSwapTokensAtAmount);
    event SetAutomatedMarketMakerPair(address indexed pair, bool value);
    event UpdateMaxWallet(uint256 newMaxWallet, uint256 oldMaxWallet);
    event UpdateMaxTransactionAmount(uint256 newMaxTransactionAmount, uint256 oldMaxTransactionAmount);
    event LiquidityWalletUpdated(
        address indexed newLiquidityWallet,
        address indexed oldLiquidityWallet
    );
    event MarketingWalletUpdated(
        address indexed newMarketingWallet,
        address indexed oldMarketingWallet
    );
    event TokenForMarketingFeeUpdated(
        address indexed newTokenForMarketingFee,
        address indexed oldTokenForMarketingFee);
    event ExcludedFromMaxTransactionAmount(address indexed account, bool isExcluded);
    event GasForProcessingUpdated(
        uint256 indexed newValue,
        uint256 indexed oldValue
    );

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

    event SendDividends(uint256 tokensSwapped, uint256 amount);

    event ProcessedDividendTracker(
        uint256 iterations,
        uint256 claims,
        uint256 lastProcessedIndex,
        bool indexed automatic,
        uint256 gas,
        address indexed processor
    );
    event UpdateLiquidityFee(
        uint16 newSellLiquidityFee,
        uint16 newBuyLiquidityFee,
        uint16 oldSellLiquidityFee,
        uint16 oldBuyLiquidityFee
    );
    event UpdateMarketingFee(
        uint16 newSellMarketingFee,
        uint16 newBuyMarketingFee,
        uint16 oldSellMarketingFee,
        uint16 oldBuyMarketingFee
    );
    event UpdateRewardFee(
        uint16 newSellRewardFee,
        uint16 newBuyRewardFee,
        uint16 oldSellRewardFee,
        uint16 oldBuyRewardFee
    );   
    constructor(
        string memory name_,
        string memory symbol_,
        uint8 decimals_,
        uint256 totalSupply_,
        uint256 _maxWallet,
        uint256 _maxTransactionAmount,
        address[6] memory addrs, // reward, router, marketing wallet, lp wallet, dividendTracker
        uint16[6] memory feeSettings, // rewards, liquidity, marketing
        uint256 minimumTokenBalanceForDividends_,
        uint8 _tokenForMarketingFee
    ) payable ERC20(name_, symbol_) {
        feeContract.payFee{value: msg.value}(3);   
        _decimals = decimals_;
        rewardToken = addrs[0];
        _marketingWalletAddress = addrs[2];
        emit MarketingWalletUpdated(_marketingWalletAddress, address(0));
        gemAntiBot = addrs[5];
        IGemAntiBot(gemAntiBot).setTokenOwner(msg.sender);
        antiBotEnabled = true;
        baseTokenForPair=addrs[4];
        sellLiquidityFee = feeSettings[0];
        buyLiquidityFee = feeSettings[1];
        emit UpdateLiquidityFee(
            sellLiquidityFee,
            buyLiquidityFee,
            0,
            0
        );
        sellMarketingFee = feeSettings[2];
        buyMarketingFee = feeSettings[3];
        emit UpdateMarketingFee(
            sellMarketingFee,
            buyMarketingFee,
            0,
            0
        );
        sellRewardFee = feeSettings[4];
        buyRewardFee = feeSettings[5];
        emit UpdateRewardFee(
            sellRewardFee,
            buyRewardFee,
            0,
            0
        );  
        require(sellLiquidityFee+sellMarketingFee+sellRewardFee <= 200, "sell fee <= 20%");
        require(buyLiquidityFee+buyMarketingFee+buyRewardFee <= 200, "buy fee <= 20%");
        if(_tokenForMarketingFee==0){
            tokenForMarketingFee=address(this);
        }else if(_tokenForMarketingFee==1){
            tokenForMarketingFee=baseTokenForPair;
        }else{
            tokenForMarketingFee=rewardToken;
        }
        emit TokenForMarketingFeeUpdated(tokenForMarketingFee, address(0));
        swapTokensAtAmount = totalSupply_/(10000);
        emit UpdateSwapTokensAtAmount(swapTokensAtAmount, 0);
        gasForProcessing = 300000;
        emit GasForProcessingUpdated(gasForProcessing, 0);
        dividendTracker = payable(Clones.clone(addrs[3]));
        emit UpdateDividendTracker(
            dividendTracker,
            address(0)
        );
        DividendTokenDividendTracker(dividendTracker).initialize(
            rewardToken,
            minimumTokenBalanceForDividends_
        );
        require(_maxTransactionAmount>=totalSupply_ / 10000, "maxTransactionAmount >= total supply / 10000");
        require(_maxWallet>=totalSupply_ / 10000, "maxWallet >= total supply / 10000");
        maxWallet=_maxWallet;
        emit UpdateMaxWallet(maxWallet, 0);
        maxTransactionAmount=_maxTransactionAmount;
        emit UpdateMaxTransactionAmount(maxTransactionAmount, 0);
        uniswapV2Router = addrs[1];
        if(baseTokenForPair != IUniswapV2Router02(uniswapV2Router).WETH()){            
            IERC20(baseTokenForPair).approve(uniswapV2Router, MAX);            
        }
        _approve(address(this), address(uniswapV2Caller), MAX);
        _approve(address(this), uniswapV2Router, MAX);
        emit UpdateUniswapV2Router(
            uniswapV2Router,
            address(0)
        );
        uniswapV2Pair = IUniswapV2Factory(IUniswapV2Router02(uniswapV2Router).factory())
            .createPair(address(this), baseTokenForPair);
        _setAutomatedMarketMakerPair(uniswapV2Pair, true);

        DividendTokenDividendTracker(dividendTracker).excludeFromDividends(dividendTracker);
        DividendTokenDividendTracker(dividendTracker).excludeFromDividends(address(this));
        DividendTokenDividendTracker(dividendTracker).excludeFromDividends(owner());
        DividendTokenDividendTracker(dividendTracker).excludeFromDividends(address(0xdead));
        DividendTokenDividendTracker(dividendTracker).excludeFromDividends(uniswapV2Router);
        excludeFromFees(owner(), true);
        excludeFromFees(_marketingWalletAddress, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);   
        isExcludedFromMaxTransactionAmount[address(0xdead)]=true;
        isExcludedFromMaxTransactionAmount[address(this)]=true;
        isExcludedFromMaxTransactionAmount[_marketingWalletAddress]=true;
        isExcludedFromMaxTransactionAmount[owner()]=true;        
        _mint(owner(), totalSupply_);
    }

    receive() external payable {}
    function setUsingAntiBot(bool enabled_) external onlyOwner {
        antiBotEnabled = enabled_;
    }
    function setSwapTokensAtAmount(uint256 amount) external onlyOwner {
        require(amount > 0, "swapTokensAtAmount > 0");
        emit UpdateSwapTokensAtAmount(amount, swapTokensAtAmount);
        swapTokensAtAmount = amount; 
    }

    function updateMaxWallet(uint256 _maxWallet) external onlyOwner {
        require(_maxWallet>=totalSupply() / 10000, "maxWallet >= total supply / 10000");
        emit UpdateMaxWallet(_maxWallet, maxWallet);
        maxWallet = _maxWallet;
    }

    function updateMaxTransactionAmount(uint256 _maxTransactionAmount)
        external
        onlyOwner
    {
        require(_maxTransactionAmount>=totalSupply() / 10000, "maxTransactionAmount >= total supply / 10000");    
        emit UpdateMaxTransactionAmount(_maxTransactionAmount, maxTransactionAmount);
        maxTransactionAmount = _maxTransactionAmount;
    }   


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

        address newDividendTracker =payable(newAddress);

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

        DividendTokenDividendTracker(newDividendTracker).excludeFromDividends(newDividendTracker);
        DividendTokenDividendTracker(newDividendTracker).excludeFromDividends(address(this));
        DividendTokenDividendTracker(newDividendTracker).excludeFromDividends(owner());
        DividendTokenDividendTracker(newDividendTracker).excludeFromDividends(uniswapV2Router);
        DividendTokenDividendTracker(newDividendTracker).excludeFromDividends(uniswapV2Pair);

        emit UpdateDividendTracker(newAddress, dividendTracker);

        dividendTracker = newDividendTracker;
    }

    function updateUniswapV2Pair(address _baseTokenForPair) external onlyOwner
    {
        baseTokenForPair=_baseTokenForPair;
        uniswapV2Pair = IUniswapV2Factory(IUniswapV2Router02(uniswapV2Router).factory()).createPair(
            address(this),
            baseTokenForPair
        );
        if(baseTokenForPair != IUniswapV2Router02(uniswapV2Router).WETH()){            
            IERC20(baseTokenForPair).approve(uniswapV2Router, MAX);            
        }
        _setAutomatedMarketMakerPair(uniswapV2Pair, true);
    }
    function updateUniswapV2Router(address newAddress) public onlyOwner {
        require(
            newAddress != uniswapV2Router,
            "The router already has that address"
        );
        emit UpdateUniswapV2Router(newAddress, uniswapV2Router);
        uniswapV2Pair = IUniswapV2Factory(IUniswapV2Router02(newAddress).factory())
            .createPair(address(this), baseTokenForPair);
        uniswapV2Router = newAddress;
        if(baseTokenForPair != IUniswapV2Router02(uniswapV2Router).WETH()){            
            IERC20(baseTokenForPair).approve(uniswapV2Router, MAX);            
        }
        _approve(address(this), uniswapV2Router, MAX);
        if (!DividendTokenDividendTracker(dividendTracker).isExcludedFromDividends(uniswapV2Router))
            DividendTokenDividendTracker(dividendTracker).excludeFromDividends(uniswapV2Router);
        _setAutomatedMarketMakerPair(uniswapV2Pair, true);
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        require(_isExcludedFromFees[account] != excluded, "already");
        _isExcludedFromFees[account] = excluded;

        emit ExcludeFromFees(account, excluded);
    }

    function decimals() public view override returns (uint8) {
        return _decimals;
    }

    function setMarketingWallet(address payable wallet) external onlyOwner {
        require(_marketingWalletAddress!=wallet, "already");
        emit MarketingWalletUpdated(_marketingWalletAddress, wallet);
        _marketingWalletAddress = wallet;        
    }

    function updateTokenForMarketingFee(address _tokenForMarketingFee) external onlyOwner {
        require(tokenForMarketingFee!=_tokenForMarketingFee, "already");
        emit TokenForMarketingFeeUpdated(_tokenForMarketingFee, tokenForMarketingFee);
        tokenForMarketingFee = _tokenForMarketingFee; 
    }

    function updateLiquidityFee(
        uint16 _sellLiquidityFee,
        uint16 _buyLiquidityFee
    ) external onlyOwner {
        require(
            _sellLiquidityFee+sellMarketingFee+sellRewardFee <= 200,
            "sell fee <= 20%"
        );
        require(
            _buyLiquidityFee+buyMarketingFee+buyRewardFee <= 200,
            "buy fee <= 20%"
        );
        emit UpdateLiquidityFee(
            _sellLiquidityFee,
            _buyLiquidityFee,
            sellLiquidityFee,
            buyLiquidityFee
        );
        sellLiquidityFee = _sellLiquidityFee;
        buyLiquidityFee = _buyLiquidityFee;        
    }

    function updateMarketingFee(
        uint16 _sellMarketingFee,
        uint16 _buyMarketingFee
    ) external onlyOwner {
        require(
            _sellMarketingFee+sellLiquidityFee+sellRewardFee <= 200,
            "sell fee <= 20%"
        );
        require(
            _buyMarketingFee+buyLiquidityFee+buyRewardFee <= 200,
            "buy fee <= 20%"
        );     
        emit UpdateMarketingFee(
            _sellMarketingFee,
            _buyMarketingFee,
            sellMarketingFee,
            buyMarketingFee
        );  
        sellMarketingFee = _sellMarketingFee;
        buyMarketingFee = _buyMarketingFee;        
    }

    function updateRewardFee(
        uint16 _sellRewardFee,
        uint16 _buyRewardFee
    ) external onlyOwner {
        require(
            _sellRewardFee+(sellLiquidityFee)+(sellMarketingFee) <= 200,
            "sell fee <= 20%"
        );
        require(
            _buyRewardFee+(buyLiquidityFee)+(buyMarketingFee) <= 200,
            "buy fee <= 20%"
        );
        emit UpdateRewardFee(
            _sellRewardFee, 
            _buyRewardFee,
            sellRewardFee, 
            buyRewardFee);
        sellRewardFee = _sellRewardFee;
        buyRewardFee = _buyRewardFee;        
    }



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

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;
        isExcludedFromMaxTransactionAmount[pair] = value;
        if (value && !DividendTokenDividendTracker(dividendTracker).isExcludedFromDividends(pair)) {
            DividendTokenDividendTracker(dividendTracker).excludeFromDividends(pair);
        }
        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function excludeFromMaxTransactionAmount(address account, bool isEx)
        external
        onlyOwner
    {
        require(isExcludedFromMaxTransactionAmount[account]!=isEx, "already");
        isExcludedFromMaxTransactionAmount[account] = isEx;
        emit ExcludedFromMaxTransactionAmount(account, isEx);
    }

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

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

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

    function updateMinimumTokenBalanceForDividends(uint256 amount)
        external
        onlyOwner
    {
        DividendTokenDividendTracker(dividendTracker).updateMinimumTokenBalanceForDividends(amount);
    }

    function getMinimumTokenBalanceForDividends()
        external
        view
        returns (uint256)
    {
        return DividendTokenDividendTracker(dividendTracker).minimumTokenBalanceForDividends();
    }

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

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

    function withdrawableDividendOf(address account)
        public
        view
        returns (uint256)
    {
        return DividendTokenDividendTracker(dividendTracker).withdrawableDividendOf(account);
    }

    function dividendTokenBalanceOf(address account)
        public
        view
        returns (uint256)
    {
        return DividendTokenDividendTracker(dividendTracker).balanceOf(account);
    }

    function excludeFromDividends(address account) external onlyOwner {
        DividendTokenDividendTracker(dividendTracker).excludeFromDividends(account);
    }

    function isExcludedFromDividends(address account)
        public
        view
        returns (bool)
    {
        return DividendTokenDividendTracker(dividendTracker).isExcludedFromDividends(account);
    }

    function getAccountDividendsInfo(address account)
        external
        view
        returns (
            address,
            int256,
            int256,
            uint256,
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        return DividendTokenDividendTracker(dividendTracker).getAccount(account);
    }

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

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

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

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

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

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
        require(amount>0, "ERC20: transfer zero amount");
        if (!swapping && antiBotEnabled && !_isExcludedFromFees[from] && !_isExcludedFromFees[to]) {
            IGemAntiBot(gemAntiBot).onPreTransferCheck(from, to, amount);
        }  
        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            from != owner() &&
            to != owner()
        ) {
            swapping = true;
            if(_marketingFeeTokens>0)
                swapAndSendToFee(_marketingFeeTokens);
            if(_liquidityFeeTokens>0)
                swapAndLiquify(_liquidityFeeTokens);

            uint256 sellTokens = balanceOf(address(this));
            if(sellTokens>0)
                swapAndSendDividends(sellTokens);
            _marketingFeeTokens=0;
            _liquidityFeeTokens=0;
            swapping = false;
        }

        bool takeFee = !swapping;

        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }
        uint256 _liquidityFee;
        uint256 _marketingFee;
        uint256 _rewardFee;
        if (takeFee) {
            if (automatedMarketMakerPairs[from]) {
                _rewardFee = amount*(buyRewardFee)/(1000);
                _liquidityFee = amount*(buyLiquidityFee)/(1000);
                _marketingFee = amount*(buyMarketingFee)/(1000);
            }
            else if (automatedMarketMakerPairs[to]) {
                _rewardFee = amount*(sellRewardFee)/(1000);
                _liquidityFee = amount*(sellLiquidityFee)/(1000);
                _marketingFee = amount*(sellMarketingFee)/(1000);
            }
            _liquidityFeeTokens = _liquidityFeeTokens+_liquidityFee;
            _marketingFeeTokens = _marketingFeeTokens+_marketingFee;
            uint256 _feeTotal=_rewardFee+_liquidityFee+_marketingFee;
            amount=amount-(_feeTotal);
            if(_feeTotal>0)
                super._transfer(from, address(this), _feeTotal);
        }
        
        
        super._transfer(from, to, amount);

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

        if (!swapping) {
            if (!isExcludedFromMaxTransactionAmount[from]) {
                require(
                    amount < maxTransactionAmount,
                    "ERC20: exceeds transfer limit"
                );
            }
            if (!isExcludedFromMaxTransactionAmount[to]) {
                require(
                    balanceOf(to) < maxWallet,
                    "ERC20: exceeds max wallet limit"
                );
            }
            uint256 gas = gasForProcessing;

            try DividendTokenDividendTracker(dividendTracker).process(gas) returns (
                uint256 iterations,
                uint256 claims,
                uint256 lastProcessedIndex
            ) {
                emit ProcessedDividendTracker(
                    iterations,
                    claims,
                    lastProcessedIndex,
                    true,
                    gas,
                    msg.sender
                );
            } catch {}
        }
    }
    function swapAndSendToFee(uint256 tokens) private {
        if(tokenForMarketingFee==rewardToken){
            uint256 initialCAKEBalance = IERC20(rewardToken).balanceOf(
                address(this)
            );
            swapTokensForCake(tokens);
            uint256 newBalance = (IERC20(rewardToken).balanceOf(address(this)))-(
                initialCAKEBalance
            );
            IERC20(rewardToken).safeTransfer(_marketingWalletAddress, newBalance);
        }else if(tokenForMarketingFee==baseTokenForPair){
            uint256 initialBalance = baseTokenForPair==IUniswapV2Router02(uniswapV2Router).WETH() ? address(this).balance 
                : IERC20(baseTokenForPair).balanceOf(address(this));
            swapTokensForBaseToken(tokens);
            uint256 newBalance = baseTokenForPair==IUniswapV2Router02(uniswapV2Router).WETH() ? address(this).balance-initialBalance
                : IERC20(baseTokenForPair).balanceOf(address(this))-initialBalance;
            if(baseTokenForPair==IUniswapV2Router02(uniswapV2Router).WETH()){
                (bool success, )=address(_marketingWalletAddress).call{value: newBalance}("");              
            }else{
                IERC20(baseTokenForPair).safeTransfer(_marketingWalletAddress, newBalance);
            } 
        }else{
            _transfer(address(this), _marketingWalletAddress, tokens);
        }
        
    }
    function swapAndLiquify(uint256 tokens) private {
        uint256 half = tokens/(2);
        uint256 otherHalf = tokens-(half);

        uint256 initialBalance = baseTokenForPair==IUniswapV2Router02(uniswapV2Router).WETH() ? address(this).balance 
            : IERC20(baseTokenForPair).balanceOf(address(this));

        swapTokensForBaseToken(half); 
        uint256 newBalance = baseTokenForPair==IUniswapV2Router02(uniswapV2Router).WETH() ? address(this).balance-initialBalance
            : IERC20(baseTokenForPair).balanceOf(address(this))-initialBalance;

        addLiquidity(otherHalf, newBalance);

        emit SwapAndLiquify(half, newBalance, otherHalf);
    }

    function swapTokensForBaseToken(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = baseTokenForPair;

        if (path[1] == IUniswapV2Router02(uniswapV2Router).WETH()){
            IUniswapV2Router02(uniswapV2Router).swapExactTokensForETHSupportingFeeOnTransferTokens(
                tokenAmount,
                0, // accept any amount of BaseToken
                path,
                address(this),
                block.timestamp
            );
        }else{
            uniswapV2Caller.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                    uniswapV2Router,
                    tokenAmount,
                    0, // accept any amount of BaseToken
                    path,
                    block.timestamp
                );
        }
    }

    function swapTokensForCake(uint256 tokenAmount) private {
        if(baseTokenForPair!=rewardToken){
            address[] memory path = new address[](3);
            path[0] = address(this);
            path[1] = baseTokenForPair;
            path[2] = rewardToken;
            IUniswapV2Router02(uniswapV2Router).swapExactTokensForTokensSupportingFeeOnTransferTokens(
                tokenAmount,
                0,
                path,
                address(this),
                block.timestamp
            );
        }else{
            address[] memory path = new address[](2);
            path[0] = address(this);
            path[1] = rewardToken;
            uniswapV2Caller.swapExactTokensForTokensSupportingFeeOnTransferTokens(
                uniswapV2Router,
                tokenAmount,
                0, // accept any amount of BaseToken
                path,
                block.timestamp
            );            
        }
        
    }

    function addLiquidity(uint256 tokenAmount, uint256 baseTokenAmount) private {      
        if (baseTokenForPair == IUniswapV2Router02(uniswapV2Router).WETH()) 
            IUniswapV2Router02(uniswapV2Router).addLiquidityETH{value: baseTokenAmount}(
                address(this),
                tokenAmount,
                0, // slippage is unavoidable
                0, // slippage is unavoidable
                address(0xdead),
                block.timestamp
            );
        else{
            IUniswapV2Router02(uniswapV2Router).addLiquidity(
                address(this),
                baseTokenForPair,
                tokenAmount,
                baseTokenAmount,
                0,
                0,
                address(0xdead),
                block.timestamp
            );        
        }            
    }

    function swapAndSendDividends(uint256 tokens) private {
        swapTokensForCake(tokens);
        uint256 dividends = IERC20(rewardToken).balanceOf(address(this));
        IERC20(rewardToken).safeTransfer(
            dividendTracker,
            dividends
        );
        DividendTokenDividendTracker(dividendTracker).distributeCAKEDividends(dividends);
        emit SendDividends(tokens, dividends);
    }
    function withdrawETH() external onlyOwner {
        (bool success, )=address(owner()).call{value: address(this).balance}("");
        require(success, "Failed in withdrawal");
    }
    function withdrawToken(address token) external onlyOwner{
        require(address(this) != token, "Not allowed");
        IERC20(token).safeTransfer(owner(), IERC20(token).balanceOf(address(this)));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"totalSupply_","type":"uint256"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"},{"internalType":"uint256","name":"_maxTransactionAmount","type":"uint256"},{"internalType":"address[6]","name":"addrs","type":"address[6]"},{"internalType":"uint16[6]","name":"feeSettings","type":"uint16[6]"},{"internalType":"uint256","name":"minimumTokenBalanceForDividends_","type":"uint256"},{"internalType":"uint8","name":"_tokenForMarketingFee","type":"uint8"}],"stateMutability":"payable","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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludedFromMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"GasForProcessingUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newLiquidityWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldLiquidityWallet","type":"address"}],"name":"LiquidityWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMarketingWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldMarketingWallet","type":"address"}],"name":"MarketingWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"iterations","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claims","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastProcessedIndex","type":"uint256"},{"indexed":true,"internalType":"bool","name":"automatic","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gas","type":"uint256"},{"indexed":true,"internalType":"address","name":"processor","type":"address"}],"name":"ProcessedDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newTokenForMarketingFee","type":"address"},{"indexed":true,"internalType":"address","name":"oldTokenForMarketingFee","type":"address"}],"name":"TokenForMarketingFeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateDividendTracker","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newSellLiquidityFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"newBuyLiquidityFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldSellLiquidityFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldBuyLiquidityFee","type":"uint16"}],"name":"UpdateLiquidityFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newSellMarketingFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"newBuyMarketingFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldSellMarketingFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldBuyMarketingFee","type":"uint16"}],"name":"UpdateMarketingFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxTransactionAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMaxTransactionAmount","type":"uint256"}],"name":"UpdateMaxTransactionAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxWallet","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldMaxWallet","type":"uint256"}],"name":"UpdateMaxWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newSellRewardFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"newBuyRewardFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldSellRewardFee","type":"uint16"},{"indexed":false,"internalType":"uint16","name":"oldBuyRewardFee","type":"uint16"}],"name":"UpdateRewardFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSwapTokensAtAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldSwapTokensAtAmount","type":"uint256"}],"name":"UpdateSwapTokensAtAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"inputs":[],"name":"_marketingWalletAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"antiBotEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenForPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyRewardFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeContract","outputs":[{"internalType":"contract IFee","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasForProcessing","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gemAntiBot","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAccountDividendsInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getAccountDividendsInfoAtIndex","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"int256","name":"","type":"int256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimWait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessedIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimumTokenBalanceForDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromDividends","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"processDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellMarketingFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellRewardFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"wallet","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setSwapTokensAtAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled_","type":"bool"}],"name":"setUsingAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenForMarketingFee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Caller","outputs":[{"internalType":"contract IUniswapV2Caller","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimWait","type":"uint256"}],"name":"updateClaimWait","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateDividendTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"updateGasForProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellLiquidityFee","type":"uint16"},{"internalType":"uint16","name":"_buyLiquidityFee","type":"uint16"}],"name":"updateLiquidityFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellMarketingFee","type":"uint16"},{"internalType":"uint16","name":"_buyMarketingFee","type":"uint16"}],"name":"updateMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTransactionAmount","type":"uint256"}],"name":"updateMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"updateMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updateMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellRewardFee","type":"uint16"},{"internalType":"uint16","name":"_buyRewardFee","type":"uint16"}],"name":"updateRewardFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenForMarketingFee","type":"address"}],"name":"updateTokenForMarketingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_baseTokenForPair","type":"address"}],"name":"updateUniswapV2Pair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"updateUniswapV2Router","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260405162006ac938038062006ac9833981016040819052620000269162001644565b89896003620000368382620017b2565b506004620000458282620017b2565b505050620000626200005c62000e2160201b60201c565b62000e25565b604051636944d6f160e11b81526003600482015273fd6439aeff9d2389856b7486b9e74a6dacadcdce9063d289ade29034906024016000604051808303818588803b158015620000b157600080fd5b505af1158015620000c6573d6000803e3d6000fd5b50506007805460ff60a81b1916600160a81b60ff8e160217905550508451600c80546001600160a01b0319166001600160a01b03928316179055604080870151600e80546001600160601b03166c01000000000000000000000000928516830217908190559151600094509104909116907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc67908390a360a0840151600780546001600160a01b039092166001600160a01b0319909216821790556040516318e02bd960e01b81523360048201526318e02bd990602401600060405180830381600087803b158015620001b757600080fd5b505af1158015620001cc573d6000803e3d6000fd5b50506007805460ff60a01b1916600160a01b1790555050608084810151600880546001600160a01b0319166001600160a01b039092169190911790558351600e805460208088015163ffffffff60201b1990921661ffff94851664010000000090810261ffff60301b191691909117660100000000000093861684021793849055604080519185048616825292909304909316928201929092526000818301819052606082015290517f95c5c99557725e816faf752c6675d63483841c28a7a009ed792470a9cb4dea23929181900390910190a1604083810151600e805460608088015163ffffffff60401b1990921661ffff9485166801000000000000000090810261ffff60501b1916919091176a01000000000000000000009386168402179384905585519084048516815291909204909216602083015260008284018190529082015290517f1d6b62961d401d548eb1549c97109c0b905ccd7af9c3777d3076cc8438fdfe659181900360800190a1608083810151600e805460a087015161ffff93841663ffffffff19909216821762010000918516820290811793849055604080519186169093178152920490921660208201526000818301819052606082015290517f0a21d45dab14d5d2f53ae98d95d951cd627fcf1b5bc485174326568b5e0a4572929181900390910190a1600e5460c89061ffff80821691620003ee9168010000000000000000820481169164010000000090041662001894565b620003fa919062001894565b61ffff161115620004445760405162461bcd60e51b815260206004820152600f60248201526e73656c6c20666565203c3d2032302560881b60448201526064015b60405180910390fd5b600e5460c89061ffff6201000082048116916200047d916a01000000000000000000008204811691660100000000000090041662001894565b62000489919062001894565b61ffff161115620004ce5760405162461bcd60e51b815260206004820152600e60248201526d62757920666565203c3d2032302560901b60448201526064016200043b565b8060ff16600003620004f257600680546001600160a01b0319163017905562000549565b8060ff166001036200052657600854600680546001600160a01b0319166001600160a01b0390921691909117905562000549565b600c54600680546001600160a01b0319166001600160a01b039092169190911790555b6006546040516000916001600160a01b0316907fe2b5774aa87aa100c6ec40513e7bc1d6f3c22e7abfdcd1e87401c3c791bde9ae908390a36200058f61271088620018b9565b600d81905560408051918252600060208301527f1d3afd1a2942d06995fdb024306050a7b24ad00572be70ce8b1bea325780d28b910160405180910390a1620493e0600f819055604051600091907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db7908390a36200061f846003602002015162000e7760201b62002e061760201c565b600b80546001600160a01b0319166001600160a01b03929092169182179055604051600091907f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a8908390a3600b54600c5460405163cd6dc68760e01b81526001600160a01b0391821660048201526024810185905291169063cd6dc68790604401600060405180830381600087803b158015620006bb57600080fd5b505af1158015620006d0573d6000803e3d6000fd5b5050505061271087620006e49190620018b9565b8510156200074a5760405162461bcd60e51b815260206004820152602c60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c20737560448201526b070706c79202f2031303030360a41b60648201526084016200043b565b6200075861271088620018b9565b861015620007b35760405162461bcd60e51b815260206004820152602160248201527f6d617857616c6c6574203e3d20746f74616c20737570706c79202f20313030306044820152600360fc1b60648201526084016200043b565b601086905560408051878152600060208201527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1601185905560408051868152600060208201527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1602084810151600980546001600160a01b0319166001600160a01b039092169182179055604080516315ab88c960e31b81529051919263ad5c4648926004808401938290030181865afa1580156200088b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008b19190620018dc565b6008546001600160a01b03908116911614620009465760085460095460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af11580156200091e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000944919062001901565b505b6200096930731ccfe8c40ef259566433716002e379dfffbf5a3e60001962000f26565b600954620009859030906001600160a01b031660001962000f26565b6009546040516000916001600160a01b0316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e908390a3600960009054906101000a90046001600160a01b03166001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000a11573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a379190620018dc565b6008546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801562000a89573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000aaf9190620018dc565b600a80546001600160a01b0319166001600160a01b0392909216918217905562000adb9060016200104e565b600b5460405163031e79db60e41b81526001600160a01b0390911660048201819052906331e79db090602401600060405180830381600087803b15801562000b2257600080fd5b505af115801562000b37573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b15801562000b8157600080fd5b505af115801562000b96573d6000803e3d6000fd5b5050600b546001600160a01b031691506331e79db0905062000bc06005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801562000c0257600080fd5b505af115801562000c17573d6000803e3d6000fd5b5050600b5460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b15801562000c6357600080fd5b505af115801562000c78573d6000803e3d6000fd5b5050600b5460095460405163031e79db60e41b81526001600160a01b039182166004820152911692506331e79db09150602401600060405180830381600087803b15801562000cc657600080fd5b505af115801562000cdb573d6000803e3d6000fd5b5050505062000cfb62000cf36200125360201b60201c565b600162001262565b600e5462000d24906c0100000000000000000000000090046001600160a01b0316600162001262565b62000d3130600162001262565b62000d4061dead600162001262565b601360208190527f2264e2d7bacabe6058f5009f42467b9be28015e7760f87409562384c94ac271c805460ff19908116600190811790925530600090815260408082208054841685179055600e546c0100000000000000000000000090046001600160a01b0316825281208054909216831790915590919062000dcb6005546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905562000e1162000e0a6005546001600160a01b031690565b8862001373565b5050505050505050505062001941565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b03811662000f215760405162461bcd60e51b815260206004820152601660248201527f455243313136373a20637265617465206661696c65640000000000000000000060448201526064016200043b565b919050565b6001600160a01b03831662000f8a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016200043b565b6001600160a01b03821662000fed5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016200043b565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03821660009081526016602052604090205481151560ff909116151503620010e65760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c7565000000000000000060648201526084016200043b565b6001600160a01b038216600090815260166020908152604080832080548515801560ff19928316811790935560139094529190932080549091169092179091558190620011a15750600b5460405163c705c56960e01b81526001600160a01b0384811660048301529091169063c705c56990602401602060405180830381865afa15801562001179573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200119f919062001901565b155b156200120957600b5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b158015620011ef57600080fd5b505af115801562001204573d6000803e3d6000fd5b505050505b816001600160a01b03167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab8260405162001247911515815260200190565b60405180910390a25050565b6005546001600160a01b031690565b6005546001600160a01b03163314620012be5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016200043b565b6001600160a01b03821660009081526012602052604090205481151560ff9091161515036200131a5760405162461bcd60e51b8152602060048201526007602482015266616c726561647960c81b60448201526064016200043b565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910162001247565b6001600160a01b038216620013cb5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016200043b565b8060026000828254620013df919062001925565b90915550506001600160a01b038216600090815260208190526040812080548392906200140e90849062001925565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b60405160c081016001600160401b03811182821017156200149857620014986200145d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715620014c957620014c96200145d565b604052919050565b600082601f830112620014e357600080fd5b81516001600160401b03811115620014ff57620014ff6200145d565b602062001515601f8301601f191682016200149e565b82815285828487010111156200152a57600080fd5b60005b838110156200154a5785810183015182820184015282016200152d565b506000928101909101919091529392505050565b805160ff8116811462000f2157600080fd5b80516001600160a01b038116811462000f2157600080fd5b600082601f8301126200159a57600080fd5b620015a462001473565b8060c0840185811115620015b757600080fd5b845b81811015620015dc57620015cd8162001570565b845260209384019301620015b9565b509095945050505050565b600082601f830112620015f957600080fd5b6200160362001473565b8060c08401858111156200161657600080fd5b845b81811015620015dc57805161ffff81168114620016355760008081fd5b84526020938401930162001618565b6000806000806000806000806000806102808b8d0312156200166557600080fd5b8a516001600160401b03808211156200167d57600080fd5b6200168b8e838f01620014d1565b9b5060208d0151915080821115620016a257600080fd5b50620016b18d828e01620014d1565b995050620016c260408c016200155e565b975060608b0151965060808b0151955060a08b01519450620016e88c60c08d0162001588565b9350620016fa8c6101808d01620015e7565b92506102408b01519150620017136102608c016200155e565b90509295989b9194979a5092959850565b600181811c908216806200173957607f821691505b6020821081036200175a57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200145857600081815260208120601f850160051c81016020861015620017895750805b601f850160051c820191505b81811015620017aa5782815560010162001795565b505050505050565b81516001600160401b03811115620017ce57620017ce6200145d565b620017e681620017df845462001724565b8462001760565b602080601f8311600181146200181e5760008415620018055750858301515b600019600386901b1c1916600185901b178555620017aa565b600085815260208120601f198616915b828110156200184f578886015182559484019460019091019084016200182e565b50858210156200186e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b61ffff818116838216019080821115620018b257620018b26200187e565b5092915050565b600082620018d757634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215620018ef57600080fd5b620018fa8262001570565b9392505050565b6000602082840312156200191457600080fd5b81518015158114620018fa57600080fd5b808201808211156200193b576200193b6200187e565b92915050565b61517880620019516000396000f3fe6080604052600436106104145760003560e01c80638da5cb5b1161021e578063c8c8ebe411610123578063e9481eee116100ab578063f27fd2541161007a578063f27fd25414610d00578063f2fde38b14610d20578063f637434214610d40578063f7c618c114610d63578063f8b45b0514610d8357600080fd5b8063e9481eee14610c6e578063e98030c714610c9e578063f0a568c014610cbe578063f11a24d314610cde57600080fd5b8063dd62ed3e116100f2578063dd62ed3e14610bcd578063de0aad5314610c13578063e086e5ec14610c2e578063e2f4560514610c43578063e7841ec014610c5957600080fd5b8063c8c8ebe414610b56578063cf089e1314610b6c578063d68f8cde14610b8c578063d8c6404b14610bac57600080fd5b8063a8b9d240116101a6578063afa4f3b211610175578063afa4f3b214610ab1578063b62496f514610ad1578063bdd4f29f14610b01578063c024666814610b16578063c705c56914610b3657600080fd5b8063a8b9d240146109ec578063a9059cbb14610a0c578063aa49802314610a2c578063ad56c13c14610a4c57600080fd5b806395d89b41116101ed57806395d89b411461096c5780639a7a23d6146109815780639c1b8af5146109a1578063a26579ad146109b7578063a457c2d7146109cc57600080fd5b80638da5cb5b146108ec57806391c1004a1461090a578063921369131461092a578063948384dc1461094c57600080fd5b80634144d9e41161032457806370a08231116102ac5780637c75ad3a1161027b5780637c75ad3a146108445780637cf84bd71461086c578063871c128d1461088c57806388bdd9be146108ac57806389476069146108cc57600080fd5b806370a08231146107b7578063715018a6146107ed57806377ec7449146108025780637bce5a041461082257600080fd5b80635d098b38116102f35780635d098b381461072257806364b0f6531461074257806365b8dbc0146107575780636843cd8414610777578063700bb1911461079757600080fd5b80634144d9e41461068d57806349bd5a5e146106b45780634e71d92d146106d45780634fbee193146106e957600080fd5b806323b872dd116103a757806330bb4cff1161037657806330bb4cff146105ec578063313ce5671461060157806331e79db01461062d578063395093511461064d5780633ad3e6ff1461066d57600080fd5b806323b872dd1461056c5780632ae2f1211461058c5780632c1f5216146105ac5780632d5fd55a146105cc57600080fd5b80630dcb2e89116103e35780630dcb2e89146104eb5780631694505e1461050d57806318160ddd1461052d5780631c499ab01461054c57600080fd5b806306e297121461042057806306fdde0314610465578063095ea7b3146104875780630cfe2f3f146104b757600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b5061044873fd6439aeff9d2389856b7486b9e74a6dacadcdce81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561047157600080fd5b5061047a610d99565b60405161045c9190614ba4565b34801561049357600080fd5b506104a76104a2366004614bec565b610e2b565b604051901515815260200161045c565b3480156104c357600080fd5b50600e546104d89062010000900461ffff1681565b60405161ffff909116815260200161045c565b3480156104f757600080fd5b5061050b610506366004614c18565b610e45565b005b34801561051957600080fd5b50600954610448906001600160a01b031681565b34801561053957600080fd5b506002545b60405190815260200161045c565b34801561055857600080fd5b5061050b610567366004614c18565b610eda565b34801561057857600080fd5b506104a7610587366004614c31565b610fb5565b34801561059857600080fd5b5061050b6105a7366004614c80565b610fdb565b3480156105b857600080fd5b50600b54610448906001600160a01b031681565b3480156105d857600080fd5b5061050b6105e7366004614cb9565b6110a5565b3480156105f857600080fd5b5061053e6110ed565b34801561060d57600080fd5b50600754600160a81b900460ff1660405160ff909116815260200161045c565b34801561063957600080fd5b5061050b610648366004614cd6565b611160565b34801561065957600080fd5b506104a7610668366004614bec565b6111bc565b34801561067957600080fd5b50600654610448906001600160a01b031681565b34801561069957600080fd5b50600e5461044890600160601b90046001600160a01b031681565b3480156106c057600080fd5b50600a54610448906001600160a01b031681565b3480156106e057600080fd5b5061050b6111fb565b3480156106f557600080fd5b506104a7610704366004614cd6565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561072e57600080fd5b5061050b61073d366004614cd6565b611273565b34801561074e57600080fd5b5061053e61133f565b34801561076357600080fd5b5061050b610772366004614cd6565b611389565b34801561078357600080fd5b5061053e610792366004614cd6565b611754565b3480156107a357600080fd5b5061050b6107b2366004614c18565b6117c4565b3480156107c357600080fd5b5061053e6107d2366004614cd6565b6001600160a01b031660009081526020819052604090205490565b3480156107f957600080fd5b5061050b611896565b34801561080e57600080fd5b50600754610448906001600160a01b031681565b34801561082e57600080fd5b50600e546104d890600160501b900461ffff1681565b34801561085057600080fd5b50610448731ccfe8c40ef259566433716002e379dfffbf5a3e81565b34801561087857600080fd5b50600854610448906001600160a01b031681565b34801561089857600080fd5b5061050b6108a7366004614c18565b6118cc565b3480156108b857600080fd5b5061050b6108c7366004614cd6565b611a0e565b3480156108d857600080fd5b5061050b6108e7366004614cd6565b611df7565b3480156108f857600080fd5b506005546001600160a01b0316610448565b34801561091657600080fd5b5061050b610925366004614cd6565b611ef5565b34801561093657600080fd5b50600e546104d890600160401b900461ffff1681565b34801561095857600080fd5b5061050b610967366004614d05565b612143565b34801561097857600080fd5b5061047a612292565b34801561098d57600080fd5b5061050b61099c366004614c80565b6122a1565b3480156109ad57600080fd5b5061053e600f5481565b3480156109c357600080fd5b5061053e61235d565b3480156109d857600080fd5b506104a76109e7366004614bec565b6123a7565b3480156109f857600080fd5b5061053e610a07366004614cd6565b612444565b348015610a1857600080fd5b506104a7610a27366004614bec565b612477565b348015610a3857600080fd5b5061050b610a47366004614c18565b612485565b348015610a5857600080fd5b50610a6c610a67366004614cd6565b61256b565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161045c565b348015610abd57600080fd5b5061050b610acc366004614c18565b612606565b348015610add57600080fd5b506104a7610aec366004614cd6565b60166020526000908152604090205460ff1681565b348015610b0d57600080fd5b5061053e6126bb565b348015610b2257600080fd5b5061050b610b31366004614c80565b612705565b348015610b4257600080fd5b506104a7610b51366004614cd6565b6127c7565b348015610b6257600080fd5b5061053e60115481565b348015610b7857600080fd5b5061050b610b87366004614d05565b612836565b348015610b9857600080fd5b5061050b610ba7366004614d05565b61299a565b348015610bb857600080fd5b506007546104a790600160a01b900460ff1681565b348015610bd957600080fd5b5061053e610be8366004614d38565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610c1f57600080fd5b50600e546104d89061ffff1681565b348015610c3a57600080fd5b5061050b612afe565b348015610c4f57600080fd5b5061053e600d5481565b348015610c6557600080fd5b5061053e612bd3565b348015610c7a57600080fd5b506104a7610c89366004614cd6565b60136020526000908152604090205460ff1681565b348015610caa57600080fd5b5061050b610cb9366004614c18565b612c1d565b348015610cca57600080fd5b5061050b610cd9366004614cd6565b612c78565b348015610cea57600080fd5b50600e546104d890600160301b900461ffff1681565b348015610d0c57600080fd5b50610a6c610d1b366004614c18565b612d2c565b348015610d2c57600080fd5b5061050b610d3b366004614cd6565b612d6e565b348015610d4c57600080fd5b50600e546104d890640100000000900461ffff1681565b348015610d6f57600080fd5b50600c54610448906001600160a01b031681565b348015610d8f57600080fd5b5061053e60105481565b606060038054610da890614d66565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd490614d66565b8015610e215780601f10610df657610100808354040283529160200191610e21565b820191906000526020600020905b815481529060010190602001808311610e0457829003601f168201915b5050505050905090565b600033610e39818585612ea3565b60019150505b92915050565b6005546001600160a01b03163314610e785760405162461bcd60e51b8152600401610e6f90614da0565b60405180910390fd5b600b54604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e89906024015b600060405180830381600087803b158015610ebf57600080fd5b505af1158015610ed3573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610f045760405162461bcd60e51b8152600401610e6f90614da0565b612710610f1060025490565b610f1a9190614deb565b811015610f735760405162461bcd60e51b815260206004820152602160248201527f6d617857616c6c6574203e3d20746f74616c20737570706c79202f20313030306044820152600360fc1b6064820152608401610e6f565b6010546040805183815260208101929092527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1601055565b600033610fc3858285612fc7565b610fce858585613059565b60019150505b9392505050565b6005546001600160a01b031633146110055760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b03821660009081526013602052604090205481151560ff9091161515036110455760405162461bcd60e51b8152600401610e6f90614e0d565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527f82170bbd72c16b30c410014b7382121a699ed119a182e48a0b6cadcc89104ac991015b60405180910390a25050565b6005546001600160a01b031633146110cf5760405162461bcd60e51b8152600401610e6f90614da0565b60078054911515600160a01b0260ff60a01b19909216919091179055565b600b54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115b9190614e2e565b905090565b6005546001600160a01b0316331461118a5760405162461bcd60e51b8152600401610e6f90614da0565b600b5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401610ea5565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610e3990829086906111f6908790614e47565b612ea3565b600b5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561124c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112709190614e5a565b50565b6005546001600160a01b0316331461129d5760405162461bcd60e51b8152600401610e6f90614da0565b600e546001600160a01b03808316600160601b90920416036112d15760405162461bcd60e51b8152600401610e6f90614e0d565b600e546040516001600160a01b0380841692600160601b900416907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600e80546001600160a01b03909216600160601b026bffffffffffffffffffffffff909216919091179055565b600b54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b6005546001600160a01b031633146113b35760405162461bcd60e51b8152600401610e6f90614da0565b6009546001600160a01b039081169082160361141d5760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610e6f565b6009546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ba9190614e77565b6008546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801561150b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152f9190614e77565b600a80546001600160a01b039283166001600160a01b031991821617909155600980549284169290911682179055604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa158015611598573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bc9190614e77565b6008546001600160a01b0390811691161461164d5760085460095460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164b9190614e5a565b505b6009546116679030906001600160a01b0316600019612ea3565b600b5460095460405163c705c56960e01b81526001600160a01b03918216600482015291169063c705c56990602401602060405180830381865afa1580156116b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d79190614e5a565b61173d57600b5460095460405163031e79db60e41b81526001600160a01b0391821660048201529116906331e79db090602401600060405180830381600087803b15801561172457600080fd5b505af1158015611738573d6000803e3d6000fd5b505050505b600a54611270906001600160a01b031660016137bc565b600b546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa1580156117a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3f9190614e2e565b600b546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183b9190614e94565b604080518481526020810184905290810182905260608101889052929550909350915033906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146118c05760405162461bcd60e51b8152600401610e6f90614da0565b6118ca60006139ab565b565b6005546001600160a01b031633146118f65760405162461bcd60e51b8152600401610e6f90614da0565b62030d40811015801561190c57506207a1208111155b6119755760405162461bcd60e51b815260206004820152603460248201527f676173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b6064820152608401610e6f565b600f5481036119db5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610e6f565b600f5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3600f55565b6005546001600160a01b03163314611a385760405162461bcd60e51b8152600401610e6f90614da0565b600b546001600160a01b0390811690821603611aac5760405162461bcd60e51b815260206004820152602d60248201527f546865206469766964656e6420747261636b657220616c72656164792068617360448201526c2074686174206164647265737360981b6064820152608401610e6f565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1d9190614e77565b6001600160a01b031614611bad5760405162461bcd60e51b815260206004820152604b60248201527f546865206e6577206469766964656e6420747261636b6572206d75737420626560448201527f206f776e656420627920746865204449564944454e4544544f4b454e20746f6b60648201526a195b8818dbdb9d1c9858dd60aa1b608482015260a401610e6f565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611bef57600080fd5b505af1158015611c03573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611c4857600080fd5b505af1158015611c5c573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611c816005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611cc257600080fd5b505af1158015611cd6573d6000803e3d6000fd5b505060095460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611d2157600080fd5b505af1158015611d35573d6000803e3d6000fd5b5050600a5460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611d8057600080fd5b505af1158015611d94573d6000803e3d6000fd5b5050600b546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600b80546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b03163314611e215760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b0381163003611e675760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610e6f565b611270611e7c6005546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee49190614e2e565b6001600160a01b03841691906139fd565b6005546001600160a01b03163314611f1f5760405162461bcd60e51b8152600401610e6f90614da0565b600880546001600160a01b0319166001600160a01b03838116919091179091556009546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa158015611f81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa59190614e77565b6008546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015611ff6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201a9190614e77565b600a80546001600160a01b0319166001600160a01b03928316179055600954604080516315ab88c960e31b81529051919092169163ad5c46489160048083019260209291908290030181865afa158015612078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209c9190614e77565b6008546001600160a01b0390811691161461173d5760085460095460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015612107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212b9190614e5a565b50600a54611270906001600160a01b031660016137bc565b6005546001600160a01b0316331461216d5760405162461bcd60e51b8152600401610e6f90614da0565b600e5460c89061ffff600160401b8204811691612194916401000000009091041685614ec2565b61219e9190614ec2565b61ffff1611156121c05760405162461bcd60e51b8152600401610e6f90614ee4565b600e5460c89061ffff600160501b82048116916121e691600160301b9091041684614ec2565b6121f09190614ec2565b61ffff1611156122125760405162461bcd60e51b8152600401610e6f90614f0d565b600e546040805161ffff8581168252848116602083015280841682840152620100009093049092166060830152517f0a21d45dab14d5d2f53ae98d95d951cd627fcf1b5bc485174326568b5e0a45729181900360800190a1600e805461ffff928316620100000263ffffffff199091169290931691909117919091179055565b606060048054610da890614d66565b6005546001600160a01b031633146122cb5760405162461bcd60e51b8152600401610e6f90614da0565b600a546001600160a01b039081169083160361234f5760405162461bcd60e51b815260206004820152603e60248201527f546865206d61696e20706169722063616e6e6f742062652072656d6f7665642060448201527f66726f6d206175746f6d617465644d61726b65744d616b6572506169727300006064820152608401610e6f565b61235982826137bc565b5050565b600b5460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b3360008181526001602090815260408083206001600160a01b03871684529091528120549091908381101561242c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e6f565b6124398286868403612ea3565b506001949350505050565b600b546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611783565b600033610e39818585613059565b6005546001600160a01b031633146124af5760405162461bcd60e51b8152600401610e6f90614da0565b6127106124bb60025490565b6124c59190614deb565b8110156125295760405162461bcd60e51b815260206004820152602c60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c20737560448201526b070706c79202f2031303030360a41b6064820152608401610e6f565b6011546040805183815260208101929092527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1601155565b600b5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa1580156125c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125eb9190614f35565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146126305760405162461bcd60e51b8152600401610e6f90614da0565b600081116126795760405162461bcd60e51b8152602060048201526016602482015275073776170546f6b656e734174416d6f756e74203e20360541b6044820152606401610e6f565b600d546040805183815260208101929092527f1d3afd1a2942d06995fdb024306050a7b24ad00572be70ce8b1bea325780d28b910160405180910390a1600d55565b600b5460408051632f842d8560e21b815290516000926001600160a01b03169163be10b6149160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b6005546001600160a01b0316331461272f5760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b03821660009081526012602052604090205481151560ff90911615150361276f5760405162461bcd60e51b8152600401610e6f90614e0d565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611099565b600b5460405163c705c56960e01b81526001600160a01b038381166004830152600092169063c705c56990602401602060405180830381865afa158015612812573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3f9190614e5a565b6005546001600160a01b031633146128605760405162461bcd60e51b8152600401610e6f90614da0565b600e5460c89061ffff80821691612881916401000000009091041685614ec2565b61288b9190614ec2565b61ffff1611156128ad5760405162461bcd60e51b8152600401610e6f90614ee4565b600e5460c89061ffff6201000082048116916128d291600160301b9091041684614ec2565b6128dc9190614ec2565b61ffff1611156128fe5760405162461bcd60e51b8152600401610e6f90614f0d565b600e546040805161ffff85811682528481166020830152600160401b8404811682840152600160501b9093049092166060830152517f1d6b62961d401d548eb1549c97109c0b905ccd7af9c3777d3076cc8438fdfe659181900360800190a1600e80546bffffffff00000000000000001916600160401b61ffff9485160261ffff60501b191617600160501b9290931691909102919091179055565b6005546001600160a01b031633146129c45760405162461bcd60e51b8152600401610e6f90614da0565b600e5460c89061ffff808216916129e491600160401b9091041685614ec2565b6129ee9190614ec2565b61ffff161115612a105760405162461bcd60e51b8152600401610e6f90614ee4565b600e5460c89061ffff620100008204811691612a3591600160501b9091041684614ec2565b612a3f9190614ec2565b61ffff161115612a615760405162461bcd60e51b8152600401610e6f90614f0d565b600e546040805161ffff858116825284811660208301526401000000008404811682840152600160301b9093049092166060830152517f95c5c99557725e816faf752c6675d63483841c28a7a009ed792470a9cb4dea239181900360800190a1600e805467ffffffff00000000191664010000000061ffff9485160267ffff000000000000191617600160301b9290931691909102919091179055565b6005546001600160a01b03163314612b285760405162461bcd60e51b8152600401610e6f90614da0565b6000612b3c6005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114612b86576040519150601f19603f3d011682016040523d82523d6000602084013e612b8b565b606091505b50509050806112705760405162461bcd60e51b815260206004820152601460248201527311985a5b1959081a5b881dda5d1a191c985dd85b60621b6044820152606401610e6f565b600b546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b6005546001600160a01b03163314612c475760405162461bcd60e51b8152600401610e6f90614da0565b600b5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610ea5565b6005546001600160a01b03163314612ca25760405162461bcd60e51b8152600401610e6f90614da0565b6006546001600160a01b03808316911603612ccf5760405162461bcd60e51b8152600401610e6f90614e0d565b6006546040516001600160a01b03918216918316907fe2b5774aa87aa100c6ec40513e7bc1d6f3c22e7abfdcd1e87401c3c791bde9ae90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600b54604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016125a9565b6005546001600160a01b03163314612d985760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b038116612dfd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e6f565b611270816139ab565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116612e9e5760405162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b6044820152606401610e6f565b919050565b6001600160a01b038316612f055760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e6f565b6001600160a01b038216612f665760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e6f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461305357818110156130465760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e6f565b6130538484848403612ea3565b50505050565b6001600160a01b03831661307f5760405162461bcd60e51b8152600401610e6f90614f9f565b6001600160a01b0382166130a55760405162461bcd60e51b8152600401610e6f90614fe4565b600081116130f55760405162461bcd60e51b815260206004820152601b60248201527f45524332303a207472616e73666572207a65726f20616d6f756e7400000000006044820152606401610e6f565b600a54600160a01b900460ff161580156131185750600754600160a01b900460ff165b801561313d57506001600160a01b03831660009081526012602052604090205460ff16155b801561316257506001600160a01b03821660009081526012602052604090205460ff16155b156131d65760075460405163090ec10b60e31b81526001600160a01b03858116600483015284811660248301526044820184905290911690634876085890606401600060405180830381600087803b1580156131bd57600080fd5b505af11580156131d1573d6000803e3d6000fd5b505050505b30600090815260208190526040902054600d54811080159081906132045750600a54600160a01b900460ff16155b801561322957506001600160a01b03851660009081526016602052604090205460ff16155b801561324357506005546001600160a01b03868116911614155b801561325d57506005546001600160a01b03858116911614155b156132d357600a805460ff60a01b1916600160a01b1790556015541561328857613288601554613a54565b6014541561329b5761329b601454613edb565b3060009081526020819052604090205480156132ba576132ba81614160565b5060006015819055601455600a805460ff60a01b191690555b600a546001600160a01b03861660009081526012602052604090205460ff600160a01b90920482161591168061332157506001600160a01b03851660009081526012602052604090205460ff165b1561332a575060005b600080600083156134c4576001600160a01b03891660009081526016602052604090205460ff16156133d457600e546103e8906133719062010000900461ffff1689615027565b61337b9190614deb565b600e549091506103e89061339a90600160301b900461ffff1689615027565b6133a49190614deb565b600e549093506103e8906133c390600160501b900461ffff1689615027565b6133cd9190614deb565b915061346a565b6001600160a01b03881660009081526016602052604090205460ff161561346a57600e546103e89061340a9061ffff1689615027565b6134149190614deb565b600e549091506103e89061343490640100000000900461ffff1689615027565b61343e9190614deb565b600e549093506103e89061345d90600160401b900461ffff1689615027565b6134679190614deb565b91505b826014546134789190614e47565b601455601554613489908390614e47565b6015556000826134998584614e47565b6134a39190614e47565b90506134af818961503e565b975080156134c2576134c28a3083614292565b505b6134cf898989614292565b600b546001600160a01b031663e30443bc8a613500816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561354657600080fd5b505af1925050508015613557575060015b50600b546001600160a01b031663e30443bc89613589816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156135cf57600080fd5b505af19250505080156135e0575060015b50600a54600160a01b900460ff166137b1576001600160a01b03891660009081526013602052604090205460ff166136635760115487106136635760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2065786365656473207472616e73666572206c696d69740000006044820152606401610e6f565b6001600160a01b03881660009081526013602052604090205460ff166136ec576010546001600160a01b038916600090815260208190526040902054106136ec5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a2065786365656473206d61782077616c6c6574206c696d6974006044820152606401610e6f565b600f54600b546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613759575060408051601f3d908101601f1916820190925261375691810190614e94565b60015b156137af5760408051848152602081018490529081018290526060810185905233906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050505050565b6001600160a01b03821660009081526016602052604090205481151560ff9091161515036138525760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610e6f565b6001600160a01b038216600090815260166020908152604080832080548515801560ff199283168117909355601390945291909320805490911690921790915581906139095750600b5460405163c705c56960e01b81526001600160a01b0384811660048301529091169063c705c56990602401602060405180830381865afa1580156138e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139079190614e5a565b155b1561396e57600b5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561395557600080fd5b505af1158015613969573d6000803e3d6000fd5b505050505b816001600160a01b03167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab82604051611099911515815260200190565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613a4f9084906143e6565b505050565b600c546006546001600160a01b03918216911603613b8657600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad99190614e2e565b9050613ae4826144b8565b600c546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a0823190602401602060405180830381865afa158015613b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b559190614e2e565b613b5f919061503e565b600e54600c54919250613a4f916001600160a01b0390811691600160601b900416836139fd565b6008546006546001600160a01b03918216911603613ebc57600954604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c0c9190614e77565b6008546001600160a01b03908116911614613c92576008546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c8d9190614e2e565b613c94565b475b9050613c9f826146a5565b600954604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d0d9190614e77565b6008546001600160a01b03908116911614613d9d576008546040516370a0823160e01b815230600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa158015613d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d8e9190614e2e565b613d98919061503e565b613da7565b613da7824761503e565b9050600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e209190614e77565b6008546001600160a01b03918216911603613e9757600e54604051600091600160601b90046001600160a01b03169083908381818185875af1925050503d8060008114613e89576040519150601f19603f3d011682016040523d82523d6000602084013e613e8e565b606091505b50505050505050565b600e54600854613a4f916001600160a01b0391821691600160601b90910416836139fd565b600e54611270903090600160601b90046001600160a01b031683613059565b6000613ee8600283614deb565b90506000613ef6828461503e565b90506000600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f719190614e77565b6008546001600160a01b03908116911614613ff7576008546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ff29190614e2e565b613ff9565b475b9050614004836146a5565b600954604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa15801561404e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140729190614e77565b6008546001600160a01b03908116911614614102576008546040516370a0823160e01b815230600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa1580156140cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140f39190614e2e565b6140fd919061503e565b61410c565b61410c824761503e565b9050614118838261483e565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b614169816144b8565b600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156141b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d69190614e2e565b600b54600c549192506141f6916001600160a01b039081169116836139fd565b600b5460405163ba72a95560e01b8152600481018390526001600160a01b039091169063ba72a95590602401600060405180830381600087803b15801561423c57600080fd5b505af1158015614250573d6000803e3d6000fd5b505060408051858152602081018590527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a15050565b6001600160a01b0383166142b85760405162461bcd60e51b8152600401610e6f90614f9f565b6001600160a01b0382166142de5760405162461bcd60e51b8152600401610e6f90614fe4565b6001600160a01b038316600090815260208190526040902054818110156143565760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e6f565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061438d908490614e47565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516143d991815260200190565b60405180910390a3613053565b600061443b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166149ff9092919063ffffffff16565b805190915015613a4f57808060200190518101906144599190614e5a565b613a4f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610e6f565b600c546008546001600160a01b039081169116146145e5576040805160038082526080820190925260009160208201606080368337019050509050308160008151811061450757614507615051565b6001600160a01b03928316602091820292909201015260085482519116908290600190811061453857614538615051565b6001600160a01b039283166020918202929092010152600c5482519116908290600290811061456957614569615051565b6001600160a01b039283166020918202929092010152600954604051635c11d79560e01b8152911690635c11d795906145af9085906000908690309042906004016150ab565b600060405180830381600087803b1580156145c957600080fd5b505af11580156145dd573d6000803e3d6000fd5b505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061461a5761461a615051565b6001600160a01b039283166020918202929092010152600c5482519116908290600190811061464b5761464b615051565b6001600160a01b039283166020918202929092010152600954604051637274ca1b60e11b8152731ccfe8c40ef259566433716002e379dfffbf5a3e9263e4e99436926145af929116908690600090879042906004016150e7565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106146da576146da615051565b6001600160a01b03928316602091820292909201015260085482519116908290600190811061470b5761470b615051565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614764573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147889190614e77565b6001600160a01b0316816001815181106147a4576147a4615051565b60200260200101516001600160a01b0316036147f35760095460405163791ac94760e01b81526001600160a01b039091169063791ac947906145af9085906000908690309042906004016150ab565b600954604051637274ca1b60e11b8152731ccfe8c40ef259566433716002e379dfffbf5a3e9163e4e99436916145af916001600160a01b0316908690600090879042906004016150e7565b600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614891573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148b59190614e77565b6008546001600160a01b0391821691160361495d5760095460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015614938573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ed39190614e94565b60095460085460405162e8e33760e81b81523060048201526001600160a01b039182166024820152604481018590526064810184905260006084820181905260a482015261dead60c48201524260e482015291169063e8e3370090610104016060604051808303816000875af11580156149db573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed39190614e94565b6060614a0e8484600085614a16565b949350505050565b606082471015614a775760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610e6f565b6001600160a01b0385163b614ace5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e6f565b600080866001600160a01b03168587604051614aea9190615126565b60006040518083038185875af1925050503d8060008114614b27576040519150601f19603f3d011682016040523d82523d6000602084013e614b2c565b606091505b5091509150614b3c828286614b47565b979650505050505050565b60608315614b56575081610fd4565b825115614b665782518084602001fd5b8160405162461bcd60e51b8152600401610e6f9190614ba4565b60005b83811015614b9b578181015183820152602001614b83565b50506000910152565b6020815260008251806020840152614bc3816040850160208701614b80565b601f01601f19169190910160400192915050565b6001600160a01b038116811461127057600080fd5b60008060408385031215614bff57600080fd5b8235614c0a81614bd7565b946020939093013593505050565b600060208284031215614c2a57600080fd5b5035919050565b600080600060608486031215614c4657600080fd5b8335614c5181614bd7565b92506020840135614c6181614bd7565b929592945050506040919091013590565b801515811461127057600080fd5b60008060408385031215614c9357600080fd5b8235614c9e81614bd7565b91506020830135614cae81614c72565b809150509250929050565b600060208284031215614ccb57600080fd5b8135610fd481614c72565b600060208284031215614ce857600080fd5b8135610fd481614bd7565b803561ffff81168114612e9e57600080fd5b60008060408385031215614d1857600080fd5b614d2183614cf3565b9150614d2f60208401614cf3565b90509250929050565b60008060408385031215614d4b57600080fd5b8235614d5681614bd7565b91506020830135614cae81614bd7565b600181811c90821680614d7a57607f821691505b602082108103614d9a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082614e0857634e487b7160e01b600052601260045260246000fd5b500490565b602080825260079082015266616c726561647960c81b604082015260600190565b600060208284031215614e4057600080fd5b5051919050565b80820180821115610e3f57610e3f614dd5565b600060208284031215614e6c57600080fd5b8151610fd481614c72565b600060208284031215614e8957600080fd5b8151610fd481614bd7565b600080600060608486031215614ea957600080fd5b8351925060208401519150604084015190509250925092565b61ffff818116838216019080821115614edd57614edd614dd5565b5092915050565b6020808252600f908201526e73656c6c20666565203c3d2032302560881b604082015260600190565b6020808252600e908201526d62757920666565203c3d2032302560901b604082015260600190565b600080600080600080600080610100898b031215614f5257600080fd5b8851614f5d81614bd7565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8082028115828204841417610e3f57610e3f614dd5565b81810381811115610e3f57610e3f614dd5565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156150a05781516001600160a01b03168752958201959082019060010161507b565b509495945050505050565b85815284602082015260a0604082015260006150ca60a0830186615067565b6001600160a01b0394909416606083015250608001529392505050565b60018060a01b038616815284602082015283604082015260a06060820152600061511460a0830185615067565b90508260808301529695505050505050565b60008251615138818460208701614b80565b919091019291505056fea2646970667358221220aed8129ac5bee9795d0fb8c1d42daa497eee6c6ba191204e72d32ea6853c144364736f6c63430008120033000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000001dffeda047048bcb535dafec0e46449db53d671000000000000000000000000077f3cfe2e139c1d3b7950150923e8628e3e9733000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005d73f4b0d6e65323af1955c5f7ceb9a8fa2f3d8e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000a968163f0a57b4000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d4469676974616c2046696c65730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044449464900000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106104145760003560e01c80638da5cb5b1161021e578063c8c8ebe411610123578063e9481eee116100ab578063f27fd2541161007a578063f27fd25414610d00578063f2fde38b14610d20578063f637434214610d40578063f7c618c114610d63578063f8b45b0514610d8357600080fd5b8063e9481eee14610c6e578063e98030c714610c9e578063f0a568c014610cbe578063f11a24d314610cde57600080fd5b8063dd62ed3e116100f2578063dd62ed3e14610bcd578063de0aad5314610c13578063e086e5ec14610c2e578063e2f4560514610c43578063e7841ec014610c5957600080fd5b8063c8c8ebe414610b56578063cf089e1314610b6c578063d68f8cde14610b8c578063d8c6404b14610bac57600080fd5b8063a8b9d240116101a6578063afa4f3b211610175578063afa4f3b214610ab1578063b62496f514610ad1578063bdd4f29f14610b01578063c024666814610b16578063c705c56914610b3657600080fd5b8063a8b9d240146109ec578063a9059cbb14610a0c578063aa49802314610a2c578063ad56c13c14610a4c57600080fd5b806395d89b41116101ed57806395d89b411461096c5780639a7a23d6146109815780639c1b8af5146109a1578063a26579ad146109b7578063a457c2d7146109cc57600080fd5b80638da5cb5b146108ec57806391c1004a1461090a578063921369131461092a578063948384dc1461094c57600080fd5b80634144d9e41161032457806370a08231116102ac5780637c75ad3a1161027b5780637c75ad3a146108445780637cf84bd71461086c578063871c128d1461088c57806388bdd9be146108ac57806389476069146108cc57600080fd5b806370a08231146107b7578063715018a6146107ed57806377ec7449146108025780637bce5a041461082257600080fd5b80635d098b38116102f35780635d098b381461072257806364b0f6531461074257806365b8dbc0146107575780636843cd8414610777578063700bb1911461079757600080fd5b80634144d9e41461068d57806349bd5a5e146106b45780634e71d92d146106d45780634fbee193146106e957600080fd5b806323b872dd116103a757806330bb4cff1161037657806330bb4cff146105ec578063313ce5671461060157806331e79db01461062d578063395093511461064d5780633ad3e6ff1461066d57600080fd5b806323b872dd1461056c5780632ae2f1211461058c5780632c1f5216146105ac5780632d5fd55a146105cc57600080fd5b80630dcb2e89116103e35780630dcb2e89146104eb5780631694505e1461050d57806318160ddd1461052d5780631c499ab01461054c57600080fd5b806306e297121461042057806306fdde0314610465578063095ea7b3146104875780630cfe2f3f146104b757600080fd5b3661041b57005b600080fd5b34801561042c57600080fd5b5061044873fd6439aeff9d2389856b7486b9e74a6dacadcdce81565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561047157600080fd5b5061047a610d99565b60405161045c9190614ba4565b34801561049357600080fd5b506104a76104a2366004614bec565b610e2b565b604051901515815260200161045c565b3480156104c357600080fd5b50600e546104d89062010000900461ffff1681565b60405161ffff909116815260200161045c565b3480156104f757600080fd5b5061050b610506366004614c18565b610e45565b005b34801561051957600080fd5b50600954610448906001600160a01b031681565b34801561053957600080fd5b506002545b60405190815260200161045c565b34801561055857600080fd5b5061050b610567366004614c18565b610eda565b34801561057857600080fd5b506104a7610587366004614c31565b610fb5565b34801561059857600080fd5b5061050b6105a7366004614c80565b610fdb565b3480156105b857600080fd5b50600b54610448906001600160a01b031681565b3480156105d857600080fd5b5061050b6105e7366004614cb9565b6110a5565b3480156105f857600080fd5b5061053e6110ed565b34801561060d57600080fd5b50600754600160a81b900460ff1660405160ff909116815260200161045c565b34801561063957600080fd5b5061050b610648366004614cd6565b611160565b34801561065957600080fd5b506104a7610668366004614bec565b6111bc565b34801561067957600080fd5b50600654610448906001600160a01b031681565b34801561069957600080fd5b50600e5461044890600160601b90046001600160a01b031681565b3480156106c057600080fd5b50600a54610448906001600160a01b031681565b3480156106e057600080fd5b5061050b6111fb565b3480156106f557600080fd5b506104a7610704366004614cd6565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561072e57600080fd5b5061050b61073d366004614cd6565b611273565b34801561074e57600080fd5b5061053e61133f565b34801561076357600080fd5b5061050b610772366004614cd6565b611389565b34801561078357600080fd5b5061053e610792366004614cd6565b611754565b3480156107a357600080fd5b5061050b6107b2366004614c18565b6117c4565b3480156107c357600080fd5b5061053e6107d2366004614cd6565b6001600160a01b031660009081526020819052604090205490565b3480156107f957600080fd5b5061050b611896565b34801561080e57600080fd5b50600754610448906001600160a01b031681565b34801561082e57600080fd5b50600e546104d890600160501b900461ffff1681565b34801561085057600080fd5b50610448731ccfe8c40ef259566433716002e379dfffbf5a3e81565b34801561087857600080fd5b50600854610448906001600160a01b031681565b34801561089857600080fd5b5061050b6108a7366004614c18565b6118cc565b3480156108b857600080fd5b5061050b6108c7366004614cd6565b611a0e565b3480156108d857600080fd5b5061050b6108e7366004614cd6565b611df7565b3480156108f857600080fd5b506005546001600160a01b0316610448565b34801561091657600080fd5b5061050b610925366004614cd6565b611ef5565b34801561093657600080fd5b50600e546104d890600160401b900461ffff1681565b34801561095857600080fd5b5061050b610967366004614d05565b612143565b34801561097857600080fd5b5061047a612292565b34801561098d57600080fd5b5061050b61099c366004614c80565b6122a1565b3480156109ad57600080fd5b5061053e600f5481565b3480156109c357600080fd5b5061053e61235d565b3480156109d857600080fd5b506104a76109e7366004614bec565b6123a7565b3480156109f857600080fd5b5061053e610a07366004614cd6565b612444565b348015610a1857600080fd5b506104a7610a27366004614bec565b612477565b348015610a3857600080fd5b5061050b610a47366004614c18565b612485565b348015610a5857600080fd5b50610a6c610a67366004614cd6565b61256b565b604080516001600160a01b0390991689526020890197909752958701949094526060860192909252608085015260a084015260c083015260e08201526101000161045c565b348015610abd57600080fd5b5061050b610acc366004614c18565b612606565b348015610add57600080fd5b506104a7610aec366004614cd6565b60166020526000908152604090205460ff1681565b348015610b0d57600080fd5b5061053e6126bb565b348015610b2257600080fd5b5061050b610b31366004614c80565b612705565b348015610b4257600080fd5b506104a7610b51366004614cd6565b6127c7565b348015610b6257600080fd5b5061053e60115481565b348015610b7857600080fd5b5061050b610b87366004614d05565b612836565b348015610b9857600080fd5b5061050b610ba7366004614d05565b61299a565b348015610bb857600080fd5b506007546104a790600160a01b900460ff1681565b348015610bd957600080fd5b5061053e610be8366004614d38565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610c1f57600080fd5b50600e546104d89061ffff1681565b348015610c3a57600080fd5b5061050b612afe565b348015610c4f57600080fd5b5061053e600d5481565b348015610c6557600080fd5b5061053e612bd3565b348015610c7a57600080fd5b506104a7610c89366004614cd6565b60136020526000908152604090205460ff1681565b348015610caa57600080fd5b5061050b610cb9366004614c18565b612c1d565b348015610cca57600080fd5b5061050b610cd9366004614cd6565b612c78565b348015610cea57600080fd5b50600e546104d890600160301b900461ffff1681565b348015610d0c57600080fd5b50610a6c610d1b366004614c18565b612d2c565b348015610d2c57600080fd5b5061050b610d3b366004614cd6565b612d6e565b348015610d4c57600080fd5b50600e546104d890640100000000900461ffff1681565b348015610d6f57600080fd5b50600c54610448906001600160a01b031681565b348015610d8f57600080fd5b5061053e60105481565b606060038054610da890614d66565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd490614d66565b8015610e215780601f10610df657610100808354040283529160200191610e21565b820191906000526020600020905b815481529060010190602001808311610e0457829003601f168201915b5050505050905090565b600033610e39818585612ea3565b60019150505b92915050565b6005546001600160a01b03163314610e785760405162461bcd60e51b8152600401610e6f90614da0565b60405180910390fd5b600b54604051630dcb2e8960e01b8152600481018390526001600160a01b0390911690630dcb2e89906024015b600060405180830381600087803b158015610ebf57600080fd5b505af1158015610ed3573d6000803e3d6000fd5b5050505050565b6005546001600160a01b03163314610f045760405162461bcd60e51b8152600401610e6f90614da0565b612710610f1060025490565b610f1a9190614deb565b811015610f735760405162461bcd60e51b815260206004820152602160248201527f6d617857616c6c6574203e3d20746f74616c20737570706c79202f20313030306044820152600360fc1b6064820152608401610e6f565b6010546040805183815260208101929092527fff64d41f60feb77d52f64ae64a9fc3929d57a89d0cc55728762468bae5e0fe52910160405180910390a1601055565b600033610fc3858285612fc7565b610fce858585613059565b60019150505b9392505050565b6005546001600160a01b031633146110055760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b03821660009081526013602052604090205481151560ff9091161515036110455760405162461bcd60e51b8152600401610e6f90614e0d565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527f82170bbd72c16b30c410014b7382121a699ed119a182e48a0b6cadcc89104ac991015b60405180910390a25050565b6005546001600160a01b031633146110cf5760405162461bcd60e51b8152600401610e6f90614da0565b60078054911515600160a01b0260ff60a01b19909216919091179055565b600b54604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115b9190614e2e565b905090565b6005546001600160a01b0316331461118a5760405162461bcd60e51b8152600401610e6f90614da0565b600b5460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db090602401610ea5565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909190610e3990829086906111f6908790614e47565b612ea3565b600b5460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561124c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112709190614e5a565b50565b6005546001600160a01b0316331461129d5760405162461bcd60e51b8152600401610e6f90614da0565b600e546001600160a01b03808316600160601b90920416036112d15760405162461bcd60e51b8152600401610e6f90614e0d565b600e546040516001600160a01b0380841692600160601b900416907f8616c7a330e3cf61290821331585511f1e2778171e2b005fb5ec60cfe874dc6790600090a3600e80546001600160a01b03909216600160601b026bffffffffffffffffffffffff909216919091179055565b600b54604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b6005546001600160a01b031633146113b35760405162461bcd60e51b8152600401610e6f90614da0565b6009546001600160a01b039081169082160361141d5760405162461bcd60e51b815260206004820152602360248201527f54686520726f7574657220616c7265616479206861732074686174206164647260448201526265737360e81b6064820152608401610e6f565b6009546040516001600160a01b03918216918316907f8fc842bbd331dfa973645f4ed48b11683d501ebf1352708d77a5da2ab49a576e90600090a3806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015611496573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ba9190614e77565b6008546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801561150b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061152f9190614e77565b600a80546001600160a01b039283166001600160a01b031991821617909155600980549284169290911682179055604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa158015611598573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bc9190614e77565b6008546001600160a01b0390811691161461164d5760085460095460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611627573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164b9190614e5a565b505b6009546116679030906001600160a01b0316600019612ea3565b600b5460095460405163c705c56960e01b81526001600160a01b03918216600482015291169063c705c56990602401602060405180830381865afa1580156116b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d79190614e5a565b61173d57600b5460095460405163031e79db60e41b81526001600160a01b0391821660048201529116906331e79db090602401600060405180830381600087803b15801561172457600080fd5b505af1158015611738573d6000803e3d6000fd5b505050505b600a54611270906001600160a01b031660016137bc565b600b546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa1580156117a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3f9190614e2e565b600b546040516001624d3b8760e01b0319815260048101839052600091829182916001600160a01b03169063ffb2c479906024016060604051808303816000875af1158015611817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183b9190614e94565b604080518481526020810184905290810182905260608101889052929550909350915033906000907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a350505050565b6005546001600160a01b031633146118c05760405162461bcd60e51b8152600401610e6f90614da0565b6118ca60006139ab565b565b6005546001600160a01b031633146118f65760405162461bcd60e51b8152600401610e6f90614da0565b62030d40811015801561190c57506207a1208111155b6119755760405162461bcd60e51b815260206004820152603460248201527f676173466f7250726f63657373696e67206d757374206265206265747765656e6044820152730203230302c30303020616e64203530302c3030360641b6064820152608401610e6f565b600f5481036119db5760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f742075706461746520676173466f7250726f63657373696e67207460448201526b6f2073616d652076616c756560a01b6064820152608401610e6f565b600f5460405182907f40d7e40e79af4e8e5a9b3c57030d8ea93f13d669c06d448c4d631d4ae7d23db790600090a3600f55565b6005546001600160a01b03163314611a385760405162461bcd60e51b8152600401610e6f90614da0565b600b546001600160a01b0390811690821603611aac5760405162461bcd60e51b815260206004820152602d60248201527f546865206469766964656e6420747261636b657220616c72656164792068617360448201526c2074686174206164647265737360981b6064820152608401610e6f565b6000819050306001600160a01b0316816001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b1d9190614e77565b6001600160a01b031614611bad5760405162461bcd60e51b815260206004820152604b60248201527f546865206e6577206469766964656e6420747261636b6572206d75737420626560448201527f206f776e656420627920746865204449564944454e4544544f4b454e20746f6b60648201526a195b8818dbdb9d1c9858dd60aa1b608482015260a401610e6f565b60405163031e79db60e41b81526001600160a01b03821660048201819052906331e79db090602401600060405180830381600087803b158015611bef57600080fd5b505af1158015611c03573d6000803e3d6000fd5b505060405163031e79db60e41b81523060048201526001600160a01b03841692506331e79db09150602401600060405180830381600087803b158015611c4857600080fd5b505af1158015611c5c573d6000803e3d6000fd5b50505050806001600160a01b03166331e79db0611c816005546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015611cc257600080fd5b505af1158015611cd6573d6000803e3d6000fd5b505060095460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611d2157600080fd5b505af1158015611d35573d6000803e3d6000fd5b5050600a5460405163031e79db60e41b81526001600160a01b03918216600482015290841692506331e79db09150602401600060405180830381600087803b158015611d8057600080fd5b505af1158015611d94573d6000803e3d6000fd5b5050600b546040516001600160a01b03918216935090851691507f90c7d74461c613da5efa97d90740869367d74ab3aa5837aa4ae9a975f954b7a890600090a3600b80546001600160a01b0319166001600160a01b039290921691909117905550565b6005546001600160a01b03163314611e215760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b0381163003611e675760405162461bcd60e51b815260206004820152600b60248201526a139bdd08185b1b1bddd95960aa1b6044820152606401610e6f565b611270611e7c6005546001600160a01b031690565b6040516370a0823160e01b81523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611ec0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee49190614e2e565b6001600160a01b03841691906139fd565b6005546001600160a01b03163314611f1f5760405162461bcd60e51b8152600401610e6f90614da0565b600880546001600160a01b0319166001600160a01b03838116919091179091556009546040805163c45a015560e01b81529051919092169163c45a01559160048083019260209291908290030181865afa158015611f81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa59190614e77565b6008546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015611ff6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061201a9190614e77565b600a80546001600160a01b0319166001600160a01b03928316179055600954604080516315ab88c960e31b81529051919092169163ad5c46489160048083019260209291908290030181865afa158015612078573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209c9190614e77565b6008546001600160a01b0390811691161461173d5760085460095460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015612107573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061212b9190614e5a565b50600a54611270906001600160a01b031660016137bc565b6005546001600160a01b0316331461216d5760405162461bcd60e51b8152600401610e6f90614da0565b600e5460c89061ffff600160401b8204811691612194916401000000009091041685614ec2565b61219e9190614ec2565b61ffff1611156121c05760405162461bcd60e51b8152600401610e6f90614ee4565b600e5460c89061ffff600160501b82048116916121e691600160301b9091041684614ec2565b6121f09190614ec2565b61ffff1611156122125760405162461bcd60e51b8152600401610e6f90614f0d565b600e546040805161ffff8581168252848116602083015280841682840152620100009093049092166060830152517f0a21d45dab14d5d2f53ae98d95d951cd627fcf1b5bc485174326568b5e0a45729181900360800190a1600e805461ffff928316620100000263ffffffff199091169290931691909117919091179055565b606060048054610da890614d66565b6005546001600160a01b031633146122cb5760405162461bcd60e51b8152600401610e6f90614da0565b600a546001600160a01b039081169083160361234f5760405162461bcd60e51b815260206004820152603e60248201527f546865206d61696e20706169722063616e6e6f742062652072656d6f7665642060448201527f66726f6d206175746f6d617465644d61726b65744d616b6572506169727300006064820152608401610e6f565b61235982826137bc565b5050565b600b5460408051631bc9e27b60e21b815290516000926001600160a01b031691636f2789ec9160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b3360008181526001602090815260408083206001600160a01b03871684529091528120549091908381101561242c5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610e6f565b6124398286868403612ea3565b506001949350505050565b600b546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611783565b600033610e39818585613059565b6005546001600160a01b031633146124af5760405162461bcd60e51b8152600401610e6f90614da0565b6127106124bb60025490565b6124c59190614deb565b8110156125295760405162461bcd60e51b815260206004820152602c60248201527f6d61785472616e73616374696f6e416d6f756e74203e3d20746f74616c20737560448201526b070706c79202f2031303030360a41b6064820152608401610e6f565b6011546040805183815260208101929092527f35eec0711af6fbe3039535323be51b57996b6945b0d55862607c7a02e52e4507910160405180910390a1601155565b600b5460405163fbcbc0f160e01b81526001600160a01b038381166004830152600092839283928392839283928392839291169063fbcbc0f1906024015b61010060405180830381865afa1580156125c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125eb9190614f35565b97509750975097509750975097509750919395975091939597565b6005546001600160a01b031633146126305760405162461bcd60e51b8152600401610e6f90614da0565b600081116126795760405162461bcd60e51b8152602060048201526016602482015275073776170546f6b656e734174416d6f756e74203e20360541b6044820152606401610e6f565b600d546040805183815260208101929092527f1d3afd1a2942d06995fdb024306050a7b24ad00572be70ce8b1bea325780d28b910160405180910390a1600d55565b600b5460408051632f842d8560e21b815290516000926001600160a01b03169163be10b6149160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b6005546001600160a01b0316331461272f5760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b03821660009081526012602052604090205481151560ff90911615150361276f5760405162461bcd60e51b8152600401610e6f90614e0d565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df79101611099565b600b5460405163c705c56960e01b81526001600160a01b038381166004830152600092169063c705c56990602401602060405180830381865afa158015612812573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3f9190614e5a565b6005546001600160a01b031633146128605760405162461bcd60e51b8152600401610e6f90614da0565b600e5460c89061ffff80821691612881916401000000009091041685614ec2565b61288b9190614ec2565b61ffff1611156128ad5760405162461bcd60e51b8152600401610e6f90614ee4565b600e5460c89061ffff6201000082048116916128d291600160301b9091041684614ec2565b6128dc9190614ec2565b61ffff1611156128fe5760405162461bcd60e51b8152600401610e6f90614f0d565b600e546040805161ffff85811682528481166020830152600160401b8404811682840152600160501b9093049092166060830152517f1d6b62961d401d548eb1549c97109c0b905ccd7af9c3777d3076cc8438fdfe659181900360800190a1600e80546bffffffff00000000000000001916600160401b61ffff9485160261ffff60501b191617600160501b9290931691909102919091179055565b6005546001600160a01b031633146129c45760405162461bcd60e51b8152600401610e6f90614da0565b600e5460c89061ffff808216916129e491600160401b9091041685614ec2565b6129ee9190614ec2565b61ffff161115612a105760405162461bcd60e51b8152600401610e6f90614ee4565b600e5460c89061ffff620100008204811691612a3591600160501b9091041684614ec2565b612a3f9190614ec2565b61ffff161115612a615760405162461bcd60e51b8152600401610e6f90614f0d565b600e546040805161ffff858116825284811660208301526401000000008404811682840152600160301b9093049092166060830152517f95c5c99557725e816faf752c6675d63483841c28a7a009ed792470a9cb4dea239181900360800190a1600e805467ffffffff00000000191664010000000061ffff9485160267ffff000000000000191617600160301b9290931691909102919091179055565b6005546001600160a01b03163314612b285760405162461bcd60e51b8152600401610e6f90614da0565b6000612b3c6005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114612b86576040519150601f19603f3d011682016040523d82523d6000602084013e612b8b565b606091505b50509050806112705760405162461bcd60e51b815260206004820152601460248201527311985a5b1959081a5b881dda5d1a191c985dd85b60621b6044820152606401610e6f565b600b546040805163039e107b60e61b815290516000926001600160a01b03169163e7841ec09160048083019260209291908290030181865afa158015611137573d6000803e3d6000fd5b6005546001600160a01b03163314612c475760405162461bcd60e51b8152600401610e6f90614da0565b600b5460405163e98030c760e01b8152600481018390526001600160a01b039091169063e98030c790602401610ea5565b6005546001600160a01b03163314612ca25760405162461bcd60e51b8152600401610e6f90614da0565b6006546001600160a01b03808316911603612ccf5760405162461bcd60e51b8152600401610e6f90614e0d565b6006546040516001600160a01b03918216918316907fe2b5774aa87aa100c6ec40513e7bc1d6f3c22e7abfdcd1e87401c3c791bde9ae90600090a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b600b54604051635183d6fd60e01b81526004810183905260009182918291829182918291829182916001600160a01b0390911690635183d6fd906024016125a9565b6005546001600160a01b03163314612d985760405162461bcd60e51b8152600401610e6f90614da0565b6001600160a01b038116612dfd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e6f565b611270816139ab565b6000604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528260601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09150506001600160a01b038116612e9e5760405162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b6044820152606401610e6f565b919050565b6001600160a01b038316612f055760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610e6f565b6001600160a01b038216612f665760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610e6f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461305357818110156130465760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610e6f565b6130538484848403612ea3565b50505050565b6001600160a01b03831661307f5760405162461bcd60e51b8152600401610e6f90614f9f565b6001600160a01b0382166130a55760405162461bcd60e51b8152600401610e6f90614fe4565b600081116130f55760405162461bcd60e51b815260206004820152601b60248201527f45524332303a207472616e73666572207a65726f20616d6f756e7400000000006044820152606401610e6f565b600a54600160a01b900460ff161580156131185750600754600160a01b900460ff165b801561313d57506001600160a01b03831660009081526012602052604090205460ff16155b801561316257506001600160a01b03821660009081526012602052604090205460ff16155b156131d65760075460405163090ec10b60e31b81526001600160a01b03858116600483015284811660248301526044820184905290911690634876085890606401600060405180830381600087803b1580156131bd57600080fd5b505af11580156131d1573d6000803e3d6000fd5b505050505b30600090815260208190526040902054600d54811080159081906132045750600a54600160a01b900460ff16155b801561322957506001600160a01b03851660009081526016602052604090205460ff16155b801561324357506005546001600160a01b03868116911614155b801561325d57506005546001600160a01b03858116911614155b156132d357600a805460ff60a01b1916600160a01b1790556015541561328857613288601554613a54565b6014541561329b5761329b601454613edb565b3060009081526020819052604090205480156132ba576132ba81614160565b5060006015819055601455600a805460ff60a01b191690555b600a546001600160a01b03861660009081526012602052604090205460ff600160a01b90920482161591168061332157506001600160a01b03851660009081526012602052604090205460ff165b1561332a575060005b600080600083156134c4576001600160a01b03891660009081526016602052604090205460ff16156133d457600e546103e8906133719062010000900461ffff1689615027565b61337b9190614deb565b600e549091506103e89061339a90600160301b900461ffff1689615027565b6133a49190614deb565b600e549093506103e8906133c390600160501b900461ffff1689615027565b6133cd9190614deb565b915061346a565b6001600160a01b03881660009081526016602052604090205460ff161561346a57600e546103e89061340a9061ffff1689615027565b6134149190614deb565b600e549091506103e89061343490640100000000900461ffff1689615027565b61343e9190614deb565b600e549093506103e89061345d90600160401b900461ffff1689615027565b6134679190614deb565b91505b826014546134789190614e47565b601455601554613489908390614e47565b6015556000826134998584614e47565b6134a39190614e47565b90506134af818961503e565b975080156134c2576134c28a3083614292565b505b6134cf898989614292565b600b546001600160a01b031663e30443bc8a613500816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561354657600080fd5b505af1925050508015613557575060015b50600b546001600160a01b031663e30443bc89613589816001600160a01b031660009081526020819052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156135cf57600080fd5b505af19250505080156135e0575060015b50600a54600160a01b900460ff166137b1576001600160a01b03891660009081526013602052604090205460ff166136635760115487106136635760405162461bcd60e51b815260206004820152601d60248201527f45524332303a2065786365656473207472616e73666572206c696d69740000006044820152606401610e6f565b6001600160a01b03881660009081526013602052604090205460ff166136ec576010546001600160a01b038916600090815260208190526040902054106136ec5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a2065786365656473206d61782077616c6c6574206c696d6974006044820152606401610e6f565b600f54600b546040516001624d3b8760e01b03198152600481018390526001600160a01b039091169063ffb2c479906024016060604051808303816000875af1925050508015613759575060408051601f3d908101601f1916820190925261375691810190614e94565b60015b156137af5760408051848152602081018490529081018290526060810185905233906001907fc864333d6121033635ab41b29ae52f10a22cf4438c3e4f1c4c68518feb2f8a989060800160405180910390a35050505b505b505050505050505050565b6001600160a01b03821660009081526016602052604090205481151560ff9091161515036138525760405162461bcd60e51b815260206004820152603860248201527f4175746f6d61746564206d61726b6574206d616b65722070616972206973206160448201527f6c72656164792073657420746f20746861742076616c756500000000000000006064820152608401610e6f565b6001600160a01b038216600090815260166020908152604080832080548515801560ff199283168117909355601390945291909320805490911690921790915581906139095750600b5460405163c705c56960e01b81526001600160a01b0384811660048301529091169063c705c56990602401602060405180830381865afa1580156138e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139079190614e5a565b155b1561396e57600b5460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b15801561395557600080fd5b505af1158015613969573d6000803e3d6000fd5b505050505b816001600160a01b03167fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab82604051611099911515815260200190565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052613a4f9084906143e6565b505050565b600c546006546001600160a01b03918216911603613b8657600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613ab5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ad99190614e2e565b9050613ae4826144b8565b600c546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a0823190602401602060405180830381865afa158015613b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b559190614e2e565b613b5f919061503e565b600e54600c54919250613a4f916001600160a01b0390811691600160601b900416836139fd565b6008546006546001600160a01b03918216911603613ebc57600954604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c0c9190614e77565b6008546001600160a01b03908116911614613c92576008546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613c69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c8d9190614e2e565b613c94565b475b9050613c9f826146a5565b600954604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa158015613ce9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d0d9190614e77565b6008546001600160a01b03908116911614613d9d576008546040516370a0823160e01b815230600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa158015613d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d8e9190614e2e565b613d98919061503e565b613da7565b613da7824761503e565b9050600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613dfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e209190614e77565b6008546001600160a01b03918216911603613e9757600e54604051600091600160601b90046001600160a01b03169083908381818185875af1925050503d8060008114613e89576040519150601f19603f3d011682016040523d82523d6000602084013e613e8e565b606091505b50505050505050565b600e54600854613a4f916001600160a01b0391821691600160601b90910416836139fd565b600e54611270903090600160601b90046001600160a01b031683613059565b6000613ee8600283614deb565b90506000613ef6828461503e565b90506000600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f4d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f719190614e77565b6008546001600160a01b03908116911614613ff7576008546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015613fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ff29190614e2e565b613ff9565b475b9050614004836146a5565b600954604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c46489160048083019260209291908290030181865afa15801561404e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140729190614e77565b6008546001600160a01b03908116911614614102576008546040516370a0823160e01b815230600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa1580156140cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140f39190614e2e565b6140fd919061503e565b61410c565b61410c824761503e565b9050614118838261483e565b60408051858152602081018390529081018490527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050565b614169816144b8565b600c546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156141b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d69190614e2e565b600b54600c549192506141f6916001600160a01b039081169116836139fd565b600b5460405163ba72a95560e01b8152600481018390526001600160a01b039091169063ba72a95590602401600060405180830381600087803b15801561423c57600080fd5b505af1158015614250573d6000803e3d6000fd5b505060408051858152602081018590527f80195cc573b02cc48460cbca6e6e4cc85ddb91959d946e1c3025ea3d87942dc3935001905060405180910390a15050565b6001600160a01b0383166142b85760405162461bcd60e51b8152600401610e6f90614f9f565b6001600160a01b0382166142de5760405162461bcd60e51b8152600401610e6f90614fe4565b6001600160a01b038316600090815260208190526040902054818110156143565760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610e6f565b6001600160a01b0380851660009081526020819052604080822085850390559185168152908120805484929061438d908490614e47565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516143d991815260200190565b60405180910390a3613053565b600061443b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166149ff9092919063ffffffff16565b805190915015613a4f57808060200190518101906144599190614e5a565b613a4f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610e6f565b600c546008546001600160a01b039081169116146145e5576040805160038082526080820190925260009160208201606080368337019050509050308160008151811061450757614507615051565b6001600160a01b03928316602091820292909201015260085482519116908290600190811061453857614538615051565b6001600160a01b039283166020918202929092010152600c5482519116908290600290811061456957614569615051565b6001600160a01b039283166020918202929092010152600954604051635c11d79560e01b8152911690635c11d795906145af9085906000908690309042906004016150ab565b600060405180830381600087803b1580156145c957600080fd5b505af11580156145dd573d6000803e3d6000fd5b505050505050565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061461a5761461a615051565b6001600160a01b039283166020918202929092010152600c5482519116908290600190811061464b5761464b615051565b6001600160a01b039283166020918202929092010152600954604051637274ca1b60e11b8152731ccfe8c40ef259566433716002e379dfffbf5a3e9263e4e99436926145af929116908690600090879042906004016150e7565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106146da576146da615051565b6001600160a01b03928316602091820292909201015260085482519116908290600190811061470b5761470b615051565b6001600160a01b03928316602091820292909201810191909152600954604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614764573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147889190614e77565b6001600160a01b0316816001815181106147a4576147a4615051565b60200260200101516001600160a01b0316036147f35760095460405163791ac94760e01b81526001600160a01b039091169063791ac947906145af9085906000908690309042906004016150ab565b600954604051637274ca1b60e11b8152731ccfe8c40ef259566433716002e379dfffbf5a3e9163e4e99436916145af916001600160a01b0316908690600090879042906004016150e7565b600960009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015614891573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148b59190614e77565b6008546001600160a01b0391821691160361495d5760095460405163f305d71960e01b815230600482015260248101849052600060448201819052606482015261dead60848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015614938573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ed39190614e94565b60095460085460405162e8e33760e81b81523060048201526001600160a01b039182166024820152604481018590526064810184905260006084820181905260a482015261dead60c48201524260e482015291169063e8e3370090610104016060604051808303816000875af11580156149db573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ed39190614e94565b6060614a0e8484600085614a16565b949350505050565b606082471015614a775760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610e6f565b6001600160a01b0385163b614ace5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e6f565b600080866001600160a01b03168587604051614aea9190615126565b60006040518083038185875af1925050503d8060008114614b27576040519150601f19603f3d011682016040523d82523d6000602084013e614b2c565b606091505b5091509150614b3c828286614b47565b979650505050505050565b60608315614b56575081610fd4565b825115614b665782518084602001fd5b8160405162461bcd60e51b8152600401610e6f9190614ba4565b60005b83811015614b9b578181015183820152602001614b83565b50506000910152565b6020815260008251806020840152614bc3816040850160208701614b80565b601f01601f19169190910160400192915050565b6001600160a01b038116811461127057600080fd5b60008060408385031215614bff57600080fd5b8235614c0a81614bd7565b946020939093013593505050565b600060208284031215614c2a57600080fd5b5035919050565b600080600060608486031215614c4657600080fd5b8335614c5181614bd7565b92506020840135614c6181614bd7565b929592945050506040919091013590565b801515811461127057600080fd5b60008060408385031215614c9357600080fd5b8235614c9e81614bd7565b91506020830135614cae81614c72565b809150509250929050565b600060208284031215614ccb57600080fd5b8135610fd481614c72565b600060208284031215614ce857600080fd5b8135610fd481614bd7565b803561ffff81168114612e9e57600080fd5b60008060408385031215614d1857600080fd5b614d2183614cf3565b9150614d2f60208401614cf3565b90509250929050565b60008060408385031215614d4b57600080fd5b8235614d5681614bd7565b91506020830135614cae81614bd7565b600181811c90821680614d7a57607f821691505b602082108103614d9a57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082614e0857634e487b7160e01b600052601260045260246000fd5b500490565b602080825260079082015266616c726561647960c81b604082015260600190565b600060208284031215614e4057600080fd5b5051919050565b80820180821115610e3f57610e3f614dd5565b600060208284031215614e6c57600080fd5b8151610fd481614c72565b600060208284031215614e8957600080fd5b8151610fd481614bd7565b600080600060608486031215614ea957600080fd5b8351925060208401519150604084015190509250925092565b61ffff818116838216019080821115614edd57614edd614dd5565b5092915050565b6020808252600f908201526e73656c6c20666565203c3d2032302560881b604082015260600190565b6020808252600e908201526d62757920666565203c3d2032302560901b604082015260600190565b600080600080600080600080610100898b031215614f5257600080fd5b8851614f5d81614bd7565b809850506020890151965060408901519550606089015194506080890151935060a0890151925060c0890151915060e089015190509295985092959890939650565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b8082028115828204841417610e3f57610e3f614dd5565b81810381811115610e3f57610e3f614dd5565b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156150a05781516001600160a01b03168752958201959082019060010161507b565b509495945050505050565b85815284602082015260a0604082015260006150ca60a0830186615067565b6001600160a01b0394909416606083015250608001529392505050565b60018060a01b038616815284602082015283604082015260a06060820152600061511460a0830185615067565b90508260808301529695505050505050565b60008251615138818460208701614b80565b919091019291505056fea2646970667358221220aed8129ac5bee9795d0fb8c1d42daa497eee6c6ba191204e72d32ea6853c144364736f6c63430008120033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000028000000000000000000000000000000000000000000000000000000000000002c00000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000000000000000000000084595161401484a000000000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000001dffeda047048bcb535dafec0e46449db53d671000000000000000000000000077f3cfe2e139c1d3b7950150923e8628e3e9733000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005d73f4b0d6e65323af1955c5f7ceb9a8fa2f3d8e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000a968163f0a57b4000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000d4469676974616c2046696c65730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044449464900000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): Digital Files
Arg [1] : symbol_ (string): DIFI
Arg [2] : decimals_ (uint8): 18
Arg [3] : totalSupply_ (uint256): 10000000000000000000000000
Arg [4] : _maxWallet (uint256): 10000000000000000000000000
Arg [5] : _maxTransactionAmount (uint256): 10000000000000000000000000
Arg [6] : addrs (address[6]): 0xdAC17F958D2ee523a2206206994597C13D831ec7,0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D,0x01dFfEDa047048Bcb535dafeC0E46449db53D671,0x077f3CfE2E139c1D3B7950150923E8628e3e9733,0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2,0x5d73f4B0D6e65323af1955C5f7CEB9A8Fa2F3d8E
Arg [7] : feeSettings (uint16[6]): 0,0,20,10,20,20
Arg [8] : minimumTokenBalanceForDividends_ (uint256): 50000000000000000000000
Arg [9] : _tokenForMarketingFee (uint8): 1

-----Encoded View---------------
24 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [1] : 00000000000000000000000000000000000000000000000000000000000002c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [3] : 000000000000000000000000000000000000000000084595161401484a000000
Arg [4] : 000000000000000000000000000000000000000000084595161401484a000000
Arg [5] : 000000000000000000000000000000000000000000084595161401484a000000
Arg [6] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [7] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [8] : 00000000000000000000000001dffeda047048bcb535dafec0e46449db53d671
Arg [9] : 000000000000000000000000077f3cfe2e139c1d3b7950150923e8628e3e9733
Arg [10] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [11] : 0000000000000000000000005d73f4b0d6e65323af1955c5f7ceb9a8fa2f3d8e
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [15] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [18] : 000000000000000000000000000000000000000000000a968163f0a57b400000
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [20] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [21] : 4469676974616c2046696c657300000000000000000000000000000000000000
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [23] : 4449464900000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

95412:29699:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95680:83;;;;;;;;;;;;95720:42;95680:83;;;;;-1:-1:-1;;;;;191:32:1;;;173:51;;161:2;146:18;95680:83:0;;;;;;;;30575:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;32926:201::-;;;;;;;;;;-1:-1:-1;32926:201:0;;;;;:::i;:::-;;:::i;:::-;;;1512:14:1;;1505:22;1487:41;;1475:2;1460:18;32926:201:0;1347:187:1;96199:26:0;;;;;;;;;;-1:-1:-1;96199:26:0;;;;;;;;;;;;;;1713:6:1;1701:19;;;1683:38;;1671:2;1656:18;96199:26:0;1539:188:1;112281:215:0;;;;;;;;;;-1:-1:-1;112281:215:0;;;;;:::i;:::-;;:::i;:::-;;95945:30;;;;;;;;;;-1:-1:-1;95945:30:0;;;;-1:-1:-1;;;;;95945:30:0;;;31695:108;;;;;;;;;;-1:-1:-1;31783:12:0;;31695:108;;;2271:25:1;;;2259:2;2244:18;31695:108:0;2125:177:1;104076:249:0;;;;;;;;;;-1:-1:-1;104076:249:0;;;;;:::i;:::-;;:::i;33707:295::-;;;;;;;;;;-1:-1:-1;33707:295:0;;;;;:::i;:::-;;:::i;111167:323::-;;;;;;;;;;-1:-1:-1;111167:323:0;;;;;:::i;:::-;;:::i;96049:30::-;;;;;;;;;;-1:-1:-1;96049:30:0;;;;-1:-1:-1;;;;;96049:30:0;;;103722:103;;;;;;;;;;-1:-1:-1;103722:103:0;;;;;:::i;:::-;;:::i;112727:171::-;;;;;;;;;;;;;:::i;107576:92::-;;;;;;;;;;-1:-1:-1;107651:9:0;;-1:-1:-1;;;107651:9:0;;;;107576:92;;3696:4:1;3684:17;;;3666:36;;3654:2;3639:18;107576:92:0;3524:184:1;113471:160:0;;;;;;;;;;-1:-1:-1;113471:160:0;;;;;:::i;:::-;;:::i;34411:240::-;;;;;;;;;;-1:-1:-1;34411:240:0;;;;;:::i;:::-;;:::i;95770:35::-;;;;;;;;;;-1:-1:-1;95770:35:0;;;;-1:-1:-1;;;;;95770:35:0;;;96384:38;;;;;;;;;;-1:-1:-1;96384:38:0;;;;-1:-1:-1;;;96384:38:0;;-1:-1:-1;;;;;96384:38:0;;;95982:28;;;;;;;;;;-1:-1:-1;95982:28:0;;;;-1:-1:-1;;;;;95982:28:0;;;115097:133;;;;;;;;;;;;;:::i;112906:126::-;;;;;;;;;;-1:-1:-1;112906:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;112996:28:0;112972:4;112996:28;;;:19;:28;;;;;;;;;112906:126;107676:263;;;;;;;;;;-1:-1:-1;107676:263:0;;;;;:::i;:::-;;:::i;115406:172::-;;;;;;;;;;;;;:::i;106358:947::-;;;;;;;;;;-1:-1:-1;106358:947:0;;;;;:::i;:::-;;:::i;113262:201::-;;;;;;;;;;-1:-1:-1;113262:201:0;;;;;:::i;:::-;;:::i;114648:441::-;;;;;;;;;;-1:-1:-1;114648:441:0;;;;;:::i;:::-;;:::i;31866:127::-;;;;;;;;;;-1:-1:-1;31866:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;31967:18:0;31940:7;31967:18;;;;;;;;;;;;31866:127;59910:103;;;;;;;;;;;;;:::i;95812:25::-;;;;;;;;;;-1:-1:-1;95812:25:0;;;;-1:-1:-1;;;;;95812:25:0;;;96346:29;;;;;;;;;;-1:-1:-1;96346:29:0;;;;-1:-1:-1;;;96346:29:0;;;;;;95553:120;;;;;;;;;;;;95630:42;95553:120;;95907:31;;;;;;;;;;-1:-1:-1;95907:31:0;;;;-1:-1:-1;;;;;95907:31:0;;;111498:466;;;;;;;;;;-1:-1:-1;111498:466:0;;;;;:::i;:::-;;:::i;104721:1077::-;;;;;;;;;;-1:-1:-1;104721:1077:0;;;;;:::i;:::-;;:::i;124901:207::-;;;;;;;;;;-1:-1:-1;124901:207:0;;;;;:::i;:::-;;:::i;59259:87::-;;;;;;;;;;-1:-1:-1;59332:6:0;;-1:-1:-1;;;;;59332:6:0;59259:87;;105806:546;;;;;;;;;;-1:-1:-1;105806:546:0;;;;;:::i;:::-;;:::i;96309:30::-;;;;;;;;;;-1:-1:-1;96309:30:0;;;;-1:-1:-1;;;96309:30:0;;;;;;109606:622;;;;;;;;;;-1:-1:-1;109606:622:0;;;;;:::i;:::-;;:::i;30794:104::-;;;;;;;;;;;;;:::i;110240:309::-;;;;;;;;;;-1:-1:-1;110240:309:0;;;;;:::i;:::-;;:::i;96429:31::-;;;;;;;;;;;;;;;;112134:139;;;;;;;;;;;;;:::i;35154:438::-;;;;;;;;;;-1:-1:-1;35154:438:0;;;;;:::i;:::-;;:::i;113040:214::-;;;;;;;;;;-1:-1:-1;113040:214:0;;;;;:::i;:::-;;:::i;32199:193::-;;;;;;;;;;-1:-1:-1;32199:193:0;;;;;:::i;:::-;;:::i;104333:375::-;;;;;;;;;;-1:-1:-1;104333:375:0;;;;;:::i;:::-;;:::i;113860:381::-;;;;;;;;;;-1:-1:-1;113860:381:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;5240:32:1;;;5222:51;;5304:2;5289:18;;5282:34;;;;5332:18;;;5325:34;;;;5390:2;5375:18;;5368:34;;;;5433:3;5418:19;;5411:35;5260:3;5462:19;;5455:35;5521:3;5506:19;;5499:35;5565:3;5550:19;;5543:35;5209:3;5194:19;113860:381:0;4883:701:1;103831:237:0;;;;;;;;;;-1:-1:-1;103831:237:0;;;;;:::i;:::-;;:::i;96760:57::-;;;;;;;;;;-1:-1:-1;96760:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;112504:215;;;;;;;;;;;;;:::i;107313:255::-;;;;;;;;;;-1:-1:-1;107313:255:0;;;;;:::i;:::-;;:::i;113639:213::-;;;;;;;;;;-1:-1:-1;113639:213:0;;;;;:::i;:::-;;:::i;96500:35::-;;;;;;;;;;;;;;;;108933:665;;;;;;;;;;-1:-1:-1;108933:665:0;;;;;:::i;:::-;;:::i;108267:658::-;;;;;;;;;;-1:-1:-1;108267:658:0;;;;;:::i;:::-;;:::i;95844:26::-;;;;;;;;;;-1:-1:-1;95844:26:0;;;;-1:-1:-1;;;95844:26:0;;;;;;32455:151;;;;;;;;;;-1:-1:-1;32455:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;32571:18:0;;;32544:7;32571:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;32455:151;96165:27;;;;;;;;;;-1:-1:-1;96165:27:0;;;;;;;;124711:184;;;;;;;;;;;;;:::i;96123:33::-;;;;;;;;;;;;;;;;115238:160;;;;;;;;;;;;;:::i;96601:66::-;;;;;;;;;;-1:-1:-1;96601:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;111972:154;;;;;;;;;;-1:-1:-1;111972:154:0;;;;;:::i;:::-;;:::i;107947:312::-;;;;;;;;;;-1:-1:-1;107947:312:0;;;;;:::i;:::-;;:::i;96271:29::-;;;;;;;;;;-1:-1:-1;96271:29:0;;;;-1:-1:-1;;;96271:29:0;;;;;;114249:391;;;;;;;;;;-1:-1:-1;114249:391:0;;;;;:::i;:::-;;:::i;60168:201::-;;;;;;;;;;-1:-1:-1;60168:201:0;;;;;:::i;:::-;;:::i;96234:30::-;;;;;;;;;;-1:-1:-1;96234:30:0;;;;;;;;;;;96088:26;;;;;;;;;;-1:-1:-1;96088:26:0;;;;-1:-1:-1;;;;;96088:26:0;;;96469:24;;;;;;;;;;;;;;;;30575:100;30629:13;30662:5;30655:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30575:100;:::o;32926:201::-;33009:4;28463:10;33065:32;28463:10;33081:7;33090:6;33065:8;:32::i;:::-;33115:4;33108:11;;;32926:201;;;;;:::o;112281:215::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;;;;;;;;;112426:15:::1;::::0;112397:91:::1;::::0;-1:-1:-1;;;112397:91:0;;::::1;::::0;::::1;2271:25:1::0;;;-1:-1:-1;;;;;112426:15:0;;::::1;::::0;112397:83:::1;::::0;2244:18:1;;112397:91:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;112281:215:::0;:::o;104076:249::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;104187:5:::1;104171:13;31783:12:::0;;;31695:108;104171:13:::1;:21;;;;:::i;:::-;104159:10;:33;;104151:79;;;::::0;-1:-1:-1;;;104151:79:0;;7284:2:1;104151:79:0::1;::::0;::::1;7266:21:1::0;7323:2;7303:18;;;7296:30;7362:34;7342:18;;;7335:62;-1:-1:-1;;;7413:18:1;;;7406:31;7454:19;;104151:79:0::1;7082:397:1::0;104151:79:0::1;104274:9;::::0;104246:38:::1;::::0;;7658:25:1;;;7714:2;7699:18;;7692:34;;;;104246:38:0::1;::::0;7631:18:1;104246:38:0::1;;;;;;;104295:9;:22:::0;104076:249::o;33707:295::-;33838:4;28463:10;33896:38;33912:4;28463:10;33927:6;33896:15;:38::i;:::-;33945:27;33955:4;33961:2;33965:6;33945:9;:27::i;:::-;33990:4;33983:11;;;33707:295;;;;;;:::o;111167:323::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;111297:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;:49;::::1;;:43;::::0;;::::1;:49;;::::0;111289:69:::1;;;;-1:-1:-1::0;;;111289:69:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;111369:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;;;;:50;;-1:-1:-1;;111369:50:0::1;::::0;::::1;;::::0;;::::1;::::0;;;111435:47;;1487:41:1;;;111435:47:0::1;::::0;1460:18:1;111435:47:0::1;;;;;;;;111167:323:::0;;:::o;103722:103::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;103792:14:::1;:25:::0;;;::::1;;-1:-1:-1::0;;;103792:25:0::1;-1:-1:-1::0;;;;103792:25:0;;::::1;::::0;;;::::1;::::0;;103722:103::o;112727:171::-;112846:15;;112817:73;;;-1:-1:-1;;;112817:73:0;;;;112790:7;;-1:-1:-1;;;;;112846:15:0;;112817:71;;:73;;;;;;;;;;;;;;112846:15;112817:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;112810:80;;112727:171;:::o;113471:160::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;113577:15:::1;::::0;113548:75:::1;::::0;-1:-1:-1;;;113548:75:0;;-1:-1:-1;;;;;191:32:1;;;113548:75:0::1;::::0;::::1;173:51:1::0;113577:15:0;;::::1;::::0;113548:66:::1;::::0;146:18:1;;113548:75:0::1;14:216:1::0;34411:240:0;28463:10;34499:4;34580:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;34580:27:0;;;;;;;;;;34499:4;;28463:10;34555:66;;28463:10;;34580:27;;:40;;34610:10;;34580:40;:::i;:::-;34555:8;:66::i;115097:133::-;115163:15;;115134:88;;-1:-1:-1;;;115134:88:0;;115203:10;115134:88;;;8575:51:1;115163:15:0;8642:18:1;;;8635:50;-1:-1:-1;;;;;115163:15:0;;;;115134:60;;8548:18:1;;115134:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;115097:133::o;107676:263::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;107766:23:::1;::::0;-1:-1:-1;;;;;107766:31:0;;::::1;-1:-1:-1::0;;;107766:23:0;;::::1;;:31:::0;107758:51:::1;;;;-1:-1:-1::0;;;107758:51:0::1;;;;;;;:::i;:::-;107848:23;::::0;107825:55:::1;::::0;-1:-1:-1;;;;;107825:55:0;;::::1;::::0;-1:-1:-1;;;107848:23:0;::::1;;::::0;107825:55:::1;::::0;;;::::1;107891:23;:32:::0;;-1:-1:-1;;;;;107891:32:0;;::::1;-1:-1:-1::0;;;107891:32:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;107676:263::o;115406:172::-;115528:15;;115499:71;;;-1:-1:-1;;;115499:71:0;;;;115472:7;;-1:-1:-1;;;;;115528:15:0;;115499:69;;:71;;;;;;;;;;;;;;115528:15;115499:71;;;;;;;;;;;;;;106358:947;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;106473:15:::1;::::0;-1:-1:-1;;;;;106473:15:0;;::::1;106459:29:::0;;::::1;::::0;106437:114:::1;;;::::0;-1:-1:-1;;;106437:114:0;;9148:2:1;106437:114:0::1;::::0;::::1;9130:21:1::0;9187:2;9167:18;;;9160:30;9226:34;9206:18;;;9199:62;-1:-1:-1;;;9277:18:1;;;9270:33;9320:19;;106437:114:0::1;8946:399:1::0;106437:114:0::1;106601:15;::::0;106567:50:::1;::::0;-1:-1:-1;;;;;106601:15:0;;::::1;::::0;106567:50;::::1;::::0;::::1;::::0;106601:15:::1;::::0;106567:50:::1;106681:10;-1:-1:-1::0;;;;;106662:38:0::1;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106744:16;::::0;106644:117:::1;::::0;-1:-1:-1;;;106644:117:0;;106737:4:::1;106644:117;::::0;::::1;9818:34:1::0;-1:-1:-1;;;;;106744:16:0;;::::1;9868:18:1::0;;;9861:43;106644:84:0;::::1;::::0;::::1;::::0;9753:18:1;;106644:117:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106628:13;:133:::0;;-1:-1:-1;;;;;106628:133:0;;::::1;-1:-1:-1::0;;;;;;106628:133:0;;::::1;;::::0;;;106772:15:::1;:28:::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;106834:42:::1;::::0;;-1:-1:-1;;;106834:42:0;;;;:40:::1;::::0;:42:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;106772:28;106834:42:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106814:16;::::0;-1:-1:-1;;;;;106814:16:0;;::::1;:62:::0;::::1;;106811:171;;106911:16;::::0;106937:15:::1;::::0;106904:54:::1;::::0;-1:-1:-1;;;106904:54:0;;-1:-1:-1;;;;;106937:15:0;;::::1;106904:54;::::0;::::1;10089:51:1::0;-1:-1:-1;;10156:18:1;;;10149:34;106911:16:0;::::1;::::0;106904:32:::1;::::0;10062:18:1;;106904:54:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;106811:171;107016:15;::::0;106992:45:::1;::::0;107009:4:::1;::::0;-1:-1:-1;;;;;107016:15:0::1;-1:-1:-1::0;;106992:8:0::1;:45::i;:::-;107082:15;::::0;107123::::1;::::0;107053:86:::1;::::0;-1:-1:-1;;;107053:86:0;;-1:-1:-1;;;;;107123:15:0;;::::1;107053:86;::::0;::::1;173:51:1::0;107082:15:0;::::1;::::0;107053:69:::1;::::0;146:18:1;;107053:86:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;107048:189;;107183:15;::::0;107221::::1;::::0;107154:83:::1;::::0;-1:-1:-1;;;107154:83:0;;-1:-1:-1;;;;;107221:15:0;;::::1;107154:83;::::0;::::1;173:51:1::0;107183:15:0;::::1;::::0;107154:66:::1;::::0;146:18:1;;107154:83:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;107048:189;107277:13;::::0;107248:49:::1;::::0;-1:-1:-1;;;;;107277:13:0::1;::::0;107248:28:::1;:49::i;113262:201::-:0;113420:15;;113391:64;;-1:-1:-1;;;113391:64:0;;-1:-1:-1;;;;;191:32:1;;;113391:64:0;;;173:51:1;113359:7:0;;113420:15;;113391:55;;146:18:1;;113391:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;114648:441::-;114859:15;;114830:58;;-1:-1:-1;;;;;;114830:58:0;;;;;2271:25:1;;;114728:18:0;;;;;;-1:-1:-1;;;;;114859:15:0;;114830:53;;2244:18:1;;114830:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;114904:177;;;10736:25:1;;;10792:2;10777:18;;10770:34;;;10820:18;;;10813:34;;;10878:2;10863:18;;10856:34;;;114713:175:0;;-1:-1:-1;114713:175:0;;-1:-1:-1;114713:175:0;-1:-1:-1;115060:10:0;;115022:5;;114904:177;;10723:3:1;10708:19;114904:177:0;;;;;;;114702:387;;;114648:441;:::o;59910:103::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;59975:30:::1;60002:1;59975:18;:30::i;:::-;59910:103::o:0;111498:466::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;111610:6:::1;111598:8;:18;;:40;;;;;111632:6;111620:8;:18;;111598:40;111576:142;;;::::0;-1:-1:-1;;;111576:142:0;;11103:2:1;111576:142:0::1;::::0;::::1;11085:21:1::0;11142:2;11122:18;;;11115:30;11181:34;11161:18;;;11154:62;-1:-1:-1;;;11232:18:1;;;11225:50;11292:19;;111576:142:0::1;10901:416:1::0;111576:142:0::1;111763:16;;111751:8;:28:::0;111729:122:::1;;;::::0;-1:-1:-1;;;111729:122:0;;11524:2:1;111729:122:0::1;::::0;::::1;11506:21:1::0;11563:2;11543:18;;;11536:30;11602:34;11582:18;;;11575:62;-1:-1:-1;;;11653:18:1;;;11646:42;11705:19;;111729:122:0::1;11322:408:1::0;111729:122:0::1;111901:16;::::0;111867:51:::1;::::0;111891:8;;111867:51:::1;::::0;;;::::1;111929:16;:27:::0;111498:466::o;104721:1077::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;104836:15:::1;::::0;-1:-1:-1;;;;;104836:15:0;;::::1;104822:29:::0;;::::1;::::0;104800:124:::1;;;::::0;-1:-1:-1;;;104800:124:0;;11937:2:1;104800:124:0::1;::::0;::::1;11919:21:1::0;11976:2;11956:18;;;11949:30;12015:34;11995:18;;;11988:62;-1:-1:-1;;;12066:18:1;;;12059:43;12119:19;;104800:124:0::1;11735:409:1::0;104800:124:0::1;104937:26;104973:10;104937:47;;105087:4;-1:-1:-1::0;;;;;105019:73:0::1;105048:18;-1:-1:-1::0;;;;;105019:54:0::1;;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;105019:73:0::1;;104997:198;;;::::0;-1:-1:-1;;;104997:198:0;;12351:2:1;104997:198:0::1;::::0;::::1;12333:21:1::0;12390:2;12370:18;;;12363:30;12429:34;12409:18;;;12402:62;12500:34;12480:18;;;12473:62;-1:-1:-1;;;12551:19:1;;;12544:42;12603:19;;104997:198:0::1;12149:479:1::0;104997:198:0::1;105208:89;::::0;-1:-1:-1;;;105208:89:0;;-1:-1:-1;;;;;105208:69:0;::::1;:89;::::0;::::1;173:51:1::0;;;105208:69:0;::::1;::::0;146:18:1;;105208:89:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;105308:84:0::1;::::0;-1:-1:-1;;;105308:84:0;;105386:4:::1;105308:84;::::0;::::1;173:51:1::0;-1:-1:-1;;;;;105308:69:0;::::1;::::0;-1:-1:-1;105308:69:0::1;::::0;-1:-1:-1;146:18:1;;105308:84:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;105432:18;-1:-1:-1::0;;;;;105403:69:0::1;;105473:7;59332:6:::0;;-1:-1:-1;;;;;59332:6:0;;59259:87;105473:7:::1;105403:78;::::0;-1:-1:-1;;;;;;105403:78:0::1;::::0;;;;;;-1:-1:-1;;;;;191:32:1;;;105403:78:0::1;::::0;::::1;173:51:1::0;146:18;;105403:78:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;105562:15:0::1;::::0;105492:86:::1;::::0;-1:-1:-1;;;105492:86:0;;-1:-1:-1;;;;;105562:15:0;;::::1;105492:86;::::0;::::1;173:51:1::0;105492:69:0;;::::1;::::0;-1:-1:-1;105492:69:0::1;::::0;-1:-1:-1;146:18:1;;105492:86:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;105659:13:0::1;::::0;105589:84:::1;::::0;-1:-1:-1;;;105589:84:0;;-1:-1:-1;;;;;105659:13:0;;::::1;105589:84;::::0;::::1;173:51:1::0;105589:69:0;;::::1;::::0;-1:-1:-1;105589:69:0::1;::::0;-1:-1:-1;146:18:1;;105589:84:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;105725:15:0::1;::::0;105691:50:::1;::::0;-1:-1:-1;;;;;105725:15:0;;::::1;::::0;-1:-1:-1;105691:50:0;;::::1;::::0;-1:-1:-1;105691:50:0::1;::::0;105725:15:::1;::::0;105691:50:::1;105754:15;:36:::0;;-1:-1:-1;;;;;;105754:36:0::1;-1:-1:-1::0;;;;;105754:36:0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;104721:1077:0:o;124901:207::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;124976:22:0;::::1;124984:4;124976:22:::0;124968:46:::1;;;::::0;-1:-1:-1;;;124968:46:0;;12835:2:1;124968:46:0::1;::::0;::::1;12817:21:1::0;12874:2;12854:18;;;12847:30;-1:-1:-1;;;12893:18:1;;;12886:41;12944:18;;124968:46:0::1;12633:335:1::0;124968:46:0::1;125025:75;125052:7;59332:6:::0;;-1:-1:-1;;;;;59332:6:0;;59259:87;125052:7:::1;125061:38;::::0;-1:-1:-1;;;125061:38:0;;125093:4:::1;125061:38;::::0;::::1;173:51:1::0;-1:-1:-1;;;;;125061:23:0;::::1;::::0;::::1;::::0;146:18:1;;125061:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;125025:26:0;::::1;::::0;:75;:26:::1;:75::i;105806:546::-:0;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;105897:16:::1;:34:::0;;-1:-1:-1;;;;;;105897:34:0::1;-1:-1:-1::0;;;;;105897:34:0;;::::1;::::0;;;::::1;::::0;;;105995:15:::1;::::0;105976:45:::1;::::0;;-1:-1:-1;;;105976:45:0;;;;105995:15;;;::::1;::::0;105976:43:::1;::::0;:45:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;105995:15;105976:45:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106076:16;::::0;105958:145:::1;::::0;-1:-1:-1;;;105958:145:0;;106056:4:::1;105958:145;::::0;::::1;9818:34:1::0;-1:-1:-1;;;;;106076:16:0;;::::1;9868:18:1::0;;;9861:43;105958:75:0;::::1;::::0;::::1;::::0;9753:18:1;;105958:145:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;105942:13;:161:::0;;-1:-1:-1;;;;;;105942:161:0::1;-1:-1:-1::0;;;;;105942:161:0;;::::1;;::::0;;106156:15:::1;::::0;106137:42:::1;::::0;;-1:-1:-1;;;106137:42:0;;;;106156:15;;;::::1;::::0;106137:40:::1;::::0;:42:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;106156:15;106137:42:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;106117:16;::::0;-1:-1:-1;;;;;106117:16:0;;::::1;:62:::0;::::1;;106114:171;;106214:16;::::0;106240:15:::1;::::0;106207:54:::1;::::0;-1:-1:-1;;;106207:54:0;;-1:-1:-1;;;;;106240:15:0;;::::1;106207:54;::::0;::::1;10089:51:1::0;-1:-1:-1;;10156:18:1;;;10149:34;106214:16:0;::::1;::::0;106207:32:::1;::::0;10062:18:1;;106207:54:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;106324:13;::::0;106295:49:::1;::::0;-1:-1:-1;;;;;106324:13:0::1;::::0;106295:28:::1;:49::i;109606:622::-:0;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;109788:16:::1;::::0;109809:3:::1;::::0;109788:16:::1;-1:-1:-1::0;;;109788:16:0;::::1;::::0;::::1;::::0;109753:33:::1;::::0;109769:16;;;::::1;;109753:14:::0;:33:::1;:::i;:::-;:52;;;;:::i;:::-;:59;;;;109731:124;;;;-1:-1:-1::0;;;109731:124:0::1;;;;;;;:::i;:::-;109921:15;::::0;109941:3:::1;::::0;109921:15:::1;-1:-1:-1::0;;;109921:15:0;::::1;::::0;::::1;::::0;109888:31:::1;::::0;-1:-1:-1;;;109903:15:0;;::::1;;109888:13:::0;:31:::1;:::i;:::-;:49;;;;:::i;:::-;:56;;;;109866:120;;;;-1:-1:-1::0;;;109866:120:0::1;;;;;;;:::i;:::-;110090:13;::::0;110002:130:::1;::::0;;110090:13:::1;14099:15:1::0;;;14081:34;;14151:15;;;14146:2;14131:18;;14124:43;110090:13:0;;::::1;14183:18:1::0;;;14176:43;110119:12:0;;;::::1;::::0;;::::1;14250:2:1::0;14235:18;;14228:43;110002:130:0;::::1;::::0;;;;14043:3:1;110002:130:0;;::::1;110143:13;:30:::0;;::::1;110184:28:::0;;::::1;::::0;::::1;-1:-1:-1::0;;110184:28:0;;;110143:30;;;::::1;110184:28:::0;;;;;;;::::1;::::0;;109606:622::o;30794:104::-;30850:13;30883:7;30876:14;;;;;:::i;110240:309::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;110384:13:::1;::::0;-1:-1:-1;;;;;110384:13:0;;::::1;110376:21:::0;;::::1;::::0;110354:133:::1;;;::::0;-1:-1:-1;;;110354:133:0;;14484:2:1;110354:133:0::1;::::0;::::1;14466:21:1::0;14523:2;14503:18;;;14496:30;14562:34;14542:18;;;14535:62;14633:32;14613:18;;;14606:60;14683:19;;110354:133:0::1;14282:426:1::0;110354:133:0::1;110500:41;110529:4;110535:5;110500:28;:41::i;:::-;110240:309:::0;;:::o;112134:139::-;112237:15;;112208:57;;;-1:-1:-1;;;112208:57:0;;;;112181:7;;-1:-1:-1;;;;;112237:15:0;;112208:55;;:57;;;;;;;;;;;;;;112237:15;112208:57;;;;;;;;;;;;;;35154:438;28463:10;35247:4;35330:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;35330:27:0;;;;;;;;;;35247:4;;28463:10;35376:35;;;;35368:85;;;;-1:-1:-1;;;35368:85:0;;14915:2:1;35368:85:0;;;14897:21:1;14954:2;14934:18;;;14927:30;14993:34;14973:18;;;14966:62;-1:-1:-1;;;15044:18:1;;;15037:35;15089:19;;35368:85:0;14713:401:1;35368:85:0;35489:60;35498:5;35505:7;35533:15;35514:16;:34;35489:8;:60::i;:::-;-1:-1:-1;35580:4:0;;35154:438;-1:-1:-1;;;;35154:438:0:o;113040:214::-;113198:15;;113169:77;;-1:-1:-1;;;113169:77:0;;-1:-1:-1;;;;;191:32:1;;;113169:77:0;;;173:51:1;113137:7:0;;113198:15;;113169:68;;146:18:1;;113169:77:0;14:216:1;32199:193:0;32278:4;28463:10;32334:28;28463:10;32351:2;32355:6;32334:9;:28::i;104333:375::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;104500:5:::1;104484:13;31783:12:::0;;;31695:108;104484:13:::1;:21;;;;:::i;:::-;104461;:44;;104453:101;;;::::0;-1:-1:-1;;;104453:101:0;;15321:2:1;104453:101:0::1;::::0;::::1;15303:21:1::0;15360:2;15340:18;;;15333:30;15399:34;15379:18;;;15372:62;-1:-1:-1;;;15450:18:1;;;15443:42;15502:19;;104453:101:0::1;15119:408:1::0;104453:101:0::1;104624:20;::::0;104574:71:::1;::::0;;7658:25:1;;;7714:2;7699:18;;7692:34;;;;104574:71:0::1;::::0;7631:18:1;104574:71:0::1;;;;;;;104656:20;:44:::0;104333:375::o;113860:381::-;114197:15;;114168:65;;-1:-1:-1;;;114168:65:0;;-1:-1:-1;;;;;191:32:1;;;114168:65:0;;;173:51:1;113974:7:0;;;;;;;;;;;;;;;;114197:15;;;114168:56;;146:18:1;;114168:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;114161:72;;;;;;;;;;;;;;;;113860:381;;;;;;;;;:::o;103831:237::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;103925:1:::1;103916:6;:10;103908:45;;;::::0;-1:-1:-1;;;103908:45:0;;16420:2:1;103908:45:0::1;::::0;::::1;16402:21:1::0;16459:2;16439:18;;;16432:30;-1:-1:-1;;;16478:18:1;;;16471:52;16540:18;;103908:45:0::1;16218:346:1::0;103908:45:0::1;104002:18;::::0;103969:52:::1;::::0;;7658:25:1;;;7714:2;7699:18;;7692:34;;;;103969:52:0::1;::::0;7631:18:1;103969:52:0::1;;;;;;;104032:18;:27:::0;103831:237::o;112504:215::-;112661:15;;112632:79;;;-1:-1:-1;;;112632:79:0;;;;112600:7;;-1:-1:-1;;;;;112661:15:0;;112632:77;;:79;;;;;;;;;;;;;;112661:15;112632:79;;;;;;;;;;;;;;107313:255;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;107406:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;:40;::::1;;:28;::::0;;::::1;:40;;::::0;107398:60:::1;;;;-1:-1:-1::0;;;107398:60:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;107469:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;107469:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;107526:34;;1487:41:1;;;107526:34:0::1;::::0;1460:18:1;107526:34:0::1;1347:187:1::0;113639:213:0;113795:15;;113766:78;;-1:-1:-1;;;113766:78:0;;-1:-1:-1;;;;;191:32:1;;;113766:78:0;;;173:51:1;113737:4:0;;113795:15;;113766:69;;146:18:1;;113766:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;108933:665::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;109124:13:::1;::::0;109141:3:::1;::::0;109124:13:::1;::::0;;::::1;::::0;109089:34:::1;::::0;109107:16;;;::::1;;109089:17:::0;:34:::1;:::i;:::-;:48;;;;:::i;:::-;:55;;;;109067:120;;;;-1:-1:-1::0;;;109067:120:0::1;;;;;;;:::i;:::-;109253:12;::::0;109269:3:::1;::::0;109253:12:::1;::::0;;::::1;::::0;::::1;::::0;109220:32:::1;::::0;-1:-1:-1;;;109237:15:0;;::::1;;109220:16:::0;:32:::1;:::i;:::-;:45;;;;:::i;:::-;:52;;;;109198:116;;;;-1:-1:-1::0;;;109198:116:0::1;;;;;;;:::i;:::-;109431:16;::::0;109335:153:::1;::::0;;109431:16:::1;14099:15:1::0;;;14081:34;;14151:15;;;14146:2;14131:18;;14124:43;-1:-1:-1;;;109431:16:0;::::1;::::0;::::1;14183:18:1::0;;;14176:43;-1:-1:-1;;;109462:15:0;;::::1;::::0;;::::1;14250:2:1::0;14235:18;;14228:43;109335:153:0;::::1;::::0;;;;14043:3:1;109335:153:0;;::::1;109501:16;:36:::0;;-1:-1:-1;;109548:34:0;-1:-1:-1;;;109501:36:0::1;::::0;;::::1;;-1:-1:-1::0;;;;109548:34:0;;-1:-1:-1;;;109548:34:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;108933:665::o;108267:658::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;108458:13:::1;::::0;108475:3:::1;::::0;108458:13:::1;::::0;;::::1;::::0;108423:34:::1;::::0;-1:-1:-1;;;108441:16:0;;::::1;;108423:17:::0;:34:::1;:::i;:::-;:48;;;;:::i;:::-;:55;;;;108401:120;;;;-1:-1:-1::0;;;108401:120:0::1;;;;;;;:::i;:::-;108587:12;::::0;108603:3:::1;::::0;108587:12:::1;::::0;;::::1;::::0;::::1;::::0;108554:32:::1;::::0;-1:-1:-1;;;108571:15:0;;::::1;;108554:16:::0;:32:::1;:::i;:::-;:45;;;;:::i;:::-;:52;;;;108532:116;;;;-1:-1:-1::0;;;108532:116:0::1;;;;;;;:::i;:::-;108760:16;::::0;108664:153:::1;::::0;;108760:16:::1;14099:15:1::0;;;14081:34;;14151:15;;;14146:2;14131:18;;14124:43;108760:16:0;;::::1;::::0;::::1;14183:18:1::0;;;14176:43;-1:-1:-1;;;108791:15:0;;::::1;::::0;;::::1;14250:2:1::0;14235:18;;14228:43;108664:153:0;::::1;::::0;;;;14043:3:1;108664:153:0;;::::1;108828:16;:36:::0;;-1:-1:-1;;108875:34:0;108828:36;::::1;::::0;;::::1;;-1:-1:-1::0;;108875:34:0;;-1:-1:-1;;;108875:34:0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;108267:658::o;124711:184::-;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;124765:12:::1;124789:7;59332:6:::0;;-1:-1:-1;;;;;59332:6:0;;59259:87;124789:7:::1;-1:-1:-1::0;;;;;124781:21:0::1;124810;124781:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;124764:72;;;124855:7;124847:40;;;::::0;-1:-1:-1;;;124847:40:0;;16981:2:1;124847:40:0::1;::::0;::::1;16963:21:1::0;17020:2;17000:18;;;16993:30;-1:-1:-1;;;17039:18:1;;;17032:50;17099:18;;124847:40:0::1;16779:344:1::0;115238:160:0;115350:15;;115321:69;;;-1:-1:-1;;;115321:69:0;;;;115294:7;;-1:-1:-1;;;;;115350:15:0;;115321:67;;:69;;;;;;;;;;;;;;115350:15;115321:69;;;;;;;;;;;;;;111972:154;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;112075:15:::1;::::0;112046:72:::1;::::0;-1:-1:-1;;;112046:72:0;;::::1;::::0;::::1;2271:25:1::0;;;-1:-1:-1;;;;;112075:15:0;;::::1;::::0;112046:61:::1;::::0;2244:18:1;;112046:72:0::1;2125:177:1::0;107947:312:0;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;108052:20:::1;::::0;-1:-1:-1;;;;;108052:43:0;;::::1;:20:::0;::::1;:43:::0;108044:63:::1;;;;-1:-1:-1::0;;;108044:63:0::1;;;;;;;:::i;:::-;108174:20;::::0;108123:72:::1;::::0;-1:-1:-1;;;;;108174:20:0;;::::1;::::0;108123:72;::::1;::::0;::::1;::::0;108174:20:::1;::::0;108123:72:::1;108206:20;:44:::0;;-1:-1:-1;;;;;;108206:44:0::1;-1:-1:-1::0;;;;;108206:44:0;;;::::1;::::0;;;::::1;::::0;;107947:312::o;114249:391::-;114591:15;;114562:70;;-1:-1:-1;;;114562:70:0;;;;;2271:25:1;;;114368:7:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;114591:15:0;;;;114562:63;;2244:18:1;;114562:70:0;2125:177:1;60168:201:0;59332:6;;-1:-1:-1;;;;;59332:6:0;28463:10;59479:23;59471:68;;;;-1:-1:-1;;;59471:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60257:22:0;::::1;60249:73;;;::::0;-1:-1:-1;;;60249:73:0;;17330:2:1;60249:73:0::1;::::0;::::1;17312:21:1::0;17369:2;17349:18;;;17342:30;17408:34;17388:18;;;17381:62;-1:-1:-1;;;17459:18:1;;;17452:36;17505:19;;60249:73:0::1;17128:402:1::0;60249:73:0::1;60333:28;60352:8;60333:18;:28::i;286:524::-:0;343:16;413:4;407:11;-1:-1:-1;;;439:3:0;432:79;558:14;552:4;548:25;541:4;536:3;532:14;525:49;-1:-1:-1;;;604:4:0;599:3;595:14;588:90;719:4;714:3;711:1;704:20;692:32;-1:-1:-1;;;;;;;753:22:0;;745:57;;;;-1:-1:-1;;;745:57:0;;17737:2:1;745:57:0;;;17719:21:1;17776:2;17756:18;;;17749:30;-1:-1:-1;;;17795:18:1;;;17788:52;17857:18;;745:57:0;17535:346:1;745:57:0;286:524;;;:::o;38790:380::-;-1:-1:-1;;;;;38926:19:0;;38918:68;;;;-1:-1:-1;;;38918:68:0;;18088:2:1;38918:68:0;;;18070:21:1;18127:2;18107:18;;;18100:30;18166:34;18146:18;;;18139:62;-1:-1:-1;;;18217:18:1;;;18210:34;18261:19;;38918:68:0;17886:400:1;38918:68:0;-1:-1:-1;;;;;39005:21:0;;38997:68;;;;-1:-1:-1;;;38997:68:0;;18493:2:1;38997:68:0;;;18475:21:1;18532:2;18512:18;;;18505:30;18571:34;18551:18;;;18544:62;-1:-1:-1;;;18622:18:1;;;18615:32;18664:19;;38997:68:0;18291:398:1;38997:68:0;-1:-1:-1;;;;;39078:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;39130:32;;2271:25:1;;;39130:32:0;;2244:18:1;39130:32:0;;;;;;;38790:380;;;:::o;39457:453::-;-1:-1:-1;;;;;32571:18:0;;;39592:24;32571:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;39659:37:0;;39655:248;;39741:6;39721:16;:26;;39713:68;;;;-1:-1:-1;;;39713:68:0;;18896:2:1;39713:68:0;;;18878:21:1;18935:2;18915:18;;;18908:30;18974:31;18954:18;;;18947:59;19023:18;;39713:68:0;18694:353:1;39713:68:0;39825:51;39834:5;39841:7;39869:6;39850:16;:25;39825:8;:51::i;:::-;39581:329;39457:453;;;:::o;115586:3816::-;-1:-1:-1;;;;;115718:18:0;;115710:68;;;;-1:-1:-1;;;115710:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;115797:16:0;;115789:64;;;;-1:-1:-1;;;115789:64:0;;;;;;;:::i;:::-;115879:1;115872:6;:8;115864:48;;;;-1:-1:-1;;;115864:48:0;;20064:2:1;115864:48:0;;;20046:21:1;20103:2;20083:18;;;20076:30;20142:29;20122:18;;;20115:57;20189:18;;115864:48:0;19862:351:1;115864:48:0;115928:8;;-1:-1:-1;;;115928:8:0;;;;115927:9;:27;;;;-1:-1:-1;115940:14:0;;-1:-1:-1;;;115940:14:0;;;;115927:27;:57;;;;-1:-1:-1;;;;;;115959:25:0;;;;;;:19;:25;;;;;;;;115958:26;115927:57;:85;;;;-1:-1:-1;;;;;;115989:23:0;;;;;;:19;:23;;;;;;;;115988:24;115927:85;115923:178;;;116041:10;;116029:60;;-1:-1:-1;;;116029:60:0;;-1:-1:-1;;;;;20476:15:1;;;116029:60:0;;;20458:34:1;20528:15;;;20508:18;;;20501:43;20560:18;;;20553:34;;;116041:10:0;;;;116029:42;;20393:18:1;;116029:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;115923:178;116162:4;116113:28;31967:18;;;;;;;;;;;116220;;116196:42;;;;;;;116269:33;;-1:-1:-1;116294:8:0;;-1:-1:-1;;;116294:8:0;;;;116293:9;116269:33;:82;;;;-1:-1:-1;;;;;;116320:31:0;;;;;;:25;:31;;;;;;;;116319:32;116269:82;:114;;;;-1:-1:-1;59332:6:0;;-1:-1:-1;;;;;116368:15:0;;;59332:6;;116368:15;;116269:114;:144;;;;-1:-1:-1;59332:6:0;;-1:-1:-1;;;;;116400:13:0;;;59332:6;;116400:13;;116269:144;116251:650;;;116440:8;:15;;-1:-1:-1;;;;116440:15:0;-1:-1:-1;;;116440:15:0;;;116473:19;;:21;116470:80;;116513:37;116530:19;;116513:16;:37::i;:::-;116568:19;;:21;116565:78;;116608:35;116623:19;;116608:14;:35::i;:::-;116699:4;116660:18;31967;;;;;;;;;;;116723:12;;116720:66;;116754:32;116775:10;116754:20;:32::i;:::-;-1:-1:-1;116821:1:0;116801:19;:21;;;116837:19;:21;116873:8;:16;;-1:-1:-1;;;;116873:16:0;;;116251:650;116929:8;;-1:-1:-1;;;;;116954:25:0;;116913:12;116954:25;;;:19;:25;;;;;;116929:8;-1:-1:-1;;;116929:8:0;;;;;116928:9;;116954:25;;:52;;-1:-1:-1;;;;;;116983:23:0;;;;;;:19;:23;;;;;;;;116954:52;116950:100;;;-1:-1:-1;117033:5:0;116950:100;117060:21;117092;117124:18;117157:7;117153:895;;;-1:-1:-1;;;;;117185:31:0;;;;;;:25;:31;;;;;;;;117181:510;;;117258:12;;117273:4;;117250:21;;117258:12;;;;;117250:6;:21;:::i;:::-;:28;;;;:::i;:::-;117321:15;;117237:41;;-1:-1:-1;117339:4:0;;117313:24;;-1:-1:-1;;;117321:15:0;;;;117313:6;:24;:::i;:::-;:31;;;;:::i;:::-;117387:15;;117297:47;;-1:-1:-1;117405:4:0;;117379:24;;-1:-1:-1;;;117387:15:0;;;;117379:6;:24;:::i;:::-;:31;;;;:::i;:::-;117363:47;;117181:510;;;-1:-1:-1;;;;;117449:29:0;;;;;;:25;:29;;;;;;;;117445:246;;;117520:13;;117536:4;;117512:22;;117520:13;;117512:6;:22;:::i;:::-;:29;;;;:::i;:::-;117584:16;;117499:42;;-1:-1:-1;117603:4:0;;117576:25;;117584:16;;;;;117576:6;:25;:::i;:::-;:32;;;;:::i;:::-;117651:16;;117560:48;;-1:-1:-1;117670:4:0;;117643:25;;-1:-1:-1;;;117651:16:0;;;;117643:6;:25;:::i;:::-;:32;;;;:::i;:::-;117627:48;;117445:246;117747:13;117727:19;;:33;;;;:::i;:::-;117705:19;:55;117797:19;;:33;;117817:13;;117797:33;:::i;:::-;117775:19;:55;117845:17;117888:13;117863:24;117874:13;117863:10;:24;:::i;:::-;:38;;;;:::i;:::-;117845:56;-1:-1:-1;117923:18:0;117845:56;117923:6;:18;:::i;:::-;117916:25;-1:-1:-1;117959:11:0;;117956:80;;117989:47;118005:4;118019;118026:9;117989:15;:47::i;:::-;117166:882;117153:895;118078:33;118094:4;118100:2;118104:6;118078:15;:33::i;:::-;118170:15;;-1:-1:-1;;;;;118170:15:0;118141:56;118206:4;118213:15;118206:4;-1:-1:-1;;;;;31967:18:0;31940:7;31967:18;;;;;;;;;;;;31866:127;118213:15;118141:88;;-1:-1:-1;;;;;;118141:88:0;;;;;;;-1:-1:-1;;;;;10107:32:1;;;118141:88:0;;;10089:51:1;10156:18;;;10149:34;10062:18;;118141:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118124:126;118293:15;;-1:-1:-1;;;;;118293:15:0;118264:56;118329:2;118334:13;118329:2;-1:-1:-1;;;;;31967:18:0;31940:7;31967:18;;;;;;;;;;;;31866:127;118334:13;118264:84;;-1:-1:-1;;;;;;118264:84:0;;;;;;;-1:-1:-1;;;;;10107:32:1;;;118264:84:0;;;10089:51:1;10156:18;;;10149:34;10062:18;;118264:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;118260:100;118377:8;;-1:-1:-1;;;118377:8:0;;;;118372:1023;;-1:-1:-1;;;;;118407:40:0;;;;;;:34;:40;;;;;;;;118402:214;;118507:20;;118498:6;:29;118468:132;;;;-1:-1:-1;;;118468:132:0;;21401:2:1;118468:132:0;;;21383:21:1;21440:2;21420:18;;;21413:30;21479:31;21459:18;;;21452:59;21528:18;;118468:132:0;21199:353:1;118468:132:0;-1:-1:-1;;;;;118635:38:0;;;;;;:34;:38;;;;;;;;118630:210;;118740:9;;-1:-1:-1;;;;;31967:18:0;;31940:7;31967:18;;;;;;;;;;;118724:25;118694:130;;;;-1:-1:-1;;;118694:130:0;;21759:2:1;118694:130:0;;;21741:21:1;21798:2;21778:18;;;21771:30;21837:33;21817:18;;;21810:61;21888:18;;118694:130:0;21557:355:1;118694:130:0;118868:16;;118934:15;;118905:58;;-1:-1:-1;;;;;;118905:58:0;;;;;2271:25:1;;;-1:-1:-1;;;;;118934:15:0;;;;118905:53;;2244:18:1;;118905:58:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;118905:58:0;;;;;;;;-1:-1:-1;;118905:58:0;;;;;;;;;;;;:::i;:::-;;;118901:483;;;119127:232;;;10736:25:1;;;10792:2;10777:18;;10770:34;;;10820:18;;;10813:34;;;10878:2;10863:18;;10856:34;;;119330:10:0;;119277:4;;119127:232;;10723:3:1;10708:19;119127:232:0;;;;;;;118964:411;;;118901:483;118387:1008;118372:1023;115699:3703;;;;;;115586:3816;;;:::o;110557:602::-;-1:-1:-1;;;;;110662:31:0;;;;;;:25;:31;;;;;;:40;;;:31;;;;:40;;;110640:146;;;;-1:-1:-1;;;110640:146:0;;22119:2:1;110640:146:0;;;22101:21:1;22158:2;22138:18;;;22131:30;22197:34;22177:18;;;22170:62;22268:26;22248:18;;;22241:54;22312:19;;110640:146:0;21917:420:1;110640:146:0;-1:-1:-1;;;;;110797:31:0;;;;;;:25;:31;;;;;;;;:39;;;;;;-1:-1:-1;;110797:39:0;;;;;;;;110847:34;:40;;;;;;;:48;;;;;;;;;;;110831:5;;110910:85;;-1:-1:-1;110949:15:0;;110920:75;;-1:-1:-1;;;110920:75:0;;-1:-1:-1;;;;;191:32:1;;;110920:75:0;;;173:51:1;110949:15:0;;;;110920:69;;146:18:1;;110920:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;110919:76;110910:85;110906:190;;;111041:15;;111012:72;;-1:-1:-1;;;111012:72:0;;-1:-1:-1;;;;;191:32:1;;;111012:72:0;;;173:51:1;111041:15:0;;;;111012:66;;146:18:1;;111012:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;110906:190;111139:4;-1:-1:-1;;;;;111111:40:0;;111145:5;111111:40;;;;1512:14:1;1505:22;1487:41;;1475:2;1460:18;;1347:187;60529:191:0;60622:6;;;-1:-1:-1;;;;;60639:17:0;;;-1:-1:-1;;;;;;60639:17:0;;;;;;;60672:40;;60622:6;;;60639:17;60622:6;;60672:40;;60603:16;;60672:40;60592:128;60529:191;:::o;69670:211::-;69814:58;;;-1:-1:-1;;;;;10107:32:1;;69814:58:0;;;10089:51:1;10156:18;;;;10149:34;;;69814:58:0;;;;;;;;;;10062:18:1;;;;69814:58:0;;;;;;;;-1:-1:-1;;;;;69814:58:0;-1:-1:-1;;;69814:58:0;;;69787:86;;69807:5;;69787:19;:86::i;:::-;69670:211;;;:::o;119408:1429::-;119494:11;;119472:20;;-1:-1:-1;;;;;119494:11:0;;;119472:20;;:33;119469:1351;;119557:11;;119550:76;;-1:-1:-1;;;119550:76:0;;119606:4;119550:76;;;173:51:1;119521:26:0;;-1:-1:-1;;;;;119557:11:0;;119550:29;;146:18:1;;119550:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;119521:105;;119641:25;119659:6;119641:17;:25::i;:::-;119710:11;;119703:44;;-1:-1:-1;;;119703:44:0;;119741:4;119703:44;;;173:51:1;119681:18:0;;119768;;-1:-1:-1;;;;;119710:11:0;;;;119703:29;;146:18:1;;119703:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;119702:99;;;;:::i;:::-;119849:23;;;119823:11;119681:120;;-1:-1:-1;119816:69:0;;-1:-1:-1;;;;;119823:11:0;;;;-1:-1:-1;;;119849:23:0;;;119681:120;119816:32;:69::i;119469:1351::-;119927:16;;119905:20;;-1:-1:-1;;;;;119927:16:0;;;119905:20;;:38;119902:918;;120021:15;;120002:42;;;-1:-1:-1;;;120002:42:0;;;;119959:22;;-1:-1:-1;;;;;120021:15:0;;120002:40;;:42;;;;;;;;;;;;;;120021:15;120002:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;119984:16;;-1:-1:-1;;;;;119984:16:0;;;:60;;;:154;;120096:16;;120089:49;;-1:-1:-1;;;120089:49:0;;120132:4;120089:49;;;173:51:1;-1:-1:-1;;;;;120096:16:0;;;;120089:34;;146:18:1;;120089:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;119984:154;;;120047:21;119984:154;119959:179;;120153:30;120176:6;120153:22;:30::i;:::-;120256:15;;120237:42;;;-1:-1:-1;;;120237:42:0;;;;120198:18;;-1:-1:-1;;;;;120256:15:0;;120237:40;;:42;;;;;;;;;;;;;;120256:15;120237:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;120219:16;;-1:-1:-1;;;;;120219:16:0;;;:60;;;:183;;120345:16;;120338:49;;-1:-1:-1;;;120338:49:0;;120381:4;120338:49;;;173:51:1;120388:14:0;;-1:-1:-1;;;;;120345:16:0;;120338:34;;146:18:1;;120338:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:64;;;;:::i;:::-;120219:183;;;120282:36;120304:14;120282:21;:36;:::i;:::-;120198:204;;120457:15;;;;;;;;;-1:-1:-1;;;;;120457:15:0;-1:-1:-1;;;;;120438:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;120420:16;;-1:-1:-1;;;;;120420:60:0;;;:16;;:60;120417:303;;120525:23;;120517:60;;120501:12;;-1:-1:-1;;;120525:23:0;;-1:-1:-1;;;;;120525:23:0;;120562:10;;120501:12;120517:60;120501:12;120517:60;120562:10;120525:23;120517:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;69670:211:0:o;120417:303::-;120668:23;;120637:16;;120630:74;;-1:-1:-1;;;;;120637:16:0;;;;-1:-1:-1;;;120668:23:0;;;;120693:10;120630:37;:74::i;119902:918::-;120776:23;;120751:57;;120769:4;;-1:-1:-1;;;120776:23:0;;-1:-1:-1;;;;;120776:23:0;120801:6;120751:9;:57::i;120843:686::-;120902:12;120917:10;120925:1;120917:6;:10;:::i;:::-;120902:25;-1:-1:-1;120938:17:0;120958:13;120902:25;120958:6;:13;:::i;:::-;120938:33;;120984:22;121046:15;;;;;;;;;-1:-1:-1;;;;;121046:15:0;-1:-1:-1;;;;;121027:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;121009:16;;-1:-1:-1;;;;;121009:16:0;;;:60;;;:150;;121117:16;;121110:49;;-1:-1:-1;;;121110:49:0;;121153:4;121110:49;;;173:51:1;-1:-1:-1;;;;;121117:16:0;;;;121110:34;;146:18:1;;121110:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;121009:150;;;121072:21;121009:150;120984:175;;121172:28;121195:4;121172:22;:28::i;:::-;121270:15;;121251:42;;;-1:-1:-1;;;121251:42:0;;;;121212:18;;-1:-1:-1;;;;;121270:15:0;;121251:40;;:42;;;;;;;;;;;;;;121270:15;121251:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;121233:16;;-1:-1:-1;;;;;121233:16:0;;;:60;;;:179;;121355:16;;121348:49;;-1:-1:-1;;;121348:49:0;;121391:4;121348:49;;;173:51:1;121398:14:0;;-1:-1:-1;;;;;121355:16:0;;121348:34;;146:18:1;;121348:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:64;;;;:::i;:::-;121233:179;;;121296:36;121318:14;121296:21;:36;:::i;:::-;121212:200;;121425:35;121438:9;121449:10;121425:12;:35::i;:::-;121478:43;;;22544:25:1;;;22600:2;22585:18;;22578:34;;;22628:18;;;22621:34;;;121478:43:0;;22532:2:1;22517:18;121478:43:0;;;;;;;120891:638;;;;120843:686;:::o;124285:420::-;124350:25;124368:6;124350:17;:25::i;:::-;124413:11;;124406:44;;-1:-1:-1;;;124406:44:0;;124444:4;124406:44;;;173:51:1;124386:17:0;;-1:-1:-1;;;;;124413:11:0;;124406:29;;146:18:1;;124406:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;124508:15;;124468:11;;124386:64;;-1:-1:-1;124461:97:0;;-1:-1:-1;;;;;124468:11:0;;;;124508:15;124386:64;124461:32;:97::i;:::-;124598:15;;124569:80;;-1:-1:-1;;;124569:80:0;;;;;2271:25:1;;;-1:-1:-1;;;;;124598:15:0;;;;124569:69;;2244:18:1;;124569:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;124665:32:0;;;7658:25:1;;;7714:2;7699:18;;7692:34;;;124665:32:0;;-1:-1:-1;7631:18:1;;-1:-1:-1;124665:32:0;;;;;;;124339:366;124285:420;:::o;36071:671::-;-1:-1:-1;;;;;36202:18:0;;36194:68;;;;-1:-1:-1;;;36194:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36281:16:0;;36273:64;;;;-1:-1:-1;;;36273:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36423:15:0;;36401:19;36423:15;;;;;;;;;;;36457:21;;;;36449:72;;;;-1:-1:-1;;;36449:72:0;;22868:2:1;36449:72:0;;;22850:21:1;22907:2;22887:18;;;22880:30;22946:34;22926:18;;;22919:62;-1:-1:-1;;;22997:18:1;;;22990:36;23043:19;;36449:72:0;22666:402:1;36449:72:0;-1:-1:-1;;;;;36557:15:0;;;:9;:15;;;;;;;;;;;36575:20;;;36557:38;;36617:13;;;;;;;;:23;;36589:6;;36557:9;36617:23;;36589:6;;36617:23;:::i;:::-;;;;;;;;36673:2;-1:-1:-1;;;;;36658:26:0;36667:4;-1:-1:-1;;;;;36658:26:0;;36677:6;36658:26;;;;2271:25:1;;2259:2;2244:18;;2125:177;36658:26:0;;;;;;;;36697:37;69670:211;72243:716;72667:23;72693:69;72721:4;72693:69;;;;;;;;;;;;;;;;;72701:5;-1:-1:-1;;;;;72693:27:0;;;:69;;;;;:::i;:::-;72777:17;;72667:95;;-1:-1:-1;72777:21:0;72773:179;;72874:10;72863:30;;;;;;;;;;;;:::i;:::-;72855:85;;;;-1:-1:-1;;;72855:85:0;;23275:2:1;72855:85:0;;;23257:21:1;23314:2;23294:18;;;23287:30;23353:34;23333:18;;;23326:62;-1:-1:-1;;;23404:18:1;;;23397:40;23454:19;;72855:85:0;23073:406:1;122421:988:0;122509:11;;122491:16;;-1:-1:-1;;;;;122491:16:0;;;122509:11;;122491:29;122488:904;;122560:16;;;122574:1;122560:16;;;;;;;;;122536:21;;122560:16;;;;;;;;;;-1:-1:-1;122560:16:0;122536:40;;122609:4;122591;122596:1;122591:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;122591:23:0;;;:7;;;;;;;;;:23;122639:16;;122629:7;;122639:16;;;122629:4;;122639:16;;122629:7;;;;;;:::i;:::-;-1:-1:-1;;;;;122629:26:0;;;:7;;;;;;;;;:26;122680:11;;122670:7;;122680:11;;;122670:4;;122675:1;;122670:7;;;;;;:::i;:::-;-1:-1:-1;;;;;122670:21:0;;;:7;;;;;;;;;:21;122725:15;;122706:243;;-1:-1:-1;;;122706:243:0;;122725:15;;;122706:89;;:243;;122814:11;;122725:15;;122864:4;;122895;;122919:15;;122706:243;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;122521:440;115134:88;115097:133::o;122488:904::-;123004:16;;;123018:1;123004:16;;;;;;;;122980:21;;123004:16;;;;;;;;;;-1:-1:-1;123004:16:0;122980:40;;123053:4;123035;123040:1;123035:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;123035:23:0;;;:7;;;;;;;;;:23;123083:11;;123073:7;;123083:11;;;123073:4;;123083:11;;123073:7;;;;;;:::i;:::-;-1:-1:-1;;;;;123073:21:0;;;:7;;;;;;;;;:21;123197:15;;123109:259;;-1:-1:-1;;;123109:259:0;;95630:42;;123109:69;;:259;;123197:15;;;123231:11;;123197:15;;123315:4;;123338:15;;123109:259;;;:::i;121537:876::-;121633:16;;;121647:1;121633:16;;;;;;;;121609:21;;121633:16;;;;;;;;;;-1:-1:-1;121633:16:0;121609:40;;121678:4;121660;121665:1;121660:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;121660:23:0;;;:7;;;;;;;;;:23;121704:16;;121694:7;;121704:16;;;121694:4;;121704:16;;121694:7;;;;;;:::i;:::-;-1:-1:-1;;;;;121694:26:0;;;:7;;;;;;;;;;:26;;;;121767:15;;121748:42;;;-1:-1:-1;;;121748:42:0;;;;121767:15;;;;;121748:40;;:42;;;;;121694:7;;121748:42;;;;;121767:15;121748:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;121737:53:0;:4;121742:1;121737:7;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;121737:53:0;;121733:673;;121825:15;;121806:274;;-1:-1:-1;;;121806:274:0;;-1:-1:-1;;;;;121825:15:0;;;;121806:86;;:274;;121911:11;;121825:15;;121995:4;;122026;;122050:15;;121806:274;;;:::i;121733:673::-;122203:15;;122111:283;;-1:-1:-1;;;122111:283:0;;95630:42;;122111:69;;:283;;-1:-1:-1;;;;;122203:15:0;;122241:11;;122203:15;;122333:4;;122360:15;;122111:283;;;:::i;123417:860::-;123553:15;;;;;;;;;-1:-1:-1;;;;;123553:15:0;-1:-1:-1;;;;;123534:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;123514:16;;-1:-1:-1;;;;;123514:62:0;;;:16;;:62;123510:748;;123611:15;;123592:314;;-1:-1:-1;;;123592:314:0;;123694:4;123592:314;;;25729:34:1;25779:18;;;25772:34;;;123611:15:0;25822:18:1;;;25815:34;;;25865:18;;;25858:34;123850:6:0;25908:19:1;;;25901:44;123876:15:0;25961:19:1;;;25954:35;-1:-1:-1;;;;;123611:15:0;;;;123592:51;;123651:15;;25663:19:1;;123592:314:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;123510:748::-;123955:15;;124035:16;;123936:302;;-1:-1:-1;;;123936:302:0;;124011:4;123936:302;;;26397:34:1;-1:-1:-1;;;;;124035:16:0;;;26447:18:1;;;26440:43;26499:18;;;26492:34;;;26542:18;;;26535:34;;;123955:15:0;26585:19:1;;;26578:35;;;26629:19;;;26622:35;124182:6:0;26673:19:1;;;26666:44;124208:15:0;26726:19:1;;;26719:35;123955:15:0;;;123936:48;;26331:19:1;;123936:302:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;20659:229::-;20796:12;20828:52;20850:6;20858:4;20864:1;20867:12;20828:21;:52::i;:::-;20821:59;20659:229;-1:-1:-1;;;;20659:229:0:o;21779:510::-;21949:12;22007:5;21982:21;:30;;21974:81;;;;-1:-1:-1;;;21974:81:0;;26967:2:1;21974:81:0;;;26949:21:1;27006:2;26986:18;;;26979:30;27045:34;27025:18;;;27018:62;-1:-1:-1;;;27096:18:1;;;27089:36;27142:19;;21974:81:0;26765:402:1;21974:81:0;-1:-1:-1;;;;;18209:19:0;;;22066:60;;;;-1:-1:-1;;;22066:60:0;;27374:2:1;22066:60:0;;;27356:21:1;27413:2;27393:18;;;27386:30;27452:31;27432:18;;;27425:59;27501:18;;22066:60:0;27172:353:1;22066:60:0;22140:12;22154:23;22181:6;-1:-1:-1;;;;;22181:11:0;22200:5;22207:4;22181:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22139:73;;;;22230:51;22247:7;22256:10;22268:12;22230:16;:51::i;:::-;22223:58;21779:510;-1:-1:-1;;;;;;;21779:510:0:o;24465:712::-;24615:12;24644:7;24640:530;;;-1:-1:-1;24675:10:0;24668:17;;24640:530;24789:17;;:21;24785:374;;24987:10;24981:17;25048:15;25035:10;25031:2;25027:19;25020:44;24785:374;25130:12;25123:20;;-1:-1:-1;;;25123:20:0;;;;;;;;:::i;235:250:1:-;320:1;330:113;344:6;341:1;338:13;330:113;;;420:11;;;414:18;401:11;;;394:39;366:2;359:10;330:113;;;-1:-1:-1;;477:1:1;459:16;;452:27;235:250::o;490:396::-;639:2;628:9;621:21;602:4;671:6;665:13;714:6;709:2;698:9;694:18;687:34;730:79;802:6;797:2;786:9;782:18;777:2;769:6;765:15;730:79;:::i;:::-;870:2;849:15;-1:-1:-1;;845:29:1;830:45;;;;877:2;826:54;;490:396;-1:-1:-1;;490:396:1:o;891:131::-;-1:-1:-1;;;;;966:31:1;;956:42;;946:70;;1012:1;1009;1002:12;1027:315;1095:6;1103;1156:2;1144:9;1135:7;1131:23;1127:32;1124:52;;;1172:1;1169;1162:12;1124:52;1211:9;1198:23;1230:31;1255:5;1230:31;:::i;:::-;1280:5;1332:2;1317:18;;;;1304:32;;-1:-1:-1;;;1027:315:1:o;1732:180::-;1791:6;1844:2;1832:9;1823:7;1819:23;1815:32;1812:52;;;1860:1;1857;1850:12;1812:52;-1:-1:-1;1883:23:1;;1732:180;-1:-1:-1;1732:180:1:o;2307:456::-;2384:6;2392;2400;2453:2;2441:9;2432:7;2428:23;2424:32;2421:52;;;2469:1;2466;2459:12;2421:52;2508:9;2495:23;2527:31;2552:5;2527:31;:::i;:::-;2577:5;-1:-1:-1;2634:2:1;2619:18;;2606:32;2647:33;2606:32;2647:33;:::i;:::-;2307:456;;2699:7;;-1:-1:-1;;;2753:2:1;2738:18;;;;2725:32;;2307:456::o;2768:118::-;2854:5;2847:13;2840:21;2833:5;2830:32;2820:60;;2876:1;2873;2866:12;2891:382;2956:6;2964;3017:2;3005:9;2996:7;2992:23;2988:32;2985:52;;;3033:1;3030;3023:12;2985:52;3072:9;3059:23;3091:31;3116:5;3091:31;:::i;:::-;3141:5;-1:-1:-1;3198:2:1;3183:18;;3170:32;3211:30;3170:32;3211:30;:::i;:::-;3260:7;3250:17;;;2891:382;;;;;:::o;3278:241::-;3334:6;3387:2;3375:9;3366:7;3362:23;3358:32;3355:52;;;3403:1;3400;3393:12;3355:52;3442:9;3429:23;3461:28;3483:5;3461:28;:::i;3713:247::-;3772:6;3825:2;3813:9;3804:7;3800:23;3796:32;3793:52;;;3841:1;3838;3831:12;3793:52;3880:9;3867:23;3899:31;3924:5;3899:31;:::i;4458:159::-;4525:20;;4585:6;4574:18;;4564:29;;4554:57;;4607:1;4604;4597:12;4622:256;4688:6;4696;4749:2;4737:9;4728:7;4724:23;4720:32;4717:52;;;4765:1;4762;4755:12;4717:52;4788:28;4806:9;4788:28;:::i;:::-;4778:38;;4835:37;4868:2;4857:9;4853:18;4835:37;:::i;:::-;4825:47;;4622:256;;;;;:::o;5589:388::-;5657:6;5665;5718:2;5706:9;5697:7;5693:23;5689:32;5686:52;;;5734:1;5731;5724:12;5686:52;5773:9;5760:23;5792:31;5817:5;5792:31;:::i;:::-;5842:5;-1:-1:-1;5899:2:1;5884:18;;5871:32;5912:33;5871:32;5912:33;:::i;5982:380::-;6061:1;6057:12;;;;6104;;;6125:61;;6179:4;6171:6;6167:17;6157:27;;6125:61;6232:2;6224:6;6221:14;6201:18;6198:38;6195:161;;6278:10;6273:3;6269:20;6266:1;6259:31;6313:4;6310:1;6303:15;6341:4;6338:1;6331:15;6195:161;;5982:380;;;:::o;6367:356::-;6569:2;6551:21;;;6588:18;;;6581:30;6647:34;6642:2;6627:18;;6620:62;6714:2;6699:18;;6367:356::o;6728:127::-;6789:10;6784:3;6780:20;6777:1;6770:31;6820:4;6817:1;6810:15;6844:4;6841:1;6834:15;6860:217;6900:1;6926;6916:132;;6970:10;6965:3;6961:20;6958:1;6951:31;7005:4;7002:1;6995:15;7033:4;7030:1;7023:15;6916:132;-1:-1:-1;7062:9:1;;6860:217::o;7737:330::-;7939:2;7921:21;;;7978:1;7958:18;;;7951:29;-1:-1:-1;;;8011:2:1;7996:18;;7989:37;8058:2;8043:18;;7737:330::o;8072:184::-;8142:6;8195:2;8183:9;8174:7;8170:23;8166:32;8163:52;;;8211:1;8208;8201:12;8163:52;-1:-1:-1;8234:16:1;;8072:184;-1:-1:-1;8072:184:1:o;8261:125::-;8326:9;;;8347:10;;;8344:36;;;8360:18;;:::i;8696:245::-;8763:6;8816:2;8804:9;8795:7;8791:23;8787:32;8784:52;;;8832:1;8829;8822:12;8784:52;8864:9;8858:16;8883:28;8905:5;8883:28;:::i;9350:251::-;9420:6;9473:2;9461:9;9452:7;9448:23;9444:32;9441:52;;;9489:1;9486;9479:12;9441:52;9521:9;9515:16;9540:31;9565:5;9540:31;:::i;10194:306::-;10282:6;10290;10298;10351:2;10339:9;10330:7;10326:23;10322:32;10319:52;;;10367:1;10364;10357:12;10319:52;10396:9;10390:16;10380:26;;10446:2;10435:9;10431:18;10425:25;10415:35;;10490:2;10479:9;10475:18;10469:25;10459:35;;10194:306;;;;;:::o;12973:168::-;13040:6;13066:10;;;13078;;;13062:27;;13101:11;;;13098:37;;;13115:18;;:::i;:::-;13098:37;12973:168;;;;:::o;13146:339::-;13348:2;13330:21;;;13387:2;13367:18;;;13360:30;-1:-1:-1;;;13421:2:1;13406:18;;13399:45;13476:2;13461:18;;13146:339::o;13490:338::-;13692:2;13674:21;;;13731:2;13711:18;;;13704:30;-1:-1:-1;;;13765:2:1;13750:18;;13743:44;13819:2;13804:18;;13490:338::o;15532:681::-;15663:6;15671;15679;15687;15695;15703;15711;15719;15772:3;15760:9;15751:7;15747:23;15743:33;15740:53;;;15789:1;15786;15779:12;15740:53;15821:9;15815:16;15840:31;15865:5;15840:31;:::i;:::-;15890:5;15880:15;;;15935:2;15924:9;15920:18;15914:25;15904:35;;15979:2;15968:9;15964:18;15958:25;15948:35;;16023:2;16012:9;16008:18;16002:25;15992:35;;16067:3;16056:9;16052:19;16046:26;16036:36;;16112:3;16101:9;16097:19;16091:26;16081:36;;16157:3;16146:9;16142:19;16136:26;16126:36;;16202:3;16191:9;16187:19;16181:26;16171:36;;15532:681;;;;;;;;;;;:::o;19052:401::-;19254:2;19236:21;;;19293:2;19273:18;;;19266:30;19332:34;19327:2;19312:18;;19305:62;-1:-1:-1;;;19398:2:1;19383:18;;19376:35;19443:3;19428:19;;19052:401::o;19458:399::-;19660:2;19642:21;;;19699:2;19679:18;;;19672:30;19738:34;19733:2;19718:18;;19711:62;-1:-1:-1;;;19804:2:1;19789:18;;19782:33;19847:3;19832:19;;19458:399::o;20598:168::-;20671:9;;;20702;;20719:15;;;20713:22;;20699:37;20689:71;;20740:18;;:::i;20771:128::-;20838:9;;;20859:11;;;20856:37;;;20873:18;;:::i;23616:127::-;23677:10;23672:3;23668:20;23665:1;23658:31;23708:4;23705:1;23698:15;23732:4;23729:1;23722:15;23748:461;23801:3;23839:5;23833:12;23866:6;23861:3;23854:19;23892:4;23921:2;23916:3;23912:12;23905:19;;23958:2;23951:5;23947:14;23979:1;23989:195;24003:6;24000:1;23997:13;23989:195;;;24068:13;;-1:-1:-1;;;;;24064:39:1;24052:52;;24124:12;;;;24159:15;;;;24100:1;24018:9;23989:195;;;-1:-1:-1;24200:3:1;;23748:461;-1:-1:-1;;;;;23748:461:1:o;24214:582::-;24513:6;24502:9;24495:25;24556:6;24551:2;24540:9;24536:18;24529:34;24599:3;24594:2;24583:9;24579:18;24572:31;24476:4;24620:57;24672:3;24661:9;24657:19;24649:6;24620:57;:::i;:::-;-1:-1:-1;;;;;24713:32:1;;;;24708:2;24693:18;;24686:60;-1:-1:-1;24777:3:1;24762:19;24755:35;24612:65;24214:582;-1:-1:-1;;;24214:582:1:o;24801:::-;25129:1;25125;25120:3;25116:11;25112:19;25104:6;25100:32;25089:9;25082:51;25169:6;25164:2;25153:9;25149:18;25142:34;25212:6;25207:2;25196:9;25192:18;25185:34;25255:3;25250:2;25239:9;25235:18;25228:31;25063:4;25276:57;25328:3;25317:9;25313:19;25305:6;25276:57;:::i;:::-;25268:65;;25370:6;25364:3;25353:9;25349:19;25342:35;24801:582;;;;;;;;:::o;27530:287::-;27659:3;27697:6;27691:13;27713:66;27772:6;27767:3;27760:4;27752:6;27748:17;27713:66;:::i;:::-;27795:16;;;;;27530:287;-1:-1:-1;;27530:287:1:o

Swarm Source

ipfs://aed8129ac5bee9795d0fb8c1d42daa497eee6c6ba191204e72d32ea6853c1443
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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