ETH Price: $2,881.10 (-10.58%)
Gas: 18 Gwei

Contract

0x775EE938186FddC13bD7C89D24820E1b0758F91D
 

Overview

ETH Balance

0.000000062596227667 ETH

Eth Value

Less Than $0.01 (@ $2,881.10/ETH)

Token Holdings

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
Value
Transfer Ownersh...128581472021-07-19 16:37:571081 days ago1626712677IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH0.0012953745
Zap In126247952021-06-13 7:37:341117 days ago1623569854IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0.001 ETH0.0001255
In Case Tokenget...121654832021-04-03 8:14:101188 days ago1617437650IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH0.00406895127
Zap In108978762020-09-20 7:35:051383 days ago1600587305IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0.4 ETH0.0008853630
Toggle Contract ...107818332020-09-02 12:38:391401 days ago1599050319IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH0.01373764490
Zap In107214182020-08-24 6:19:531410 days ago1598249993IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH0.0030800872
Zap In107103542020-08-22 13:39:261412 days ago1598103566IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH0.0206450953
Zap In106915292020-08-19 16:07:021415 days ago1597853222IN
Zapper.Fi: Old Uniswap V2 Zap In 2
1.25 ETH0.04198126104
Zap In106912602020-08-19 15:04:531415 days ago1597849493IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH0.1358725159.85
Withdraw106899722020-08-19 10:15:201415 days ago1597832120IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH0.00445127142
Zap In106898592020-08-19 9:52:341415 days ago1597830754IN
Zapper.Fi: Old Uniswap V2 Zap In 2
30 ETH0.05694029142
Zap In106898562020-08-19 9:52:021415 days ago1597830722IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH0.04586898142
Zap In106898552020-08-19 9:51:501415 days ago1597830710IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH0.07442019130
Zap In106898052020-08-19 9:39:551415 days ago1597829995IN
Zapper.Fi: Old Uniswap V2 Zap In 2
50 ETH0.06007674163
Zap In106898032020-08-19 9:38:241415 days ago1597829904IN
Zapper.Fi: Old Uniswap V2 Zap In 2
50 ETH0.06203535163
Zap In106897992020-08-19 9:37:101415 days ago1597829830IN
Zapper.Fi: Old Uniswap V2 Zap In 2
50 ETH0.06203535163
Zap In106897922020-08-19 9:36:171415 days ago1597829777IN
Zapper.Fi: Old Uniswap V2 Zap In 2
50 ETH0.06448035163
Zap In106897122020-08-19 9:18:571415 days ago1597828737IN
Zapper.Fi: Old Uniswap V2 Zap In 2
4 ETH0.05933415150
Zap In106896922020-08-19 9:14:201415 days ago1597828460IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH0.10574766180
Zap In106895962020-08-19 8:53:321415 days ago1597827212IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH0.07438945163
Zap In106895842020-08-19 8:51:191415 days ago1597827079IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH0.09380177163
Zap In106895522020-08-19 8:42:551415 days ago1597826575IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH0.01964378163
Zap In106894642020-08-19 8:26:531415 days ago1597825613IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0.02 ETH0.04299731142
Zap In106894642020-08-19 8:26:531415 days ago1597825613IN
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH0.06434785143
Zap In106894432020-08-19 8:23:091415 days ago1597825389IN
Zapper.Fi: Old Uniswap V2 Zap In 2
19 ETH0.0644248162
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
106915292020-08-19 16:07:021415 days ago1597853222
Zapper.Fi: Old Uniswap V2 Zap In 2
0.00000006 ETH
106915292020-08-19 16:07:021415 days ago1597853222
Zapper.Fi: Old Uniswap V2 Zap In 2
1.25 ETH
106899722020-08-19 10:15:201415 days ago1597832120
Zapper.Fi: Old Uniswap V2 Zap In 2
4.20116804 ETH
106898592020-08-19 9:52:341415 days ago1597830754
Zapper.Fi: Old Uniswap V2 Zap In 2
0.00003534 ETH
106898592020-08-19 9:52:341415 days ago1597830754
Zapper.Fi: Old Uniswap V2 Zap In 2
30 ETH
106898052020-08-19 9:39:551415 days ago1597829995
Zapper.Fi: Old Uniswap V2 Zap In 2
0.0006526 ETH
106898052020-08-19 9:39:551415 days ago1597829995
Zapper.Fi: Old Uniswap V2 Zap In 2
50 ETH
106898032020-08-19 9:38:241415 days ago1597829904
Zapper.Fi: Old Uniswap V2 Zap In 2
0.00065753 ETH
106898032020-08-19 9:38:241415 days ago1597829904
Zapper.Fi: Old Uniswap V2 Zap In 2
50 ETH
106897992020-08-19 9:37:101415 days ago1597829830
Zapper.Fi: Old Uniswap V2 Zap In 2
0.00066606 ETH
106897992020-08-19 9:37:101415 days ago1597829830
Zapper.Fi: Old Uniswap V2 Zap In 2
50 ETH
106897922020-08-19 9:36:171415 days ago1597829777
Zapper.Fi: Old Uniswap V2 Zap In 2
0.00066917 ETH
106897922020-08-19 9:36:171415 days ago1597829777
Zapper.Fi: Old Uniswap V2 Zap In 2
50 ETH
106897122020-08-19 9:18:571415 days ago1597828737
Zapper.Fi: Old Uniswap V2 Zap In 2
0.00000034 ETH
106897122020-08-19 9:18:571415 days ago1597828737
Zapper.Fi: Old Uniswap V2 Zap In 2
4 ETH
106894642020-08-19 8:26:531415 days ago1597825613
Zapper.Fi: Old Uniswap V2 Zap In 2
0.02 ETH
106894432020-08-19 8:23:091415 days ago1597825389
Zapper.Fi: Old Uniswap V2 Zap In 2
0.00002775 ETH
106894432020-08-19 8:23:091415 days ago1597825389
Zapper.Fi: Old Uniswap V2 Zap In 2
19 ETH
106892112020-08-19 7:31:581415 days ago1597822318
Zapper.Fi: Old Uniswap V2 Zap In 2
0.00000021 ETH
106892112020-08-19 7:31:581415 days ago1597822318
Zapper.Fi: Old Uniswap V2 Zap In 2
3.8 ETH
106891492020-08-19 7:12:491415 days ago1597821169
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH
106891492020-08-19 7:12:491415 days ago1597821169
Zapper.Fi: Old Uniswap V2 Zap In 2
0.8 ETH
106889072020-08-19 6:16:581415 days ago1597817818
Zapper.Fi: Old Uniswap V2 Zap In 2
2 wei
106889072020-08-19 6:16:581415 days ago1597817818
Zapper.Fi: Old Uniswap V2 Zap In 2
2.8 ETH
106887902020-08-19 5:52:371415 days ago1597816357
Zapper.Fi: Old Uniswap V2 Zap In 2
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniswapV2_ZapIn_General_V2

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv2 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-07-11
*/

// File: UniswapV2Router.sol

pragma solidity 0.5.12;

interface IUniswapV2Router02 {
    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 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;

    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);
}
// File: OpenZepplinReentrancyGuard.sol

pragma solidity ^0.5.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * _Since v2.5.0:_ this module is now much more gas efficient, given net gas
 * metering changes introduced in the Istanbul hardfork.
 */
contract ReentrancyGuard {
    bool private _notEntered;

    constructor () internal {
        // Storing an initial non-zero value makes deployment a bit more
        // expensive, but in exchange the refund on every call to nonReentrant
        // will be lower in amount. Since refunds are capped to a percetange of
        // the total transaction's gas, it is best to keep them low in cases
        // like this one, to increase the likelihood of the full refund coming
        // into effect.
        _notEntered = true;
    }

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

        // Any calls to nonReentrant after this point will fail
        _notEntered = false;

        _;

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

pragma solidity ^0.5.5;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Converts an `address` into `address payable`. Note that this is
     * simply a type cast: the actual underlying value is not changed.
     *
     * _Available since v2.4.0._
     */
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    /**
     * @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].
     *
     * _Available since v2.4.0._
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}
// File: Context.sol

pragma solidity ^0.5.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () internal { }
    // solhint-disable-previous-line no-empty-blocks

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

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

pragma solidity ^0.5.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address payable public _owner;

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

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

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

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

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _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 onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address payable newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address payable newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}
// File: OpenZepplinSafeMath.sol

pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

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

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}
// File: browser/UniswapV2_ETH_ERC_Zap_In_V2.sol

pragma solidity 0.5.12;






library TransferHelper {
    function safeApprove(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0x095ea7b3, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper: APPROVE_FAILED"
        );
    }

    function safeTransfer(
        address token,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0xa9059cbb, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper: TRANSFER_FAILED"
        );
    }

    function safeTransferFrom(
        address token,
        address from,
        address to,
        uint256 value
    ) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(
            abi.encodeWithSelector(0x23b872dd, from, to, value)
        );
        require(
            success && (data.length == 0 || abi.decode(data, (bool))),
            "TransferHelper: TRANSFER_FROM_FAILED"
        );
    }
}

// import "@uniswap/lib/contracts/libraries/Babylonian.sol";
library Babylonian {
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
        // else z = 0
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the number of decimals.
     */
    function decimals() external view returns (uint256);

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

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

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

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

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

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

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

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

interface IWETH {
    function deposit() external payable;

    function transfer(address to, uint256 value) external returns (bool);

    function withdraw(uint256) external;
}

interface IUniswapV1Factory {
    function getExchange(address token)
        external
        view
        returns (address exchange);
}

interface IUniswapV2Factory {
    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address);
}

interface IUniswapExchange {
    // converting ERC20 to ERC20 and transfer
    function tokenToTokenTransferInput(
        uint256 tokens_sold,
        uint256 min_tokens_bought,
        uint256 min_eth_bought,
        uint256 deadline,
        address recipient,
        address token_addr
    ) external returns (uint256 tokens_bought);

    function tokenToTokenSwapInput(
        uint256 tokens_sold,
        uint256 min_tokens_bought,
        uint256 min_eth_bought,
        uint256 deadline,
        address token_addr
    ) external returns (uint256 tokens_bought);

    function getEthToTokenInputPrice(uint256 eth_sold)
        external
        view
        returns (uint256 tokens_bought);

    function getTokenToEthInputPrice(uint256 tokens_sold)
        external
        view
        returns (uint256 eth_bought);

    function tokenToEthTransferInput(
        uint256 tokens_sold,
        uint256 min_eth,
        uint256 deadline,
        address recipient
    ) external returns (uint256 eth_bought);

    function ethToTokenSwapInput(uint256 min_tokens, uint256 deadline)
        external
        payable
        returns (uint256 tokens_bought);

    function ethToTokenTransferInput(
        uint256 min_tokens,
        uint256 deadline,
        address recipient
    ) external payable returns (uint256 tokens_bought);

    function balanceOf(address _owner) external view returns (uint256);

    function transfer(address _to, uint256 _value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 tokens
    ) external returns (bool success);
}

interface IUniswapV2Pair {
    function token0() external pure returns (address);

    function token1() external pure returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 _reserve0,
            uint112 _reserve1,
            uint32 _blockTimestampLast
        );
}

contract UniswapV2_ZapIn_General_V2 is ReentrancyGuard, Ownable {
    using SafeMath for uint256;
    using Address for address;
    bool private stopped = false;
    uint16 public goodwill;
    address public dzgoodwillAddress;

    IUniswapV2Router02 public uniswapV2Router = IUniswapV2Router02(
        0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
    );

    IUniswapV1Factory public UniSwapV1FactoryAddress = IUniswapV1Factory(
        0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95
    );

    IUniswapV2Factory public UniSwapV2FactoryAddress = IUniswapV2Factory(
        0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
    );

    address wethTokenAddress = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    constructor(
        uint16 _goodwill,
        address _dzgoodwillAddress
    ) public {
        goodwill = _goodwill;
        dzgoodwillAddress = _dzgoodwillAddress;
    }

    // circuit breaker modifiers
    modifier stopInEmergency {
        if (stopped) {
            revert("Temporarily Paused");
        } else {
            _;
        }
    }

    /**
    @notice This function is used to invest in given Uniswap V2 pair through ETH/ERC20 Tokens
    @param _FromTokenContractAddress The ERC20 token used for investment (address(0x00) if ether)
    @param _ToUnipoolToken0 The Uniswap V2 pair token0 address
    @param _ToUnipoolToken1 The Uniswap V2 pair token1 address
    @param _amount The amount of fromToken to invest
    @param _minPoolTokens Reverts if less tokens received than this
    @return Amount of LP bought
     */
    function ZapIn(
        address _FromTokenContractAddress,
        address _ToUnipoolToken0,
        address _ToUnipoolToken1,
        uint256 _amount,
        uint _minPoolTokens
    ) public payable nonReentrant stopInEmergency returns (uint256) {
        uint256 toInvest;
        if (_FromTokenContractAddress == address(0)) {
            require(msg.value > 0, "Error: ETH not sent");
            toInvest = msg.value;
        } else {
            require(msg.value == 0, "Error: ETH sent");
            require(_amount > 0, "Error: Invalid ERC amount");
            TransferHelper.safeTransferFrom(
                _FromTokenContractAddress,
                msg.sender,
                address(this),
                _amount
            );
            toInvest = _amount;
        }

        uint256 LPBought = _performZapIn(
            _FromTokenContractAddress,
            _ToUnipoolToken0,
            _ToUnipoolToken1,
            toInvest
        );
        
        require(LPBought >= _minPoolTokens, "ERR: High Slippage");

        //get pair address
        address _ToUniPoolAddress = UniSwapV2FactoryAddress.getPair(
            _ToUnipoolToken0,
            _ToUnipoolToken1
        );

        //transfer goodwill
        uint256 goodwillPortion = _transferGoodwill(
            _ToUniPoolAddress,
            LPBought
        );

        TransferHelper.safeTransfer(
            _ToUniPoolAddress,
            msg.sender,
            SafeMath.sub(LPBought, goodwillPortion)
        );
        return SafeMath.sub(LPBought, goodwillPortion);
    }

    function _performZapIn(
        address _FromTokenContractAddress,
        address _ToUnipoolToken0,
        address _ToUnipoolToken1,
        uint256 _amount
    ) internal returns (uint256) {
        uint256 token0Bought;
        uint256 token1Bought;

        if (canSwapFromV2(_ToUnipoolToken0, _ToUnipoolToken1)) {
            (token0Bought, token1Bought) = exchangeTokensV2(
                _FromTokenContractAddress,
                _ToUnipoolToken0,
                _ToUnipoolToken1,
                _amount
            );
        } else if (
            canSwapFromV1(_ToUnipoolToken0, _ToUnipoolToken1, _amount, _amount)
        ) {
            (token0Bought, token1Bought) = exchangeTokensV1(
                _FromTokenContractAddress,
                _ToUnipoolToken0,
                _ToUnipoolToken1,
                _amount
            );
        }

        require(token0Bought > 0 && token1Bought > 0, "Could not exchange");

        TransferHelper.safeApprove(
            _ToUnipoolToken0,
            address(uniswapV2Router),
            token0Bought
        );

        TransferHelper.safeApprove(
            _ToUnipoolToken1,
            address(uniswapV2Router),
            token1Bought
        );

        (uint256 amountA, uint256 amountB, uint256 LP) = uniswapV2Router
            .addLiquidity(
            _ToUnipoolToken0,
            _ToUnipoolToken1,
            token0Bought,
            token1Bought,
            1,
            1,
            address(this),
            now + 60
        );

        uint256 residue;
        if (SafeMath.sub(token0Bought, amountA) > 0) {
            if (canSwapFromV2(_ToUnipoolToken0, _FromTokenContractAddress)) {
                residue = swapFromV2(
                    _ToUnipoolToken0,
                    _FromTokenContractAddress,
                    SafeMath.sub(token0Bought, amountA)
                );
            } else {
                TransferHelper.safeTransfer(
                    _ToUnipoolToken0,
                    msg.sender,
                    SafeMath.sub(token0Bought, amountA)
                );
            }
        }

        if (SafeMath.sub(token1Bought, amountB) > 0) {
            if (canSwapFromV2(_ToUnipoolToken1, _FromTokenContractAddress)) {
                residue += swapFromV2(
                    _ToUnipoolToken1,
                    _FromTokenContractAddress,
                    SafeMath.sub(token1Bought, amountB)
                );
            } else {
                TransferHelper.safeTransfer(
                    _ToUnipoolToken1,
                    msg.sender,
                    SafeMath.sub(token1Bought, amountB)
                );
            }
        }

        if (residue > 0) {
            TransferHelper.safeTransfer(
                _FromTokenContractAddress,
                msg.sender,
                residue
            );
        }
        
        return LP;
    }

    function exchangeTokensV1(
        address _FromTokenContractAddress,
        address _ToUnipoolToken0,
        address _ToUnipoolToken1,
        uint256 _amount
    ) internal returns (uint256 token0Bought, uint256 token1Bought) {
        IUniswapV2Pair pair = IUniswapV2Pair(
            UniSwapV2FactoryAddress.getPair(_ToUnipoolToken0, _ToUnipoolToken1)
        );
        (uint256 res0, uint256 res1, ) = pair.getReserves();
        if (_FromTokenContractAddress == address(0)) {
            token0Bought = _eth2Token(_ToUnipoolToken0, _amount);
            uint256 amountToSwap = calculateSwapInAmount(res0, token0Bought);
            //if no reserve or a new pair is created
            if (amountToSwap <= 0) amountToSwap = SafeMath.div(token0Bought, 2);
            token1Bought = _eth2Token(_ToUnipoolToken1, amountToSwap);
            token0Bought = SafeMath.sub(token0Bought, amountToSwap);
        } else {
            if (_ToUnipoolToken0 == _FromTokenContractAddress) {
                uint256 amountToSwap = calculateSwapInAmount(res0, _amount);
                //if no reserve or a new pair is created
                if (amountToSwap <= 0) amountToSwap = SafeMath.div(_amount, 2);
                token1Bought = _token2Token(
                    _FromTokenContractAddress,
                    address(this),
                    _ToUnipoolToken1,
                    amountToSwap
                );

                token0Bought = SafeMath.sub(_amount, amountToSwap);
            } else if (_ToUnipoolToken1 == _FromTokenContractAddress) {
                uint256 amountToSwap = calculateSwapInAmount(res1, _amount);
                //if no reserve or a new pair is created
                if (amountToSwap <= 0) amountToSwap = SafeMath.div(_amount, 2);
                token0Bought = _token2Token(
                    _FromTokenContractAddress,
                    address(this),
                    _ToUnipoolToken0,
                    amountToSwap
                );

                token1Bought = SafeMath.sub(_amount, amountToSwap);
            } else {
                token0Bought = _token2Token(
                    _FromTokenContractAddress,
                    address(this),
                    _ToUnipoolToken0,
                    _amount
                );
                uint256 amountToSwap = calculateSwapInAmount(
                    res0,
                    token0Bought
                );
                //if no reserve or a new pair is created
                if (amountToSwap <= 0) amountToSwap = SafeMath.div(_amount, 2);

                token1Bought = _token2Token(
                    _FromTokenContractAddress,
                    address(this),
                    _ToUnipoolToken1,
                    amountToSwap
                );
                token0Bought = SafeMath.sub(token0Bought, amountToSwap);
            }
        }
    }

    function exchangeTokensV2(
        address _FromTokenContractAddress,
        address _ToUnipoolToken0,
        address _ToUnipoolToken1,
        uint256 _amount
    ) internal returns (uint256 token0Bought, uint256 token1Bought) {
        IUniswapV2Pair pair = IUniswapV2Pair(
            UniSwapV2FactoryAddress.getPair(_ToUnipoolToken0, _ToUnipoolToken1)
        );
        (uint256 res0, uint256 res1, ) = pair.getReserves();
        if (
            canSwapFromV2(_FromTokenContractAddress, _ToUnipoolToken0) &&
            canSwapFromV2(_ToUnipoolToken0, _ToUnipoolToken1)
        ) {
            token0Bought = swapFromV2(
                _FromTokenContractAddress,
                _ToUnipoolToken0,
                _amount
            );
            uint256 amountToSwap = calculateSwapInAmount(res0, token0Bought);
            //if no reserve or a new pair is created
            if (amountToSwap <= 0) amountToSwap = SafeMath.div(token0Bought, 2);
            token1Bought = swapFromV2(
                _ToUnipoolToken0,
                _ToUnipoolToken1,
                amountToSwap
            );
            token0Bought = SafeMath.sub(token0Bought, amountToSwap);
        } else if (
            canSwapFromV2(_FromTokenContractAddress, _ToUnipoolToken1) &&
            canSwapFromV2(_ToUnipoolToken0, _ToUnipoolToken1)
        ) {
            token1Bought = swapFromV2(
                _FromTokenContractAddress,
                _ToUnipoolToken1,
                _amount
            );
            uint256 amountToSwap = calculateSwapInAmount(res1, token1Bought);
            //if no reserve or a new pair is created
            if (amountToSwap <= 0) amountToSwap = SafeMath.div(token1Bought, 2);
            token0Bought = swapFromV2(
                _ToUnipoolToken1,
                _ToUnipoolToken0,
                amountToSwap
            );
            token1Bought = SafeMath.sub(token1Bought, amountToSwap);
        }
    }

    //checks if tokens can be exchanged with UniV1
    function canSwapFromV1(
        address _fromToken,
        address _toToken,
        uint256 fromAmount,
        uint256 toAmount
    ) public view returns (bool) {
        require(
            _fromToken != address(0) || _toToken != address(0),
            "Invalid Exchange values"
        );

        if (_fromToken == address(0)) {
            IUniswapExchange toExchange = IUniswapExchange(
                UniSwapV1FactoryAddress.getExchange(_toToken)
            );
            uint256 tokenBalance = IERC20(_toToken).balanceOf(
                address(toExchange)
            );
            uint256 ethBalance = address(toExchange).balance;
            if (tokenBalance > toAmount && ethBalance > fromAmount) return true;
        } else if (_toToken == address(0)) {
            IUniswapExchange fromExchange = IUniswapExchange(
                UniSwapV1FactoryAddress.getExchange(_fromToken)
            );
            uint256 tokenBalance = IERC20(_fromToken).balanceOf(
                address(fromExchange)
            );
            uint256 ethBalance = address(fromExchange).balance;
            if (tokenBalance > fromAmount && ethBalance > toAmount) return true;
        } else {
            IUniswapExchange toExchange = IUniswapExchange(
                UniSwapV1FactoryAddress.getExchange(_toToken)
            );
            IUniswapExchange fromExchange = IUniswapExchange(
                UniSwapV1FactoryAddress.getExchange(_fromToken)
            );
            uint256 balance1 = IERC20(_fromToken).balanceOf(
                address(fromExchange)
            );
            uint256 balance2 = IERC20(_toToken).balanceOf(address(toExchange));
            if (balance1 > fromAmount && balance2 > toAmount) return true;
        }
        return false;
    }

    //checks if tokens can be exchanged with UniV2
    function canSwapFromV2(address _fromToken, address _toToken)
        public
        view
        returns (bool)
    {
        require(
            _fromToken != address(0) || _toToken != address(0),
            "Invalid Exchange values"
        );

        if (_fromToken == _toToken) return true;

        if (_fromToken == address(0) || _fromToken == wethTokenAddress) {
            if (_toToken == wethTokenAddress || _toToken == address(0))
                return true;
            IUniswapV2Pair pair = IUniswapV2Pair(
                UniSwapV2FactoryAddress.getPair(_toToken, wethTokenAddress)
            );
            if (_haveReserve(pair)) return true;
        } else if (_toToken == address(0) || _toToken == wethTokenAddress) {
            if (_fromToken == wethTokenAddress || _fromToken == address(0))
                return true;
            IUniswapV2Pair pair = IUniswapV2Pair(
                UniSwapV2FactoryAddress.getPair(_fromToken, wethTokenAddress)
            );
            if (_haveReserve(pair)) return true;
        } else {
            IUniswapV2Pair pair1 = IUniswapV2Pair(
                UniSwapV2FactoryAddress.getPair(_fromToken, wethTokenAddress)
            );
            IUniswapV2Pair pair2 = IUniswapV2Pair(
                UniSwapV2FactoryAddress.getPair(_toToken, wethTokenAddress)
            );
            IUniswapV2Pair pair3 = IUniswapV2Pair(
                UniSwapV2FactoryAddress.getPair(_fromToken, _toToken)
            );
            if (_haveReserve(pair1) && _haveReserve(pair2)) return true;
            if (_haveReserve(pair3)) return true;
        }
        return false;
    }

    //checks if the UNI v2 contract have reserves to swap tokens
    function _haveReserve(IUniswapV2Pair pair) internal view returns (bool) {
        if (address(pair) != address(0)) {
            (uint256 res0, uint256 res1, ) = pair.getReserves();
            if (res0 > 0 && res1 > 0) {
                return true;
            }
        }
    }

    function calculateSwapInAmount(uint256 reserveIn, uint256 userIn)
        public
        pure
        returns (uint256)
    {
        return
            Babylonian
                .sqrt(
                reserveIn.mul(userIn.mul(3988000) + reserveIn.mul(3988009))
            )
                .sub(reserveIn.mul(1997)) / 1994;
    }

    //swaps _fromToken for _toToken
    //for eth, address(0) otherwise ERC token address
    function swapFromV2(
        address _fromToken,
        address _toToken,
        uint256 amount
    ) internal returns (uint256) {
        require(
            _fromToken != address(0) || _toToken != address(0),
            "Invalid Exchange values"
        );
        if (_fromToken == _toToken) return amount;

        require(canSwapFromV2(_fromToken, _toToken), "Cannot be exchanged");
        require(amount > 0, "Invalid amount");

        if (_fromToken == address(0)) {
            if (_toToken == wethTokenAddress) {
                IWETH(wethTokenAddress).deposit.value(amount)();
                return amount;
            }
            address[] memory path = new address[](2);
            path[0] = wethTokenAddress;
            path[1] = _toToken;

            uint256[] memory amounts = uniswapV2Router
                .swapExactETHForTokens
                .value(amount)(0, path, address(this), now + 180);
            return amounts[1];
        } else if (_toToken == address(0)) {
            if (_fromToken == wethTokenAddress) {
                IWETH(wethTokenAddress).withdraw(amount);
                return amount;
            }
            address[] memory path = new address[](2);
            TransferHelper.safeApprove(
                _fromToken,
                address(uniswapV2Router),
                amount
            );
            path[0] = _fromToken;
            path[1] = wethTokenAddress;

            uint256[] memory amounts = uniswapV2Router.swapExactTokensForETH(
                amount,
                0,
                path,
                address(this),
                now + 180
            );
            return amounts[1];
        } else {
            TransferHelper.safeApprove(
                _fromToken,
                address(uniswapV2Router),
                amount
            );
            uint256 returnedAmount = _swapTokenToTokenV2(
                _fromToken,
                _toToken,
                amount
            );
            require(returnedAmount > 0, "Error in swap");
            return returnedAmount;
        }
    }

    //swaps 2 ERC tokens (UniV2)
    function _swapTokenToTokenV2(
        address _fromToken,
        address _toToken,
        uint256 amount
    ) internal returns (uint256) {
        IUniswapV2Pair pair1 = IUniswapV2Pair(
            UniSwapV2FactoryAddress.getPair(_fromToken, wethTokenAddress)
        );
        IUniswapV2Pair pair2 = IUniswapV2Pair(
            UniSwapV2FactoryAddress.getPair(_toToken, wethTokenAddress)
        );
        IUniswapV2Pair pair3 = IUniswapV2Pair(
            UniSwapV2FactoryAddress.getPair(_fromToken, _toToken)
        );

        uint256[] memory amounts;

        if (_haveReserve(pair3)) {
            address[] memory path = new address[](2);
            path[0] = _fromToken;
            path[1] = _toToken;

            amounts = uniswapV2Router.swapExactTokensForTokens(
                amount,
                0,
                path,
                address(this),
                now + 180
            );
            return amounts[1];
        } else if (_haveReserve(pair1) && _haveReserve(pair2)) {
            address[] memory path = new address[](3);
            path[0] = _fromToken;
            path[1] = wethTokenAddress;
            path[2] = _toToken;

            amounts = uniswapV2Router.swapExactTokensForTokens(
                amount,
                0,
                path,
                address(this),
                now + 180
            );
            return amounts[2];
        }
        return 0;
    }

    /**
    @notice This function is used to buy tokens from eth
    @param _tokenContractAddress Token address which we want to buy
    @param _amount The amount of eth we want to exchange
    @return The quantity of token bought
     */
    function _eth2Token(
        address _tokenContractAddress,
        uint256 _amount
    ) internal returns (uint256 tokenBought) {
        IUniswapExchange FromUniSwapExchangeContractAddress = IUniswapExchange(
            UniSwapV1FactoryAddress.getExchange(_tokenContractAddress)
        );

        tokenBought = FromUniSwapExchangeContractAddress
            .ethToTokenSwapInput
            .value(_amount)(0, SafeMath.add(now, 300));
    }

    /**
    @notice This function is used to swap token with ETH
    @param _FromTokenContractAddress The token address to swap from
    @param tokens2Trade The quantity of tokens to swap
    @return The amount of eth bought
     */
    function _token2Eth(
        address _FromTokenContractAddress,
        uint256 tokens2Trade,
        address _toWhomToIssue
    ) internal returns (uint256 ethBought) {
        IUniswapExchange FromUniSwapExchangeContractAddress = IUniswapExchange(
            UniSwapV1FactoryAddress.getExchange(_FromTokenContractAddress)
        );

        TransferHelper.safeApprove(
            _FromTokenContractAddress,
            address(FromUniSwapExchangeContractAddress),
            tokens2Trade
        );

        ethBought = FromUniSwapExchangeContractAddress.tokenToEthTransferInput(
            tokens2Trade,
            0,
            SafeMath.add(now, 300),
            _toWhomToIssue
        );
        require(ethBought > 0, "Error in swapping Eth: 1");
    }

    /**
    @notice This function is used to swap tokens
    @param _FromTokenContractAddress The token address to swap from
    @param _ToWhomToIssue The address to transfer after swap
    @param _ToTokenContractAddress The token address to swap to
    @param tokens2Trade The quantity of tokens to swap
    @return The amount of tokens returned after swap
     */
    function _token2Token(
        address _FromTokenContractAddress,
        address _ToWhomToIssue,
        address _ToTokenContractAddress,
        uint256 tokens2Trade
    ) internal returns (uint256 tokenBought) {
        IUniswapExchange FromUniSwapExchangeContractAddress = IUniswapExchange(
            UniSwapV1FactoryAddress.getExchange(_FromTokenContractAddress)
        );

        TransferHelper.safeApprove(
            _FromTokenContractAddress,
            address(FromUniSwapExchangeContractAddress),
            tokens2Trade
        );

        tokenBought = FromUniSwapExchangeContractAddress
            .tokenToTokenTransferInput(
            tokens2Trade,
            0,
            0,
            SafeMath.add(now, 300),
            _ToWhomToIssue,
            _ToTokenContractAddress
        );
        require(tokenBought > 0, "Error in swapping ERC: 1");
    }

    /**
    @notice This function is used to calculate and transfer goodwill
    @param _tokenContractAddress Token in which goodwill is deducted
    @param tokens2Trade The total amount of tokens to be zapped in
    @return The quantity of goodwill deducted
     */
    function _transferGoodwill(
        address _tokenContractAddress,
        uint256 tokens2Trade
    ) internal returns (uint256 goodwillPortion) {
        goodwillPortion = SafeMath.div(
            SafeMath.mul(tokens2Trade, goodwill),
            10000
        );

        if (goodwillPortion == 0) {
            return 0;
        }

        TransferHelper.safeTransfer(
            _tokenContractAddress,
            dzgoodwillAddress,
            goodwillPortion
        );
    }

    function set_new_goodwill(uint16 _new_goodwill) public onlyOwner {
        require(
            _new_goodwill >= 0 && _new_goodwill < 10000,
            "GoodWill Value not allowed"
        );
        goodwill = _new_goodwill;
    }

    function set_new_dzgoodwillAddress(address _new_dzgoodwillAddress)
        public
        onlyOwner
    {
        dzgoodwillAddress = _new_dzgoodwillAddress;
    }

    function inCaseTokengetsStuck(IERC20 _TokenAddress) public onlyOwner {
        uint256 qty = _TokenAddress.balanceOf(address(this));
        TransferHelper.safeTransfer(address(_TokenAddress), owner(), qty);
    }

    // - to Pause the contract
    function toggleContractActive() public onlyOwner {
        stopped = !stopped;
    }

    // - to withdraw any ETH balance sitting in the contract
    function withdraw() public onlyOwner {
        uint256 contractBalance = address(this).balance;
        address payable _to = owner().toPayable();
        _to.transfer(contractBalance);
    }


    function() external payable {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint16","name":"_goodwill","type":"uint16"},{"internalType":"address","name":"_dzgoodwillAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"UniSwapV1FactoryAddress","outputs":[{"internalType":"contract IUniswapV1Factory","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UniSwapV2FactoryAddress","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_FromTokenContractAddress","type":"address"},{"internalType":"address","name":"_ToUnipoolToken0","type":"address"},{"internalType":"address","name":"_ToUnipoolToken1","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minPoolTokens","type":"uint256"}],"name":"ZapIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"_owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"userIn","type":"uint256"}],"name":"calculateSwapInAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_fromToken","type":"address"},{"internalType":"address","name":"_toToken","type":"address"},{"internalType":"uint256","name":"fromAmount","type":"uint256"},{"internalType":"uint256","name":"toAmount","type":"uint256"}],"name":"canSwapFromV1","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_fromToken","type":"address"},{"internalType":"address","name":"_toToken","type":"address"}],"name":"canSwapFromV2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dzgoodwillAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"goodwill","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"contract IERC20","name":"_TokenAddress","type":"address"}],"name":"inCaseTokengetsStuck","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new_dzgoodwillAddress","type":"address"}],"name":"set_new_dzgoodwillAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint16","name":"_new_goodwill","type":"uint16"}],"name":"set_new_goodwill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"toggleContractActive","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

60806040526000805460ff60a81b19169055600280546001600160a01b0319908116737a250d5630b4cf539739df2c5dacb4c659f2488d1790915560038054821673c0a47dfe034b400b47bdad5fecda2621de6c4d95179055600480548216735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f1790556005805490911673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2179055348015620000a257600080fd5b506040516200361c3803806200361c83398181016040526040811015620000c857600080fd5b5080516020909101516000805460ff19166001178155620000f16001600160e01b036200019e16565b60008054610100600160a81b0319166101006001600160a01b038416908102919091178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805461ffff9093167601000000000000000000000000000000000000000000000261ffff60b01b1990931692909217909155600180546001600160a01b039092166001600160a01b0319909216919091179055620001a2565b3390565b61346a80620001b26000396000f3fe6080604052600436106101145760003560e01c80638da5cb5b116100a0578063c28ac73d11610064578063c28ac73d14610366578063c3a8fcb01461037b578063e88c681414610390578063f27cf320146103a5578063f2fde38b146103e057610114565b80638da5cb5b146102b75780638f32d59b146102cc578063b10e1dbc146102e1578063b2bdfa7b1461030f578063b5090bdc1461032457610114565b8063551196d5116100e7578063551196d5146101ce5780635de0398e14610201578063715018a61461022d578063849e25f4146102425780638d7e41a81461027557610114565b80631385d24c146101165780631694505e1461012b5780633ccfd60b1461015c5780633f975d5f14610171575b005b34801561012257600080fd5b50610114610413565b34801561013757600080fd5b5061014061047b565b604080516001600160a01b039092168252519081900360200190f35b34801561016857600080fd5b5061011461048a565b34801561017d57600080fd5b506101ba6004803603608081101561019457600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013561052c565b604080519115158252519081900360200190f35b3480156101da57600080fd5b50610114600480360360208110156101f157600080fd5b50356001600160a01b0316610a2c565b34801561020d57600080fd5b50610216610b01565b6040805161ffff9092168252519081900360200190f35b34801561023957600080fd5b50610114610b12565b34801561024e57600080fd5b506101146004803603602081101561026557600080fd5b50356001600160a01b0316610ba8565b34801561028157600080fd5b506102a56004803603604081101561029857600080fd5b5080359060200135610c11565b60408051918252519081900360200190f35b3480156102c357600080fd5b50610140610c87565b3480156102d857600080fd5b506101ba610c9b565b3480156102ed57600080fd5b506101146004803603602081101561030457600080fd5b503561ffff16610cc4565b34801561031b57600080fd5b50610140610d87565b6102a5600480360360a081101561033a57600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060800135610d9b565b34801561037257600080fd5b50610140611086565b34801561038757600080fd5b50610140611095565b34801561039c57600080fd5b506101406110a4565b3480156103b157600080fd5b506101ba600480360360408110156103c857600080fd5b506001600160a01b03813581169160200135166110b3565b3480156103ec57600080fd5b506101146004803603602081101561040357600080fd5b50356001600160a01b03166114eb565b61041b610c9b565b61045a576040805162461bcd60e51b815260206004820181905260248201526000805160206133f2833981519152604482015290519081900360640190fd5b6000805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6002546001600160a01b031681565b610492610c9b565b6104d1576040805162461bcd60e51b815260206004820181905260248201526000805160206133f2833981519152604482015290519081900360640190fd5b303160006104ee6104e0610c87565b6001600160a01b031661153e565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610527573d6000803e3d6000fd5b505050565b60006001600160a01b03851615158061054d57506001600160a01b03841615155b610598576040805162461bcd60e51b8152602060048201526017602482015276496e76616c69642045786368616e67652076616c75657360481b604482015290519081900360640190fd5b6001600160a01b0385166106d357600354604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b1580156105f757600080fd5b505afa15801561060b573d6000803e3d6000fd5b505050506040513d602081101561062157600080fd5b5051604080516370a0823160e01b81526001600160a01b0380841660048301529151929350600092918816916370a0823191602480820192602092909190829003018186803b15801561067357600080fd5b505afa158015610687573d6000803e3d6000fd5b505050506040513d602081101561069d57600080fd5b505190506001600160a01b0382163184821180156106ba57508581115b156106cb5760019350505050610a24565b505050610a20565b6001600160a01b03841661080557600354604080516303795fb160e11b81526001600160a01b038881166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561073257600080fd5b505afa158015610746573d6000803e3d6000fd5b505050506040513d602081101561075c57600080fd5b5051604080516370a0823160e01b81526001600160a01b0380841660048301529151929350600092918916916370a0823191602480820192602092909190829003018186803b1580156107ae57600080fd5b505afa1580156107c2573d6000803e3d6000fd5b505050506040513d60208110156107d857600080fd5b505190506001600160a01b0382163185821180156106ba5750848111156106cb5760019350505050610a24565b600354604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561085657600080fd5b505afa15801561086a573d6000803e3d6000fd5b505050506040513d602081101561088057600080fd5b5051600354604080516303795fb160e11b81526001600160a01b038a81166004830152915193945060009391909216916306f2bf62916024808301926020929190829003018186803b1580156108d557600080fd5b505afa1580156108e9573d6000803e3d6000fd5b505050506040513d60208110156108ff57600080fd5b5051604080516370a0823160e01b81526001600160a01b0380841660048301529151929350600092918a16916370a0823191602480820192602092909190829003018186803b15801561095157600080fd5b505afa158015610965573d6000803e3d6000fd5b505050506040513d602081101561097b57600080fd5b5051604080516370a0823160e01b81526001600160a01b0386811660048301529151929350600092918a16916370a0823191602480820192602092909190829003018186803b1580156109cd57600080fd5b505afa1580156109e1573d6000803e3d6000fd5b505050506040513d60208110156109f757600080fd5b505190508682118015610a0957508581115b15610a1b576001945050505050610a24565b505050505b5060005b949350505050565b610a34610c9b565b610a73576040805162461bcd60e51b815260206004820181905260248201526000805160206133f2833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015610abd57600080fd5b505afa158015610ad1573d6000803e3d6000fd5b505050506040513d6020811015610ae757600080fd5b50519050610afd82610af7610c87565b83611545565b5050565b600054600160b01b900461ffff1681565b610b1a610c9b565b610b59576040805162461bcd60e51b815260206004820181905260248201526000805160206133f2833981519152604482015290519081900360640190fd5b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b610bb0610c9b565b610bef576040805162461bcd60e51b815260206004820181905260248201526000805160206133f2833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006107ca610c76610c2b856107cd63ffffffff6116af16565b610c6a610c65610c4488623cda2963ffffffff6116af16565b610c5788623cda2063ffffffff6116af16565b89910163ffffffff6116af16565b61170f565b9063ffffffff61176016565b81610c7d57fe5b0490505b92915050565b60005461010090046001600160a01b031690565b6000805461010090046001600160a01b0316610cb56117a2565b6001600160a01b031614905090565b610ccc610c9b565b610d0b576040805162461bcd60e51b815260206004820181905260248201526000805160206133f2833981519152604482015290519081900360640190fd5b6127108161ffff1610610d65576040805162461bcd60e51b815260206004820152601a60248201527f476f6f6457696c6c2056616c7565206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b6000805461ffff909216600160b01b0261ffff60b01b19909216919091179055565b60005461010090046001600160a01b031681565b6000805460ff16610df3576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff191690819055600160a81b900460ff1615610e50576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b60006001600160a01b038716610eb25760003411610eab576040805162461bcd60e51b8152602060048201526013602482015272115c9c9bdc8e88115512081b9bdd081cd95b9d606a1b604482015290519081900360640190fd5b5034610f5b565b3415610ef7576040805162461bcd60e51b815260206004820152600f60248201526e115c9c9bdc8e88115512081cd95b9d608a1b604482015290519081900360640190fd5b60008411610f4c576040805162461bcd60e51b815260206004820152601960248201527f4572726f723a20496e76616c69642045524320616d6f756e7400000000000000604482015290519081900360640190fd5b610f58873330876117a6565b50825b6000610f6988888885611903565b905083811015610fb5576040805162461bcd60e51b81526020600482015260126024820152714552523a204869676820536c69707061676560701b604482015290519081900360640190fd5b600480546040805163e6a4390560e01b81526001600160a01b038b811694820194909452898416602482015290516000939092169163e6a4390591604480820192602092909190829003018186803b15801561101057600080fd5b505afa158015611024573d6000803e3d6000fd5b505050506040513d602081101561103a57600080fd5b50519050600061104a8284611b4d565b9050611060823361105b8685611760565b611545565b61106a8382611760565b9450505050506000805460ff1916600117905595945050505050565b6003546001600160a01b031681565b6001546001600160a01b031681565b6004546001600160a01b031681565b60006001600160a01b0383161515806110d457506001600160a01b03821615155b61111f576040805162461bcd60e51b8152602060048201526017602482015276496e76616c69642045786368616e67652076616c75657360481b604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b0316141561114157506001610c81565b6001600160a01b038316158061116457506005546001600160a01b038481169116145b15611242576005546001600160a01b038381169116148061118c57506001600160a01b038216155b1561119957506001610c81565b600480546005546040805163e6a4390560e01b81526001600160a01b03878116958201959095529184166024830152516000939092169163e6a4390591604480820192602092909190829003018186803b1580156111f657600080fd5b505afa15801561120a573d6000803e3d6000fd5b505050506040513d602081101561122057600080fd5b5051905061122d81611b9a565b1561123c576001915050610c81565b506114e2565b6001600160a01b038216158061126557506005546001600160a01b038381169116145b156112f7576005546001600160a01b038481169116148061128d57506001600160a01b038316155b1561129a57506001610c81565b600480546005546040805163e6a4390560e01b81526001600160a01b03888116958201959095529184166024830152516000939092169163e6a4390591604480820192602092909190829003018186803b1580156111f657600080fd5b600480546005546040805163e6a4390560e01b81526001600160a01b03888116958201959095529184166024830152516000939092169163e6a4390591604480820192602092909190829003018186803b15801561135457600080fd5b505afa158015611368573d6000803e3d6000fd5b505050506040513d602081101561137e57600080fd5b5051600480546005546040805163e6a4390560e01b81526001600160a01b0389811695820195909552918416602483015251939450600093929091169163e6a4390591604480820192602092909190829003018186803b1580156113e157600080fd5b505afa1580156113f5573d6000803e3d6000fd5b505050506040513d602081101561140b57600080fd5b5051600480546040805163e6a4390560e01b81526001600160a01b038a81169482019490945288841660248201529051939450600093929091169163e6a4390591604480820192602092909190829003018186803b15801561146c57600080fd5b505afa158015611480573d6000803e3d6000fd5b505050506040513d602081101561149657600080fd5b505190506114a383611b9a565b80156114b357506114b382611b9a565b156114c45760019350505050610c81565b6114cd81611b9a565b156114de5760019350505050610c81565b5050505b50600092915050565b6114f3610c9b565b611532576040805162461bcd60e51b815260206004820181905260248201526000805160206133f2833981519152604482015290519081900360640190fd5b61153b81611c50565b50565b805b919050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106115c25780518252601f1990920191602091820191016115a3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611624576040519150601f19603f3d011682016040523d82523d6000602084013e611629565b606091505b5091509150818015611657575080511580611657575080806020019051602081101561165457600080fd5b50515b6116a8576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6000826116be57506000610c81565b828202828482816116cb57fe5b04146117085760405162461bcd60e51b81526004018080602001828103825260218152602001806133d16021913960400191505060405180910390fd5b9392505050565b60006003821115611752575080600160028204015b8181101561174c5780915060028182858161173b57fe5b04018161174457fe5b049050611724565b50611540565b811561154057506001919050565b600061170883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611cfb565b3390565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831061182b5780518252601f19909201916020918201910161180c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461188d576040519150601f19603f3d011682016040523d82523d6000602084013e611892565b606091505b50915091508180156118c05750805115806118c057508080602001905160208110156118bd57600080fd5b50515b6118fb5760405162461bcd60e51b81526004018080602001828103825260248152602001806134126024913960400191505060405180910390fd5b505050505050565b600080600061191286866110b3565b1561192d5761192387878787611d92565b9092509050611950565b6119398686868761052c565b156119505761194a87878787611f90565b90925090505b6000821180156119605750600081115b6119a6576040805162461bcd60e51b8152602060048201526012602482015271436f756c64206e6f742065786368616e676560701b604482015290519081900360640190fd5b6002546119be9087906001600160a01b0316846121fb565b6002546119d69086906001600160a01b0316836121fb565b6002546040805162e8e33760e81b81526001600160a01b0389811660048301528881166024830152604482018690526064820185905260016084830181905260a48301523060c4830152603c420160e483015291516000938493849391169163e8e33700916101048082019260609290919082900301818787803b158015611a5d57600080fd5b505af1158015611a71573d6000803e3d6000fd5b505050506040513d6060811015611a8757600080fd5b50805160208201516040909201519094509092509050600080611aaa8786611760565b1115611ae957611aba8a8c6110b3565b15611ada57611ad38a8c611ace8988611760565b61235e565b9050611ae9565b611ae98a3361105b8988611760565b6000611af58685611760565b1115611b2e57611b05898c6110b3565b15611b1f57611b19898c611ace8887611760565b01611b2e565b611b2e893361105b8887611760565b8015611b3f57611b3f8b3383611545565b509998505050505050505050565b60008054611b7390611b6b908490600160b01b900461ffff166116af565b61271061299d565b905080611b8257506000610c81565b600154610c819084906001600160a01b031683611545565b60006001600160a01b0382161561154057600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611be757600080fd5b505afa158015611bfb573d6000803e3d6000fd5b505050506040513d6060811015611c1157600080fd5b5080516020909101516001600160701b0391821693501690508115801590611c395750600081115b15611c4957600192505050611540565b5050919050565b6001600160a01b038116611c955760405162461bcd60e51b81526004018080602001828103825260268152602001806133ab6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60008184841115611d8a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d4f578181015183820152602001611d37565b50505050905090810190601f168015611d7c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600480546040805163e6a4390560e01b81526001600160a01b0387811694820194909452858416602482015290516000938493849391169163e6a4390591604480820192602092909190829003018186803b158015611df057600080fd5b505afa158015611e04573d6000803e3d6000fd5b505050506040513d6020811015611e1a57600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b158015611e6557600080fd5b505afa158015611e79573d6000803e3d6000fd5b505050506040513d6060811015611e8f57600080fd5b5080516020909101516001600160701b039182169350169050611eb289896110b3565b8015611ec35750611ec388886110b3565b15611f1857611ed389898861235e565b94506000611ee18387610c11565b905060008111611ef957611ef686600261299d565b90505b611f0489898361235e565b9450611f108682611760565b955050611f84565b611f2289886110b3565b8015611f335750611f3388886110b3565b15611f8457611f4389888861235e565b93506000611f518286610c11565b905060008111611f6957611f6685600261299d565b90505b611f74888a8361235e565b9550611f808582611760565b9450505b50505094509492505050565b600480546040805163e6a4390560e01b81526001600160a01b0387811694820194909452858416602482015290516000938493849391169163e6a4390591604480820192602092909190829003018186803b158015611fee57600080fd5b505afa158015612002573d6000803e3d6000fd5b505050506040513d602081101561201857600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b15801561206357600080fd5b505afa158015612077573d6000803e3d6000fd5b505050506040513d606081101561208d57600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b0389166120ee576120be88876129df565b945060006120cc8387610c11565b9050600081116120e4576120e186600261299d565b90505b611f0488826129df565b886001600160a01b0316886001600160a01b031614156121445760006121148388610c11565b90506000811161212c5761212987600261299d565b90505b6121388a308a84612aeb565b9450611f108782611760565b886001600160a01b0316876001600160a01b031614156121a257600061216a8288610c11565b9050600081116121825761217f87600261299d565b90505b61218e8a308b84612aeb565b955061219a8782611760565b945050611f84565b6121ae89308a89612aeb565b945060006121bc8387610c11565b9050600081116121d4576121d187600261299d565b90505b6121e08a308a84612aeb565b94506121ec8682611760565b95505050505094509492505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b602083106122785780518252601f199092019160209182019101612259565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146122da576040519150601f19603f3d011682016040523d82523d6000602084013e6122df565b606091505b509150915081801561230d57508051158061230d575080806020019051602081101561230a57600080fd5b50515b6116a8576040805162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604482015290519081900360640190fd5b60006001600160a01b03841615158061237f57506001600160a01b03831615155b6123ca576040805162461bcd60e51b8152602060048201526017602482015276496e76616c69642045786368616e67652076616c75657360481b604482015290519081900360640190fd5b826001600160a01b0316846001600160a01b031614156123eb575080611708565b6123f584846110b3565b61243c576040805162461bcd60e51b815260206004820152601360248201527210d85b9b9bdd08189948195e18da185b99d959606a1b604482015290519081900360640190fd5b60008211612482576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b6001600160a01b038416612724576005546001600160a01b038481169116141561251757600560009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156124f657600080fd5b505af115801561250a573d6000803e3d6000fd5b5050505050819050611708565b6040805160028082526060808301845292602083019080388339505060055482519293506001600160a01b03169183915060009061255157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838160018151811061257f57fe5b6001600160a01b03928316602091820292909201810191909152600254604051637ff36ab560e01b8152600060048201818152306044840181905260b44201606485018190526080602486019081528951608487015289516060999790971697637ff36ab5978d978c96939260a49091019187820191028083838b5b838110156126135781810151838201526020016125fb565b50505050905001955050505050506000604051808303818588803b15801561263a57600080fd5b505af115801561264e573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561267857600080fd5b810190808051604051939291908464010000000082111561269857600080fd5b9083019060208201858111156126ad57600080fd5b82518660208202830111640100000000821117156126ca57600080fd5b82525081516020918201928201910280838360005b838110156126f75781810151838201526020016126df565b5050505090500160405250505090508060018151811061271357fe5b602002602001015192505050611708565b6001600160a01b03831661292a576005546001600160a01b03858116911614156127b55760055460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b15801561279557600080fd5b505af11580156127a9573d6000803e3d6000fd5b50505050819050611708565b604080516002808252606080830184529260208301908038833950506002549192506127ed918791506001600160a01b0316856121fb565b84816000815181106127fb57fe5b6001600160a01b03928316602091820292909201015260055482519116908290600190811061282657fe5b6001600160a01b039283166020918202929092018101919091526002546040516318cbafe560e01b815260048101878152600060248301819052306064840181905260b442016084850181905260a060448601908152895160a4870152895160609997909716976318cbafe5978d9795968c9690939260c49091019187820191028083838b5b838110156128c45781810151838201526020016128ac565b505050509050019650505050505050600060405180830381600087803b1580156128ed57600080fd5b505af1158015612901573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561267857600080fd5b6002546129429085906001600160a01b0316846121fb565b600061294f858585612c86565b905060008111612996576040805162461bcd60e51b815260206004820152600d60248201526c04572726f7220696e207377617609c1b604482015290519081900360640190fd5b9050611708565b600061170883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506132eb565b600354604080516303795fb160e11b81526001600160a01b0385811660048301529151600093849316916306f2bf62916024808301926020929190829003018186803b158015612a2e57600080fd5b505afa158015612a42573d6000803e3d6000fd5b505050506040513d6020811015612a5857600080fd5b505190506001600160a01b03811663f39b5b9b846000612a7a4261012c613350565b6040518463ffffffff1660e01b815260040180838152602001828152602001925050506020604051808303818588803b158015612ab657600080fd5b505af1158015612aca573d6000803e3d6000fd5b50505050506040513d6020811015612ae157600080fd5b5051949350505050565b600354604080516303795fb160e11b81526001600160a01b0387811660048301529151600093849316916306f2bf62916024808301926020929190829003018186803b158015612b3a57600080fd5b505afa158015612b4e573d6000803e3d6000fd5b505050506040513d6020811015612b6457600080fd5b50519050612b738682856121fb565b806001600160a01b031663f552d91b84600080612b924261012c613350565b604080516001600160e01b031960e088901b16815260048101959095526024850193909352604484019190915260648301526001600160a01b03808a166084840152881660a48301525160c48083019260209291908290030181600087803b158015612bfd57600080fd5b505af1158015612c11573d6000803e3d6000fd5b505050506040513d6020811015612c2757600080fd5b5051915081612c7d576040805162461bcd60e51b815260206004820152601860248201527f4572726f7220696e207377617070696e67204552433a20310000000000000000604482015290519081900360640190fd5b50949350505050565b600480546005546040805163e6a4390560e01b81526001600160a01b03888116958201959095529184166024830152516000938493169163e6a43905916044808301926020929190829003018186803b158015612ce257600080fd5b505afa158015612cf6573d6000803e3d6000fd5b505050506040513d6020811015612d0c57600080fd5b5051600480546005546040805163e6a4390560e01b81526001600160a01b038a811695820195909552918416602483015251939450600093929091169163e6a4390591604480820192602092909190829003018186803b158015612d6f57600080fd5b505afa158015612d83573d6000803e3d6000fd5b505050506040513d6020811015612d9957600080fd5b5051600480546040805163e6a4390560e01b81526001600160a01b038b81169482019490945289841660248201529051939450600093929091169163e6a4390591604480820192602092909190829003018186803b158015612dfa57600080fd5b505afa158015612e0e573d6000803e3d6000fd5b505050506040513d6020811015612e2457600080fd5b505190506060612e3382611b9a565b1561306f5760408051600280825260608083018452926020830190803883390190505090508881600081518110612e6657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508781600181518110612e9457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600260009054906101000a90046001600160a01b03166001600160a01b03166338ed173988600084304260b4016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015612f5a578181015183820152602001612f42565b505050509050019650505050505050600060405180830381600087803b158015612f8357600080fd5b505af1158015612f97573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612fc057600080fd5b8101908080516040519392919084640100000000821115612fe057600080fd5b908301906020820185811115612ff557600080fd5b825186602082028301116401000000008211171561301257600080fd5b82525081516020918201928201910280838360005b8381101561303f578181015183820152602001613027565b5050505090500160405250505091508160018151811061305b57fe5b602002602001015195505050505050611708565b61307884611b9a565b8015613088575061308883611b9a565b156132dd576040805160038082526080820190925260609160208201838038833901905050905088816000815181106130bd57fe5b6001600160a01b0392831660209182029290920101526005548251911690829060019081106130e857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050878160028151811061311657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600260009054906101000a90046001600160a01b03166001600160a01b03166338ed173988600084304260b4016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156131dc5781810151838201526020016131c4565b505050509050019650505050505050600060405180830381600087803b15801561320557600080fd5b505af1158015613219573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561324257600080fd5b810190808051604051939291908464010000000082111561326257600080fd5b90830190602082018581111561327757600080fd5b825186602082028301116401000000008211171561329457600080fd5b82525081516020918201928201910280838360005b838110156132c15781810151838201526020016132a9565b5050505090500160405250505091508160028151811061305b57fe5b506000979650505050505050565b6000818361333a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611d4f578181015183820152602001611d37565b50600083858161334657fe5b0495945050505050565b600082820183811015611708576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a265627a7a723158200566c1ace9e63322cffb7acfdd1b5c5e14d1e8cc28b312231e5c69e4250bb79664736f6c634300050c00320000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e737b6afec2320f616297e59445b60a11e3ef75f

Deployed Bytecode

0x6080604052600436106101145760003560e01c80638da5cb5b116100a0578063c28ac73d11610064578063c28ac73d14610366578063c3a8fcb01461037b578063e88c681414610390578063f27cf320146103a5578063f2fde38b146103e057610114565b80638da5cb5b146102b75780638f32d59b146102cc578063b10e1dbc146102e1578063b2bdfa7b1461030f578063b5090bdc1461032457610114565b8063551196d5116100e7578063551196d5146101ce5780635de0398e14610201578063715018a61461022d578063849e25f4146102425780638d7e41a81461027557610114565b80631385d24c146101165780631694505e1461012b5780633ccfd60b1461015c5780633f975d5f14610171575b005b34801561012257600080fd5b50610114610413565b34801561013757600080fd5b5061014061047b565b604080516001600160a01b039092168252519081900360200190f35b34801561016857600080fd5b5061011461048a565b34801561017d57600080fd5b506101ba6004803603608081101561019457600080fd5b506001600160a01b0381358116916020810135909116906040810135906060013561052c565b604080519115158252519081900360200190f35b3480156101da57600080fd5b50610114600480360360208110156101f157600080fd5b50356001600160a01b0316610a2c565b34801561020d57600080fd5b50610216610b01565b6040805161ffff9092168252519081900360200190f35b34801561023957600080fd5b50610114610b12565b34801561024e57600080fd5b506101146004803603602081101561026557600080fd5b50356001600160a01b0316610ba8565b34801561028157600080fd5b506102a56004803603604081101561029857600080fd5b5080359060200135610c11565b60408051918252519081900360200190f35b3480156102c357600080fd5b50610140610c87565b3480156102d857600080fd5b506101ba610c9b565b3480156102ed57600080fd5b506101146004803603602081101561030457600080fd5b503561ffff16610cc4565b34801561031b57600080fd5b50610140610d87565b6102a5600480360360a081101561033a57600080fd5b506001600160a01b03813581169160208101358216916040820135169060608101359060800135610d9b565b34801561037257600080fd5b50610140611086565b34801561038757600080fd5b50610140611095565b34801561039c57600080fd5b506101406110a4565b3480156103b157600080fd5b506101ba600480360360408110156103c857600080fd5b506001600160a01b03813581169160200135166110b3565b3480156103ec57600080fd5b506101146004803603602081101561040357600080fd5b50356001600160a01b03166114eb565b61041b610c9b565b61045a576040805162461bcd60e51b815260206004820181905260248201526000805160206133f2833981519152604482015290519081900360640190fd5b6000805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6002546001600160a01b031681565b610492610c9b565b6104d1576040805162461bcd60e51b815260206004820181905260248201526000805160206133f2833981519152604482015290519081900360640190fd5b303160006104ee6104e0610c87565b6001600160a01b031661153e565b6040519091506001600160a01b0382169083156108fc029084906000818181858888f19350505050158015610527573d6000803e3d6000fd5b505050565b60006001600160a01b03851615158061054d57506001600160a01b03841615155b610598576040805162461bcd60e51b8152602060048201526017602482015276496e76616c69642045786368616e67652076616c75657360481b604482015290519081900360640190fd5b6001600160a01b0385166106d357600354604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b1580156105f757600080fd5b505afa15801561060b573d6000803e3d6000fd5b505050506040513d602081101561062157600080fd5b5051604080516370a0823160e01b81526001600160a01b0380841660048301529151929350600092918816916370a0823191602480820192602092909190829003018186803b15801561067357600080fd5b505afa158015610687573d6000803e3d6000fd5b505050506040513d602081101561069d57600080fd5b505190506001600160a01b0382163184821180156106ba57508581115b156106cb5760019350505050610a24565b505050610a20565b6001600160a01b03841661080557600354604080516303795fb160e11b81526001600160a01b038881166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561073257600080fd5b505afa158015610746573d6000803e3d6000fd5b505050506040513d602081101561075c57600080fd5b5051604080516370a0823160e01b81526001600160a01b0380841660048301529151929350600092918916916370a0823191602480820192602092909190829003018186803b1580156107ae57600080fd5b505afa1580156107c2573d6000803e3d6000fd5b505050506040513d60208110156107d857600080fd5b505190506001600160a01b0382163185821180156106ba5750848111156106cb5760019350505050610a24565b600354604080516303795fb160e11b81526001600160a01b038781166004830152915160009392909216916306f2bf6291602480820192602092909190829003018186803b15801561085657600080fd5b505afa15801561086a573d6000803e3d6000fd5b505050506040513d602081101561088057600080fd5b5051600354604080516303795fb160e11b81526001600160a01b038a81166004830152915193945060009391909216916306f2bf62916024808301926020929190829003018186803b1580156108d557600080fd5b505afa1580156108e9573d6000803e3d6000fd5b505050506040513d60208110156108ff57600080fd5b5051604080516370a0823160e01b81526001600160a01b0380841660048301529151929350600092918a16916370a0823191602480820192602092909190829003018186803b15801561095157600080fd5b505afa158015610965573d6000803e3d6000fd5b505050506040513d602081101561097b57600080fd5b5051604080516370a0823160e01b81526001600160a01b0386811660048301529151929350600092918a16916370a0823191602480820192602092909190829003018186803b1580156109cd57600080fd5b505afa1580156109e1573d6000803e3d6000fd5b505050506040513d60208110156109f757600080fd5b505190508682118015610a0957508581115b15610a1b576001945050505050610a24565b505050505b5060005b949350505050565b610a34610c9b565b610a73576040805162461bcd60e51b815260206004820181905260248201526000805160206133f2833981519152604482015290519081900360640190fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b158015610abd57600080fd5b505afa158015610ad1573d6000803e3d6000fd5b505050506040513d6020811015610ae757600080fd5b50519050610afd82610af7610c87565b83611545565b5050565b600054600160b01b900461ffff1681565b610b1a610c9b565b610b59576040805162461bcd60e51b815260206004820181905260248201526000805160206133f2833981519152604482015290519081900360640190fd5b600080546040516101009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360008054610100600160a81b0319169055565b610bb0610c9b565b610bef576040805162461bcd60e51b815260206004820181905260248201526000805160206133f2833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006107ca610c76610c2b856107cd63ffffffff6116af16565b610c6a610c65610c4488623cda2963ffffffff6116af16565b610c5788623cda2063ffffffff6116af16565b89910163ffffffff6116af16565b61170f565b9063ffffffff61176016565b81610c7d57fe5b0490505b92915050565b60005461010090046001600160a01b031690565b6000805461010090046001600160a01b0316610cb56117a2565b6001600160a01b031614905090565b610ccc610c9b565b610d0b576040805162461bcd60e51b815260206004820181905260248201526000805160206133f2833981519152604482015290519081900360640190fd5b6127108161ffff1610610d65576040805162461bcd60e51b815260206004820152601a60248201527f476f6f6457696c6c2056616c7565206e6f7420616c6c6f776564000000000000604482015290519081900360640190fd5b6000805461ffff909216600160b01b0261ffff60b01b19909216919091179055565b60005461010090046001600160a01b031681565b6000805460ff16610df3576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6000805460ff191690819055600160a81b900460ff1615610e50576040805162461bcd60e51b815260206004820152601260248201527115195b5c1bdc985c9a5b1e4814185d5cd95960721b604482015290519081900360640190fd5b60006001600160a01b038716610eb25760003411610eab576040805162461bcd60e51b8152602060048201526013602482015272115c9c9bdc8e88115512081b9bdd081cd95b9d606a1b604482015290519081900360640190fd5b5034610f5b565b3415610ef7576040805162461bcd60e51b815260206004820152600f60248201526e115c9c9bdc8e88115512081cd95b9d608a1b604482015290519081900360640190fd5b60008411610f4c576040805162461bcd60e51b815260206004820152601960248201527f4572726f723a20496e76616c69642045524320616d6f756e7400000000000000604482015290519081900360640190fd5b610f58873330876117a6565b50825b6000610f6988888885611903565b905083811015610fb5576040805162461bcd60e51b81526020600482015260126024820152714552523a204869676820536c69707061676560701b604482015290519081900360640190fd5b600480546040805163e6a4390560e01b81526001600160a01b038b811694820194909452898416602482015290516000939092169163e6a4390591604480820192602092909190829003018186803b15801561101057600080fd5b505afa158015611024573d6000803e3d6000fd5b505050506040513d602081101561103a57600080fd5b50519050600061104a8284611b4d565b9050611060823361105b8685611760565b611545565b61106a8382611760565b9450505050506000805460ff1916600117905595945050505050565b6003546001600160a01b031681565b6001546001600160a01b031681565b6004546001600160a01b031681565b60006001600160a01b0383161515806110d457506001600160a01b03821615155b61111f576040805162461bcd60e51b8152602060048201526017602482015276496e76616c69642045786368616e67652076616c75657360481b604482015290519081900360640190fd5b816001600160a01b0316836001600160a01b0316141561114157506001610c81565b6001600160a01b038316158061116457506005546001600160a01b038481169116145b15611242576005546001600160a01b038381169116148061118c57506001600160a01b038216155b1561119957506001610c81565b600480546005546040805163e6a4390560e01b81526001600160a01b03878116958201959095529184166024830152516000939092169163e6a4390591604480820192602092909190829003018186803b1580156111f657600080fd5b505afa15801561120a573d6000803e3d6000fd5b505050506040513d602081101561122057600080fd5b5051905061122d81611b9a565b1561123c576001915050610c81565b506114e2565b6001600160a01b038216158061126557506005546001600160a01b038381169116145b156112f7576005546001600160a01b038481169116148061128d57506001600160a01b038316155b1561129a57506001610c81565b600480546005546040805163e6a4390560e01b81526001600160a01b03888116958201959095529184166024830152516000939092169163e6a4390591604480820192602092909190829003018186803b1580156111f657600080fd5b600480546005546040805163e6a4390560e01b81526001600160a01b03888116958201959095529184166024830152516000939092169163e6a4390591604480820192602092909190829003018186803b15801561135457600080fd5b505afa158015611368573d6000803e3d6000fd5b505050506040513d602081101561137e57600080fd5b5051600480546005546040805163e6a4390560e01b81526001600160a01b0389811695820195909552918416602483015251939450600093929091169163e6a4390591604480820192602092909190829003018186803b1580156113e157600080fd5b505afa1580156113f5573d6000803e3d6000fd5b505050506040513d602081101561140b57600080fd5b5051600480546040805163e6a4390560e01b81526001600160a01b038a81169482019490945288841660248201529051939450600093929091169163e6a4390591604480820192602092909190829003018186803b15801561146c57600080fd5b505afa158015611480573d6000803e3d6000fd5b505050506040513d602081101561149657600080fd5b505190506114a383611b9a565b80156114b357506114b382611b9a565b156114c45760019350505050610c81565b6114cd81611b9a565b156114de5760019350505050610c81565b5050505b50600092915050565b6114f3610c9b565b611532576040805162461bcd60e51b815260206004820181905260248201526000805160206133f2833981519152604482015290519081900360640190fd5b61153b81611c50565b50565b805b919050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106115c25780518252601f1990920191602091820191016115a3565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611624576040519150601f19603f3d011682016040523d82523d6000602084013e611629565b606091505b5091509150818015611657575080511580611657575080806020019051602081101561165457600080fd5b50515b6116a8576040805162461bcd60e51b815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6000826116be57506000610c81565b828202828482816116cb57fe5b04146117085760405162461bcd60e51b81526004018080602001828103825260218152602001806133d16021913960400191505060405180910390fd5b9392505050565b60006003821115611752575080600160028204015b8181101561174c5780915060028182858161173b57fe5b04018161174457fe5b049050611724565b50611540565b811561154057506001919050565b600061170883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611cfb565b3390565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831061182b5780518252601f19909201916020918201910161180c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461188d576040519150601f19603f3d011682016040523d82523d6000602084013e611892565b606091505b50915091508180156118c05750805115806118c057508080602001905160208110156118bd57600080fd5b50515b6118fb5760405162461bcd60e51b81526004018080602001828103825260248152602001806134126024913960400191505060405180910390fd5b505050505050565b600080600061191286866110b3565b1561192d5761192387878787611d92565b9092509050611950565b6119398686868761052c565b156119505761194a87878787611f90565b90925090505b6000821180156119605750600081115b6119a6576040805162461bcd60e51b8152602060048201526012602482015271436f756c64206e6f742065786368616e676560701b604482015290519081900360640190fd5b6002546119be9087906001600160a01b0316846121fb565b6002546119d69086906001600160a01b0316836121fb565b6002546040805162e8e33760e81b81526001600160a01b0389811660048301528881166024830152604482018690526064820185905260016084830181905260a48301523060c4830152603c420160e483015291516000938493849391169163e8e33700916101048082019260609290919082900301818787803b158015611a5d57600080fd5b505af1158015611a71573d6000803e3d6000fd5b505050506040513d6060811015611a8757600080fd5b50805160208201516040909201519094509092509050600080611aaa8786611760565b1115611ae957611aba8a8c6110b3565b15611ada57611ad38a8c611ace8988611760565b61235e565b9050611ae9565b611ae98a3361105b8988611760565b6000611af58685611760565b1115611b2e57611b05898c6110b3565b15611b1f57611b19898c611ace8887611760565b01611b2e565b611b2e893361105b8887611760565b8015611b3f57611b3f8b3383611545565b509998505050505050505050565b60008054611b7390611b6b908490600160b01b900461ffff166116af565b61271061299d565b905080611b8257506000610c81565b600154610c819084906001600160a01b031683611545565b60006001600160a01b0382161561154057600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015611be757600080fd5b505afa158015611bfb573d6000803e3d6000fd5b505050506040513d6060811015611c1157600080fd5b5080516020909101516001600160701b0391821693501690508115801590611c395750600081115b15611c4957600192505050611540565b5050919050565b6001600160a01b038116611c955760405162461bcd60e51b81526004018080602001828103825260268152602001806133ab6026913960400191505060405180910390fd5b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60008184841115611d8a5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d4f578181015183820152602001611d37565b50505050905090810190601f168015611d7c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600480546040805163e6a4390560e01b81526001600160a01b0387811694820194909452858416602482015290516000938493849391169163e6a4390591604480820192602092909190829003018186803b158015611df057600080fd5b505afa158015611e04573d6000803e3d6000fd5b505050506040513d6020811015611e1a57600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b158015611e6557600080fd5b505afa158015611e79573d6000803e3d6000fd5b505050506040513d6060811015611e8f57600080fd5b5080516020909101516001600160701b039182169350169050611eb289896110b3565b8015611ec35750611ec388886110b3565b15611f1857611ed389898861235e565b94506000611ee18387610c11565b905060008111611ef957611ef686600261299d565b90505b611f0489898361235e565b9450611f108682611760565b955050611f84565b611f2289886110b3565b8015611f335750611f3388886110b3565b15611f8457611f4389888861235e565b93506000611f518286610c11565b905060008111611f6957611f6685600261299d565b90505b611f74888a8361235e565b9550611f808582611760565b9450505b50505094509492505050565b600480546040805163e6a4390560e01b81526001600160a01b0387811694820194909452858416602482015290516000938493849391169163e6a4390591604480820192602092909190829003018186803b158015611fee57600080fd5b505afa158015612002573d6000803e3d6000fd5b505050506040513d602081101561201857600080fd5b505160408051630240bc6b60e21b8152905191925060009182916001600160a01b03851691630902f1ac91600480820192606092909190829003018186803b15801561206357600080fd5b505afa158015612077573d6000803e3d6000fd5b505050506040513d606081101561208d57600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b0389166120ee576120be88876129df565b945060006120cc8387610c11565b9050600081116120e4576120e186600261299d565b90505b611f0488826129df565b886001600160a01b0316886001600160a01b031614156121445760006121148388610c11565b90506000811161212c5761212987600261299d565b90505b6121388a308a84612aeb565b9450611f108782611760565b886001600160a01b0316876001600160a01b031614156121a257600061216a8288610c11565b9050600081116121825761217f87600261299d565b90505b61218e8a308b84612aeb565b955061219a8782611760565b945050611f84565b6121ae89308a89612aeb565b945060006121bc8387610c11565b9050600081116121d4576121d187600261299d565b90505b6121e08a308a84612aeb565b94506121ec8682611760565b95505050505094509492505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663095ea7b360e01b178152925182516000946060949389169392918291908083835b602083106122785780518252601f199092019160209182019101612259565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146122da576040519150601f19603f3d011682016040523d82523d6000602084013e6122df565b606091505b509150915081801561230d57508051158061230d575080806020019051602081101561230a57600080fd5b50515b6116a8576040805162461bcd60e51b815260206004820152601e60248201527f5472616e7366657248656c7065723a20415050524f56455f4641494c45440000604482015290519081900360640190fd5b60006001600160a01b03841615158061237f57506001600160a01b03831615155b6123ca576040805162461bcd60e51b8152602060048201526017602482015276496e76616c69642045786368616e67652076616c75657360481b604482015290519081900360640190fd5b826001600160a01b0316846001600160a01b031614156123eb575080611708565b6123f584846110b3565b61243c576040805162461bcd60e51b815260206004820152601360248201527210d85b9b9bdd08189948195e18da185b99d959606a1b604482015290519081900360640190fd5b60008211612482576040805162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015290519081900360640190fd5b6001600160a01b038416612724576005546001600160a01b038481169116141561251757600560009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b1580156124f657600080fd5b505af115801561250a573d6000803e3d6000fd5b5050505050819050611708565b6040805160028082526060808301845292602083019080388339505060055482519293506001600160a01b03169183915060009061255157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050838160018151811061257f57fe5b6001600160a01b03928316602091820292909201810191909152600254604051637ff36ab560e01b8152600060048201818152306044840181905260b44201606485018190526080602486019081528951608487015289516060999790971697637ff36ab5978d978c96939260a49091019187820191028083838b5b838110156126135781810151838201526020016125fb565b50505050905001955050505050506000604051808303818588803b15801561263a57600080fd5b505af115801561264e573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052602081101561267857600080fd5b810190808051604051939291908464010000000082111561269857600080fd5b9083019060208201858111156126ad57600080fd5b82518660208202830111640100000000821117156126ca57600080fd5b82525081516020918201928201910280838360005b838110156126f75781810151838201526020016126df565b5050505090500160405250505090508060018151811061271357fe5b602002602001015192505050611708565b6001600160a01b03831661292a576005546001600160a01b03858116911614156127b55760055460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b15801561279557600080fd5b505af11580156127a9573d6000803e3d6000fd5b50505050819050611708565b604080516002808252606080830184529260208301908038833950506002549192506127ed918791506001600160a01b0316856121fb565b84816000815181106127fb57fe5b6001600160a01b03928316602091820292909201015260055482519116908290600190811061282657fe5b6001600160a01b039283166020918202929092018101919091526002546040516318cbafe560e01b815260048101878152600060248301819052306064840181905260b442016084850181905260a060448601908152895160a4870152895160609997909716976318cbafe5978d9795968c9690939260c49091019187820191028083838b5b838110156128c45781810151838201526020016128ac565b505050509050019650505050505050600060405180830381600087803b1580156128ed57600080fd5b505af1158015612901573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561267857600080fd5b6002546129429085906001600160a01b0316846121fb565b600061294f858585612c86565b905060008111612996576040805162461bcd60e51b815260206004820152600d60248201526c04572726f7220696e207377617609c1b604482015290519081900360640190fd5b9050611708565b600061170883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506132eb565b600354604080516303795fb160e11b81526001600160a01b0385811660048301529151600093849316916306f2bf62916024808301926020929190829003018186803b158015612a2e57600080fd5b505afa158015612a42573d6000803e3d6000fd5b505050506040513d6020811015612a5857600080fd5b505190506001600160a01b03811663f39b5b9b846000612a7a4261012c613350565b6040518463ffffffff1660e01b815260040180838152602001828152602001925050506020604051808303818588803b158015612ab657600080fd5b505af1158015612aca573d6000803e3d6000fd5b50505050506040513d6020811015612ae157600080fd5b5051949350505050565b600354604080516303795fb160e11b81526001600160a01b0387811660048301529151600093849316916306f2bf62916024808301926020929190829003018186803b158015612b3a57600080fd5b505afa158015612b4e573d6000803e3d6000fd5b505050506040513d6020811015612b6457600080fd5b50519050612b738682856121fb565b806001600160a01b031663f552d91b84600080612b924261012c613350565b604080516001600160e01b031960e088901b16815260048101959095526024850193909352604484019190915260648301526001600160a01b03808a166084840152881660a48301525160c48083019260209291908290030181600087803b158015612bfd57600080fd5b505af1158015612c11573d6000803e3d6000fd5b505050506040513d6020811015612c2757600080fd5b5051915081612c7d576040805162461bcd60e51b815260206004820152601860248201527f4572726f7220696e207377617070696e67204552433a20310000000000000000604482015290519081900360640190fd5b50949350505050565b600480546005546040805163e6a4390560e01b81526001600160a01b03888116958201959095529184166024830152516000938493169163e6a43905916044808301926020929190829003018186803b158015612ce257600080fd5b505afa158015612cf6573d6000803e3d6000fd5b505050506040513d6020811015612d0c57600080fd5b5051600480546005546040805163e6a4390560e01b81526001600160a01b038a811695820195909552918416602483015251939450600093929091169163e6a4390591604480820192602092909190829003018186803b158015612d6f57600080fd5b505afa158015612d83573d6000803e3d6000fd5b505050506040513d6020811015612d9957600080fd5b5051600480546040805163e6a4390560e01b81526001600160a01b038b81169482019490945289841660248201529051939450600093929091169163e6a4390591604480820192602092909190829003018186803b158015612dfa57600080fd5b505afa158015612e0e573d6000803e3d6000fd5b505050506040513d6020811015612e2457600080fd5b505190506060612e3382611b9a565b1561306f5760408051600280825260608083018452926020830190803883390190505090508881600081518110612e6657fe5b60200260200101906001600160a01b031690816001600160a01b0316815250508781600181518110612e9457fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600260009054906101000a90046001600160a01b03166001600160a01b03166338ed173988600084304260b4016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015612f5a578181015183820152602001612f42565b505050509050019650505050505050600060405180830381600087803b158015612f8357600080fd5b505af1158015612f97573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526020811015612fc057600080fd5b8101908080516040519392919084640100000000821115612fe057600080fd5b908301906020820185811115612ff557600080fd5b825186602082028301116401000000008211171561301257600080fd5b82525081516020918201928201910280838360005b8381101561303f578181015183820152602001613027565b5050505090500160405250505091508160018151811061305b57fe5b602002602001015195505050505050611708565b61307884611b9a565b8015613088575061308883611b9a565b156132dd576040805160038082526080820190925260609160208201838038833901905050905088816000815181106130bd57fe5b6001600160a01b0392831660209182029290920101526005548251911690829060019081106130e857fe5b60200260200101906001600160a01b031690816001600160a01b031681525050878160028151811061311657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600260009054906101000a90046001600160a01b03166001600160a01b03166338ed173988600084304260b4016040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03166001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156131dc5781810151838201526020016131c4565b505050509050019650505050505050600060405180830381600087803b15801561320557600080fd5b505af1158015613219573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561324257600080fd5b810190808051604051939291908464010000000082111561326257600080fd5b90830190602082018581111561327757600080fd5b825186602082028301116401000000008211171561329457600080fd5b82525081516020918201928201910280838360005b838110156132c15781810151838201526020016132a9565b5050505090500160405250505091508160028151811061305b57fe5b506000979650505050505050565b6000818361333a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611d4f578181015183820152602001611d37565b50600083858161334657fe5b0495945050505050565b600082820183811015611708576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a265627a7a723158200566c1ace9e63322cffb7acfdd1b5c5e14d1e8cc28b312231e5c69e4250bb79664736f6c634300050c0032

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

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e737b6afec2320f616297e59445b60a11e3ef75f

-----Decoded View---------------
Arg [0] : _goodwill (uint16): 0
Arg [1] : _dzgoodwillAddress (address): 0xE737b6AfEC2320f616297e59445b60a11e3eF75F

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 000000000000000000000000e737b6afec2320f616297e59445b60a11e3ef75f


Deployed Bytecode Sourcemap

27557:24208:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51371:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51371:86:0;;;:::i;27798:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27798:122:0;;;:::i;:::-;;;;-1:-1:-1;;;;;27798:122:0;;;;;;;;;;;;;;51527:195;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51527:195:0;;;:::i;38801:1824::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38801:1824:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;38801:1824:0;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;51115:216;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51115:216:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51115:216:0;-1:-1:-1;;;;;51115:216:0;;:::i;27728:22::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27728:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13773:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13773:140:0;;;:::i;50939:168::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50939:168:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50939:168:0;-1:-1:-1;;;;;50939:168:0;;:::i;42731:343::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42731:343:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42731:343:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;12962:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12962:79:0;;;:::i;13328:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13328:94:0;;;:::i;50693:238::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50693:238:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50693:238:0;;;;:::i;12481:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12481:29:0;;;:::i;29150:1617::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;29150:1617:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27929:128::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27929:128:0;;;:::i;27757:32::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27757:32:0;;;:::i;28066:128::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28066:128:0;;;:::i;40685:1677::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40685:1677:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;40685:1677:0;;;;;;;;;;:::i;14068:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14068:117:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14068:117:0;-1:-1:-1;;;;;14068:117:0;;:::i;51371:86::-;13174:9;:7;:9::i;:::-;13166:54;;;;;-1:-1:-1;;;13166:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13166:54:0;;;;;;;;;;;;;;;51442:7;;;-1:-1:-1;;;;51431:18:0;;-1:-1:-1;;;51442:7:0;;;;;;51441:8;51431:18;;;;;;51371:86::o;27798:122::-;;;-1:-1:-1;;;;;27798:122:0;;:::o;51527:195::-;13174:9;:7;:9::i;:::-;13166:54;;;;;-1:-1:-1;;;13166:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13166:54:0;;;;;;;;;;;;;;;51609:4;51601:21;51575:23;51655:19;:7;:5;:7::i;:::-;-1:-1:-1;;;;;51655:17:0;;:19::i;:::-;51685:29;;51633:41;;-1:-1:-1;;;;;;51685:12:0;;;:29;;;;;51698:15;;51685:29;;;;51698:15;51685:12;:29;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51685:29:0;13231:1;;51527:195::o;38801:1824::-;38964:4;-1:-1:-1;;;;;39003:24:0;;;;;:50;;-1:-1:-1;;;;;;39031:22:0;;;;39003:50;38981:123;;;;;-1:-1:-1;;;38981:123:0;;;;;;;;;;;;-1:-1:-1;;;38981:123:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39121:24:0;;39117:1478;;39227:23;;:45;;;-1:-1:-1;;;39227:45:0;;-1:-1:-1;;;;;39227:45:0;;;;;;;;;39162:27;;39227:23;;;;;:35;;:45;;;;;;;;;;;;;;;:23;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;39227:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39227:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39227:45:0;39325:79;;;-1:-1:-1;;;39325:79:0;;-1:-1:-1;;;;;39325:79:0;;;;;;;;;39227:45;;-1:-1:-1;39302:20:0;;39325:26;;;;;;:79;;;;;39227:45;;39325:79;;;;;;;;:26;:79;;;5:2:-1;;;;30:1;27;20:12;5:2;39325:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39325:79:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39325:79:0;;-1:-1:-1;;;;;;39440:27:0;;;39486:23;;;:50;;;;;39526:10;39513;:23;39486:50;39482:67;;;39545:4;39538:11;;;;;;;39482:67;39117:1478;;;;;;-1:-1:-1;;;;;39571:22:0;;39567:1028;;39677:23;;:47;;;-1:-1:-1;;;39677:47:0;;-1:-1:-1;;;;;39677:47:0;;;;;;;;;39610:29;;39677:23;;;;;:35;;:47;;;;;;;;;;;;;;;:23;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;39677:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39677:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39677:47:0;39777:83;;;-1:-1:-1;;;39777:83:0;;-1:-1:-1;;;;;39777:83:0;;;;;;;;;39677:47;;-1:-1:-1;39754:20:0;;39777:28;;;;;;:83;;;;;39677:47;;39777:83;;;;;;;;:28;:83;;;5:2:-1;;;;30:1;27;20:12;5:2;39777:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39777:83:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39777:83:0;;-1:-1:-1;;;;;;39896:29:0;;;39944:25;;;:50;;;;;39986:8;39973:10;:21;39940:67;;;40003:4;39996:11;;;;;;;39567:1028;40105:23;;:45;;;-1:-1:-1;;;40105:45:0;;-1:-1:-1;;;;;40105:45:0;;;;;;;;;40040:27;;40105:23;;;;;:35;;:45;;;;;;;;;;;;;;;:23;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;40105:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40105:45:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40105:45:0;40247:23;;:47;;;-1:-1:-1;;;40247:47:0;;-1:-1:-1;;;;;40247:47:0;;;;;;;;;40105:45;;-1:-1:-1;40180:29:0;;40247:23;;;;;:35;;:47;;;;;40105:45;;40247:47;;;;;;;:23;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;40247:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40247:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40247:47:0;40343:83;;;-1:-1:-1;;;40343:83:0;;-1:-1:-1;;;;;40343:83:0;;;;;;;;;40247:47;;-1:-1:-1;40324:16:0;;40343:28;;;;;;:83;;;;;40247:47;;40343:83;;;;;;;;:28;:83;;;5:2:-1;;;;30:1;27;20:12;5:2;40343:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40343:83:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40343:83:0;40460:47;;;-1:-1:-1;;;40460:47:0;;-1:-1:-1;;;;;40460:47:0;;;;;;;;;40343:83;;-1:-1:-1;40441:16:0;;40460:26;;;;;;:47;;;;;40343:83;;40460:47;;;;;;;;:26;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;40460:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40460:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40460:47:0;;-1:-1:-1;40526:21:0;;;:44;;;;;40562:8;40551;:19;40526:44;40522:61;;;40579:4;40572:11;;;;;;;;40522:61;39567:1028;;;;;-1:-1:-1;40612:5:0;38801:1824;;;;;;;:::o;51115:216::-;13174:9;:7;:9::i;:::-;13166:54;;;;;-1:-1:-1;;;13166:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13166:54:0;;;;;;;;;;;;;;;51209:38;;;-1:-1:-1;;;51209:38:0;;51241:4;51209:38;;;;;;51195:11;;-1:-1:-1;;;;;51209:23:0;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;51209:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51209:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51209:38:0;;-1:-1:-1;51258:65:0;51294:13;51310:7;:5;:7::i;:::-;51319:3;51258:27;:65::i;:::-;13231:1;51115:216;:::o;27728:22::-;;;-1:-1:-1;;;27728:22:0;;;;;:::o;13773:140::-;13174:9;:7;:9::i;:::-;13166:54;;;;;-1:-1:-1;;;13166:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13166:54:0;;;;;;;;;;;;;;;13872:1;13856:6;;13835:40;;13856:6;;;;-1:-1:-1;;;;;13856:6:0;;13835:40;;13872:1;;13835:40;13903:1;13886:19;;-1:-1:-1;;;;;;13886:19:0;;;13773:140::o;50939:168::-;13174:9;:7;:9::i;:::-;13166:54;;;;;-1:-1:-1;;;13166:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13166:54:0;;;;;;;;;;;;;;;51057:17;:42;;-1:-1:-1;;;;;;51057:42:0;-1:-1:-1;;;;;51057:42:0;;;;;;;;;;50939:168::o;42731:343::-;42845:7;43062:4;42890:169;43039:19;:9;43053:4;43039:19;:13;:19;:::i;:::-;42890:126;42942:59;42978:22;:9;42992:7;42978:22;:13;:22;:::i;:::-;42956:19;:6;42967:7;42956:19;:10;:19;:::i;:::-;42942:9;;42956:44;42942:59;:13;:59;:::i;:::-;42890:33;:126::i;:::-;:148;:169;:148;:169;:::i;:::-;:176;;;;;;42870:196;;42731:343;;;;;:::o;12962:79::-;13000:7;13027:6;;;;-1:-1:-1;;;;;13027:6:0;;12962:79::o;13328:94::-;13368:4;13408:6;;;;;-1:-1:-1;;;;;13408:6:0;13392:12;:10;:12::i;:::-;-1:-1:-1;;;;;13392:22:0;;13385:29;;13328:94;:::o;50693:238::-;13174:9;:7;:9::i;:::-;13166:54;;;;;-1:-1:-1;;;13166:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13166:54:0;;;;;;;;;;;;;;;50829:5;50813:13;:21;;;50769:119;;;;;-1:-1:-1;;;50769:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;50899:8;:24;;;;;;-1:-1:-1;;;50899:24:0;-1:-1:-1;;;;50899:24:0;;;;;;;;;50693:238::o;12481:29::-;;;;;;-1:-1:-1;;;;;12481:29:0;;:::o;29150:1617::-;29395:7;7463:11;;;;7455:55;;;;;-1:-1:-1;;;7455:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7602:5;7588:19;;-1:-1:-1;;7588:19:0;;;;;-1:-1:-1;;;28541:7:0;;7588:19;28541:7;28537:102;;;28565:28;;;-1:-1:-1;;;28565:28:0;;;;;;;;;;;;-1:-1:-1;;;28565:28:0;;;;;;;;;;;;;;28537:102;29415:16;-1:-1:-1;;;;;29446:39:0;;29442:516;;29522:1;29510:9;:13;29502:45;;;;;-1:-1:-1;;;29502:45:0;;;;;;;;;;;;-1:-1:-1;;;29502:45:0;;;;;;;;;;;;;;;-1:-1:-1;29573:9:0;29442:516;;;29623:9;:14;29615:42;;;;;-1:-1:-1;;;29615:42:0;;;;;;;;;;;;-1:-1:-1;;;29615:42:0;;;;;;;;;;;;;;;29690:1;29680:7;:11;29672:49;;;;;-1:-1:-1;;;29672:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;29736:177;29786:25;29830:10;29867:4;29891:7;29736:31;:177::i;:::-;-1:-1:-1;29939:7:0;29442:516;29970:16;29989:149;30017:25;30057:16;30088;30119:8;29989:13;:149::i;:::-;29970:168;;30179:14;30167:8;:26;;30159:57;;;;;-1:-1:-1;;;30159:57:0;;;;;;;;;;;;-1:-1:-1;;;30159:57:0;;;;;;;;;;;;;;;30285:23;;;:104;;;-1:-1:-1;;;30285:104:0;;-1:-1:-1;;;;;30285:104:0;;;;;;;;;;;;;;;;;;;30257:25;;30285:23;;;;:31;;:104;;;;;;;;;;;;;;;:23;:104;;;5:2:-1;;;;30:1;27;20:12;5:2;30285:104:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30285:104:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30285:104:0;;-1:-1:-1;30431:23:0;30457:83;30285:104;30521:8;30457:17;:83::i;:::-;30431:109;;30553:149;30595:17;30627:10;30652:39;30665:8;30675:15;30652:12;:39::i;:::-;30553:27;:149::i;:::-;30720:39;30733:8;30743:15;30720:12;:39::i;:::-;30713:46;;;;;;7768:11;:18;;-1:-1:-1;;7768:18:0;7782:4;7768:18;;;29150:1617;;-1:-1:-1;;;;;29150:1617:0:o;27929:128::-;;;-1:-1:-1;;;;;27929:128:0;;:::o;27757:32::-;;;-1:-1:-1;;;;;27757:32:0;;:::o;28066:128::-;;;-1:-1:-1;;;;;28066:128:0;;:::o;40685:1677::-;40794:4;-1:-1:-1;;;;;40838:24:0;;;;;:50;;-1:-1:-1;;;;;;40866:22:0;;;;40838:50;40816:123;;;;;-1:-1:-1;;;40816:123:0;;;;;;;;;;;;-1:-1:-1;;;40816:123:0;;;;;;;;;;;;;;;40970:8;-1:-1:-1;;;;;40956:22:0;:10;-1:-1:-1;;;;;40956:22:0;;40952:39;;;-1:-1:-1;40987:4:0;40980:11;;40952:39;-1:-1:-1;;;;;41008:24:0;;;;:58;;-1:-1:-1;41050:16:0;;-1:-1:-1;;;;;41036:30:0;;;41050:16;;41036:30;41008:58;41004:1328;;;41099:16;;-1:-1:-1;;;;;41087:28:0;;;41099:16;;41087:28;;:54;;-1:-1:-1;;;;;;41119:22:0;;;41087:54;41083:88;;;-1:-1:-1;41167:4:0;41160:11;;41083:88;41241:23;;;41283:16;;41241:59;;;-1:-1:-1;;;41241:59:0;;-1:-1:-1;;;;;41241:59:0;;;;;;;;;;41283:16;;;41241:59;;;;;41186:19;;41241:23;;;;:31;;:59;;;;;;;;;;;;;;;:23;:59;;;5:2:-1;;;;30:1;27;20:12;5:2;41241:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41241:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41241:59:0;;-1:-1:-1;41334:18:0;41241:59;41334:12;:18::i;:::-;41330:35;;;41361:4;41354:11;;;;;41330:35;41004:1328;;;;-1:-1:-1;;;;;41387:22:0;;;;:54;;-1:-1:-1;41425:16:0;;-1:-1:-1;;;;;41413:28:0;;;41425:16;;41413:28;41387:54;41383:949;;;41476:16;;-1:-1:-1;;;;;41462:30:0;;;41476:16;;41462:30;;:58;;-1:-1:-1;;;;;;41496:24:0;;;41462:58;41458:92;;;-1:-1:-1;41546:4:0;41539:11;;41458:92;41620:23;;;41664:16;;41620:61;;;-1:-1:-1;;;41620:61:0;;-1:-1:-1;;;;;41620:61:0;;;;;;;;;;41664:16;;;41620:61;;;;;41565:19;;41620:23;;;;:31;;:61;;;;;;;;;;;;;;;:23;:61;;;5:2:-1;;;;30:1;27;20:12;41383:949:0;41835:23;;;41879:16;;41835:61;;;-1:-1:-1;;;41835:61:0;;-1:-1:-1;;;;;41835:61:0;;;;;;;;;;41879:16;;;41835:61;;;;;41779:20;;41835:23;;;;:31;;:61;;;;;;;;;;;;;;;:23;:61;;;5:2:-1;;;;30:1;27;20:12;5:2;41835:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41835:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41835:61:0;41982:23;;;42024:16;;41982:59;;;-1:-1:-1;;;41982:59:0;;-1:-1:-1;;;;;41982:59:0;;;;;;;;;;42024:16;;;41982:59;;;;;41835:61;;-1:-1:-1;41926:20:0;;41982:23;;;;;:31;;:59;;;;;41835:61;;41982:59;;;;;;;;:23;:59;;;5:2:-1;;;;30:1;27;20:12;5:2;41982:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41982:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41982:59:0;42127:23;;;:53;;;-1:-1:-1;;;42127:53:0;;-1:-1:-1;;;;;42127:53:0;;;;;;;;;;;;;;;;;;;41982:59;;-1:-1:-1;42071:20:0;;42127:23;;;;;:31;;:53;;;;;41982:59;;42127:53;;;;;;;;:23;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;42127:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42127:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42127:53:0;;-1:-1:-1;42214:19:0;42227:5;42214:12;:19::i;:::-;:42;;;;;42237:19;42250:5;42237:12;:19::i;:::-;42210:59;;;42265:4;42258:11;;;;;;;42210:59;42288:19;42301:5;42288:12;:19::i;:::-;42284:36;;;42316:4;42309:11;;;;;;;42284:36;41383:949;;;;-1:-1:-1;42349:5:0;40685:1677;;;;:::o;14068:117::-;13174:9;:7;:9::i;:::-;13166:54;;;;;-1:-1:-1;;;13166:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;13166:54:0;;;;;;;;;;;;;;;14149:28;14168:8;14149:18;:28::i;:::-;14068:117;:::o;9368:127::-;9478:7;9368:127;;;;:::o;20606:459::-;20852:45;;;-1:-1:-1;;;;;20852:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20852:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20827:81:0;;;;20792:12;;20806:17;;20827:10;;;;20852:45;20827:81;;;25:18:-1;20827:81:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20827:81:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;20791:117:0;;;;20941:7;:57;;;;-1:-1:-1;20953:11:0;;:16;;:44;;;20984:4;20973:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20973:24:0;20953:44;20919:138;;;;;-1:-1:-1;;;20919:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20606:459;;;;;:::o;16800:471::-;16858:7;17103:6;17099:47;;-1:-1:-1;17133:1:0;17126:8;;17099:47;17170:5;;;17174:1;17170;:5;:1;17194:5;;;;;:10;17186:56;;;;-1:-1:-1;;;17186:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17262:1;16800:471;-1:-1:-1;;;16800:471:0:o;21677:335::-;21725:9;21755:1;21751;:5;21747:235;;;-1:-1:-1;21777:1:0;21813;21809;21805:5;;:9;21829:92;21840:1;21836;:5;21829:92;;;21866:1;21862:5;;21904:1;21899;21895;21891;:5;;;;;;:9;21890:15;;;;;;21886:19;;21829:92;;;21747:235;;;;21942:6;;21938:44;;-1:-1:-1;21969:1:0;21677:335;;;:::o;15884:136::-;15942:7;15969:43;15973:1;15976;15969:43;;;;;;;;;;;;;;;;;:3;:43::i;11678:98::-;11758:10;11678:98;:::o;21073:509::-;21358:51;;;-1:-1:-1;;;;;21358:51:0;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;21358:51:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;21333:87:0;;;;21298:12;;21312:17;;21333:10;;;;21358:51;21333:87;;;25:18:-1;21333:87:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;21333:87:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;21297:123:0;;;;21453:7;:57;;;;-1:-1:-1;21465:11:0;;:16;;:44;;;21496:4;21485:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21485:24:0;21465:44;21431:143;;;;-1:-1:-1;;;21431:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21073:509;;;;;;:::o;30775:3003::-;30963:7;30983:20;31014;31051:49;31065:16;31083;31051:13;:49::i;:::-;31047:616;;;31148:171;31183:25;31227:16;31262;31297:7;31148:16;:171::i;:::-;31117:202;;-1:-1:-1;31117:202:0;-1:-1:-1;31047:616:0;;;31355:67;31369:16;31387;31405:7;31414;31355:13;:67::i;:::-;31337:326;;;31480:171;31515:25;31559:16;31594;31629:7;31480:16;:171::i;:::-;31449:202;;-1:-1:-1;31449:202:0;-1:-1:-1;31337:326:0;31698:1;31683:12;:16;:36;;;;;31718:1;31703:12;:16;31683:36;31675:67;;;;;-1:-1:-1;;;31675:67:0;;;;;;;;;;;;-1:-1:-1;;;31675:67:0;;;;;;;;;;;;;;;31835:15;;31755:134;;31796:16;;-1:-1:-1;;;;;31835:15:0;31866:12;31755:26;:134::i;:::-;31982:15;;31902:134;;31943:16;;-1:-1:-1;;;;;31982:15:0;32013:12;31902:26;:134::i;:::-;32098:15;;:252;;;-1:-1:-1;;;32098:252:0;;-1:-1:-1;;;;;32098:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:252;;;;;;;;;;32311:4;32098:252;;;;32337:2;32331:3;:8;32098:252;;;;;;32050:15;;;;;;32098;;;:42;;:252;;;;;;;;;;;;;;;32050:15;32098;:252;;;5:2:-1;;;;30:1;27;20:12;5:2;32098:252:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32098:252:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32098:252:0;;;;;;;;;;;;;-1:-1:-1;32098:252:0;;-1:-1:-1;32098:252:0;-1:-1:-1;32363:15:0;;32393:35;32406:12;32098:252;32393:12;:35::i;:::-;:39;32389:571;;;32453:58;32467:16;32485:25;32453:13;:58::i;:::-;32449:500;;;32542:174;32575:16;32614:25;32662:35;32675:12;32689:7;32662:12;:35::i;:::-;32542:10;:174::i;:::-;32532:184;;32449:500;;;32757:176;32807:16;32846:10;32879:35;32892:12;32906:7;32879:12;:35::i;32757:176::-;33014:1;32976:35;32989:12;33003:7;32976:12;:35::i;:::-;:39;32972:572;;;33036:58;33050:16;33068:25;33036:13;:58::i;:::-;33032:501;;;33126:174;33159:16;33198:25;33246:35;33259:12;33273:7;33246:12;:35::i;33126:174::-;33115:185;33032:501;;;33341:176;33391:16;33430:10;33463:35;33476:12;33490:7;33463:12;:35::i;33341:176::-;33560:11;;33556:185;;33588:141;33634:25;33678:10;33707:7;33588:27;:141::i;:::-;-1:-1:-1;33768:2:0;30775:3003;-1:-1:-1;;;;;;;;;30775:3003:0:o;50184:501::-;50307:23;50415:8;;50361:94;;50388:36;;50401:12;;-1:-1:-1;;;50415:8:0;;;;50388:12;:36::i;:::-;50439:5;50361:12;:94::i;:::-;50343:112;-1:-1:-1;50472:20:0;50468:61;;-1:-1:-1;50516:1:0;50509:8;;50468:61;50619:17;;50541:136;;50583:21;;-1:-1:-1;;;;;50619:17:0;50651:15;50541:27;:136::i;42436:287::-;42502:4;-1:-1:-1;;;;;42523:27:0;;;42519:197;;42568:12;42582;42600:4;-1:-1:-1;;;;;42600:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42600:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42600:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42600:18:0;;;;;;;-1:-1:-1;;;;;42567:51:0;;;;-1:-1:-1;42567:51:0;;-1:-1:-1;42637:8:0;;;;;:20;;;42656:1;42649:4;:8;42637:20;42633:72;;;42685:4;42678:11;;;;;;42633:72;42519:197;;42436:287;;;:::o;14291:237::-;-1:-1:-1;;;;;14373:22:0;;14365:73;;;;-1:-1:-1;;;14365:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14475:6;;;14454:38;;-1:-1:-1;;;;;14454:38:0;;;;14475:6;;;;;;14454:38;;;14503:6;:17;;-1:-1:-1;;;;;14503:17:0;;;;;-1:-1:-1;;;;;;14503:17:0;;;;;;;;;14291:237::o;16357:192::-;16443:7;16479:12;16471:6;;;;16463:29;;;;-1:-1:-1;;;16463:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;16463:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16515:5:0;;;16357:192::o;36746:1995::-;37043:23;;;:67;;;-1:-1:-1;;;37043:67:0;;-1:-1:-1;;;;;37043:67:0;;;;;;;;;;;;;;;;;;;36937:20;;;;;;37043:23;;;:31;;:67;;;;;;;;;;;;;;;:23;:67;;;5:2:-1;;;;30:1;27;20:12;5:2;37043:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37043:67:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37043:67:0;37165:18;;;-1:-1:-1;;;37165:18:0;;;;37043:67;;-1:-1:-1;37133:12:0;;;;-1:-1:-1;;;;;37165:16:0;;;;;:18;;;;;;;;;;;;;;;:16;:18;;;5:2:-1;;;;30:1;27;20:12;5:2;37165:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37165:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37165:18:0;;;;;;;-1:-1:-1;;;;;37132:51:0;;;;-1:-1:-1;37132:51:0;;-1:-1:-1;37212:58:0;37226:25;37253:16;37212:13;:58::i;:::-;:124;;;;;37287:49;37301:16;37319;37287:13;:49::i;:::-;37194:1540;;;37378:130;37407:25;37451:16;37486:7;37378:10;:130::i;:::-;37363:145;;37523:20;37546:41;37568:4;37574:12;37546:21;:41::i;:::-;37523:64;;37676:1;37660:12;:17;37656:67;;37694:29;37707:12;37721:1;37694:12;:29::i;:::-;37679:44;;37656:67;37753:126;37782:16;37817;37852:12;37753:10;:126::i;:::-;37738:141;;37909:40;37922:12;37936;37909;:40::i;:::-;37894:55;;37194:1540;;;;37985:58;37999:25;38026:16;37985:13;:58::i;:::-;:124;;;;;38060:49;38074:16;38092;38060:13;:49::i;:::-;37967:767;;;38151:130;38180:25;38224:16;38259:7;38151:10;:130::i;:::-;38136:145;;38296:20;38319:41;38341:4;38347:12;38319:21;:41::i;:::-;38296:64;;38449:1;38433:12;:17;38429:67;;38467:29;38480:12;38494:1;38467:12;:29::i;:::-;38452:44;;38429:67;38526:126;38555:16;38590;38625:12;38526:10;:126::i;:::-;38511:141;;38682:40;38695:12;38709;38682;:40::i;:::-;38667:55;;37967:767;;36746:1995;;;;;;;;;;:::o;33786:2952::-;34083:23;;;:67;;;-1:-1:-1;;;34083:67:0;;-1:-1:-1;;;;;34083:67:0;;;;;;;;;;;;;;;;;;;33977:20;;;;;;34083:23;;;:31;;:67;;;;;;;;;;;;;;;:23;:67;;;5:2:-1;;;;30:1;27;20:12;5:2;34083:67:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34083:67:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34083:67:0;34205:18;;;-1:-1:-1;;;34205:18:0;;;;34083:67;;-1:-1:-1;34173:12:0;;;;-1:-1:-1;;;;;34205:16:0;;;;;:18;;;;;;;;;;;;;;;:16;:18;;;5:2:-1;;;;30:1;27;20:12;5:2;34205:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34205:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34205:18:0;;;;;;;-1:-1:-1;;;;;34172:51:0;;;;-1:-1:-1;34172:51:0;;-1:-1:-1;;;;;;34238:39:0;;34234:2497;;34309:37;34320:16;34338:7;34309:10;:37::i;:::-;34294:52;;34361:20;34384:41;34406:4;34412:12;34384:21;:41::i;:::-;34361:64;;34514:1;34498:12;:17;34494:67;;34532:29;34545:12;34559:1;34532:12;:29::i;:::-;34517:44;;34494:67;34591:42;34602:16;34620:12;34591:10;:42::i;34234:2497::-;34760:25;-1:-1:-1;;;;;34740:45:0;:16;-1:-1:-1;;;;;34740:45:0;;34736:1984;;;34806:20;34829:36;34851:4;34857:7;34829:21;:36::i;:::-;34806:59;;34962:1;34946:12;:17;34942:62;;34980:24;34993:7;35002:1;34980:12;:24::i;:::-;34965:39;;34942:62;35038:189;35073:25;35129:4;35157:16;35196:12;35038;:189::i;:::-;35023:204;;35263:35;35276:7;35285:12;35263;:35::i;34736:1984::-;35344:25;-1:-1:-1;;;;;35324:45:0;:16;-1:-1:-1;;;;;35324:45:0;;35320:1400;;;35390:20;35413:36;35435:4;35441:7;35413:21;:36::i;:::-;35390:59;;35546:1;35530:12;:17;35526:62;;35564:24;35577:7;35586:1;35564:12;:24::i;:::-;35549:39;;35526:62;35622:189;35657:25;35713:4;35741:16;35780:12;35622;:189::i;:::-;35607:204;;35847:35;35860:7;35869:12;35847;:35::i;:::-;35832:50;;35320:1400;;;;35938:184;35973:25;36029:4;36057:16;36096:7;35938:12;:184::i;:::-;35923:199;;36141:20;36164:102;36208:4;36235:12;36164:21;:102::i;:::-;36141:125;;36363:1;36347:12;:17;36343:62;;36381:24;36394:7;36403:1;36381:12;:24::i;:::-;36366:39;;36343:62;36441:189;36476:25;36532:4;36560:16;36599:12;36441;:189::i;:::-;36426:204;;36664:40;36677:12;36691;36664;:40::i;:::-;36649:55;;35320:1400;33786:2952;;;;;;;;;;:::o;20142:456::-;20386:45;;;-1:-1:-1;;;;;20386:45:0;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20386:45:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20361:81:0;;;;20326:12;;20340:17;;20361:10;;;;20386:45;20361:81;;;25:18:-1;20361:81:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;20361:81:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;20325:117:0;;;;20475:7;:57;;;;-1:-1:-1;20487:11:0;;:16;;:44;;;20518:4;20507:24;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20507:24:0;20487:44;20453:137;;;;;-1:-1:-1;;;20453:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;43174:2164;43300:7;-1:-1:-1;;;;;43342:24:0;;;;;:50;;-1:-1:-1;;;;;;43370:22:0;;;;43342:50;43320:123;;;;;-1:-1:-1;;;43320:123:0;;;;;;;;;;;;-1:-1:-1;;;43320:123:0;;;;;;;;;;;;;;;43472:8;-1:-1:-1;;;;;43458:22:0;:10;-1:-1:-1;;;;;43458:22:0;;43454:41;;;-1:-1:-1;43489:6:0;43482:13;;43454:41;43516:35;43530:10;43542:8;43516:13;:35::i;:::-;43508:67;;;;;-1:-1:-1;;;43508:67:0;;;;;;;;;;;;-1:-1:-1;;;43508:67:0;;;;;;;;;;;;;;;43603:1;43594:6;:10;43586:37;;;;;-1:-1:-1;;;43586:37:0;;;;;;;;;;;;-1:-1:-1;;;43586:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;43640:24:0;;43636:1695;;43697:16;;-1:-1:-1;;;;;43685:28:0;;;43697:16;;43685:28;43681:148;;;43740:16;;;;;;;;;-1:-1:-1;;;;;43740:16:0;-1:-1:-1;;;;;43734:31:0;;43772:6;43734:47;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43734:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43734:47:0;;;;;43807:6;43800:13;;;;43681:148;43867:16;;;43881:1;43867:16;;;43843:21;43867:16;;;;;43843:21;43867:16;;;;;105:10:-1;43867:16:0;88:34:-1;-1:-1;;43908:16:0;;43898:7;;;;-1:-1:-1;;;;;;43908:16:0;;43898:7;;-1:-1:-1;43908:16:0;;43898:7;;;;;;;;;:26;-1:-1:-1;;;;;43898:26:0;;;-1:-1:-1;;;;;43898:26:0;;;;;43949:8;43939:4;43944:1;43939:7;;;;;;;;-1:-1:-1;;;;;43939:18:0;;;:7;;;;;;;;;;:18;;;;44001:15;;:122;;-1:-1:-1;;;44001:122:0;;:15;:122;;;;;;44106:4;44001:122;;;;;;44119:3;44113;:9;44001:122;;;;;;;;;;;;;;;;;;;;;43974:24;;44001:15;;;;;:55;;44081:6;;44092:4;;44001:122;;;;;;;;;;;;;;;:15;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;44001:122:0;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44001:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44001:122:0;;;;;;;39:16:-1;36:1;17:17;2:54;101:4;44001:122:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;44001:122:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;44001:122:0;;421:4:-1;412:14;;;;44001:122:0;;;;;412:14:-1;44001:122:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;44001:122:0;;;;;;;;;;;43974:149;;44145:7;44153:1;44145:10;;;;;;;;;;;;;;44138:17;;;;;;43636:1695;-1:-1:-1;;;;;44177:22:0;;44173:1158;;44234:16;;-1:-1:-1;;;;;44220:30:0;;;44234:16;;44220:30;44216:143;;;44277:16;;44271:40;;;-1:-1:-1;;;44271:40:0;;;;;;;;;;-1:-1:-1;;;;;44277:16:0;;;;44271:32;;:40;;;;;44277:16;;44271:40;;;;;;;;44277:16;;44271:40;;;5:2:-1;;;;30:1;27;20:12;5:2;44271:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44271:40:0;;;;44337:6;44330:13;;;;44216:143;44397:16;;;44411:1;44397:16;;;44373:21;44397:16;;;;;44373:21;44397:16;;;;;105:10:-1;44397:16:0;88:34:-1;-1:-1;;44510:15:0;;44373:40;;-1:-1:-1;44428:138:0;;44473:10;;-1:-1:-1;;;;;;44510:15:0;44545:6;44428:26;:138::i;:::-;44591:10;44581:4;44586:1;44581:7;;;;;;;;-1:-1:-1;;;;;44581:20:0;;;:7;;;;;;;;;:20;44626:16;;44616:7;;44626:16;;;44616:4;;44626:16;;44616:7;;;;;;-1:-1:-1;;;;;44616:26:0;;;:7;;;;;;;;;;:26;;;;44686:15;;:180;;-1:-1:-1;;;44686:180:0;;;;;;;;:15;:180;;;;;;44818:4;44686:180;;;;;;44848:3;44842;:9;44686:180;;;;;;;;;;;;;;;;;;;;;44659:24;;44686:15;;;;;:37;;44742:6;;44686:15;;44787:4;;44686:180;;;;;;;;;;;;;;;;:15;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;44686:180:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44686:180:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44686:180:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;44686:180:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;44173:1158:0;45013:15;;44931:138;;44976:10;;-1:-1:-1;;;;;45013:15:0;45048:6;44931:26;:138::i;:::-;45084:22;45109:115;45147:10;45176:8;45203:6;45109:19;:115::i;:::-;45084:140;;45264:1;45247:14;:18;45239:44;;;;;-1:-1:-1;;;45239:44:0;;;;;;;;;;;;-1:-1:-1;;;45239:44:0;;;;;;;;;;;;;;;45305:14;-1:-1:-1;45298:21:0;;17739:132;17797:7;17824:39;17828:1;17831;17824:39;;;;;;;;;;;;;;;;;:3;:39::i;47122:456::-;47350:23;;:58;;;-1:-1:-1;;;47350:58:0;;-1:-1:-1;;;;;47350:58:0;;;;;;;;;47233:19;;;;47350:23;;:35;;:58;;;;;;;;;;;;;;:23;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;47350:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47350:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47350:58:0;;-1:-1:-1;;;;;;47446:68:0;;;47535:7;47544:1;47547:22;47560:3;47565;47547:12;:22::i;:::-;47446:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47446:124:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47446:124:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47446:124:0;;47122:456;-1:-1:-1;;;;47122:456:0:o;48995:908::-;49309:23;;:62;;;-1:-1:-1;;;49309:62:0;;-1:-1:-1;;;;;49309:62:0;;;;;;;;;49192:19;;;;49309:23;;:35;;:62;;;;;;;;;;;;;;:23;:62;;;5:2:-1;;;;30:1;27;20:12;5:2;49309:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49309:62:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49309:62:0;;-1:-1:-1;49395:162:0;49436:25;49309:62;49534:12;49395:26;:162::i;:::-;49584:34;-1:-1:-1;;;;;49584:74:0;;49673:12;49700:1;49716;49732:22;49745:3;49750;49732:12;:22::i;:::-;49584:248;;;-1:-1:-1;;;;;;49584:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49584:248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49584:248:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;49584:248:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49584:248:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49584:248:0;;-1:-1:-1;49851:15:0;49843:52;;;;;-1:-1:-1;;;49843:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48995:908;;;;;;;:::o;45380:1489::-;45587:23;;;45631:16;;45587:61;;;-1:-1:-1;;;45587:61:0;;-1:-1:-1;;;;;45587:61:0;;;;;;;;;;45631:16;;;45587:61;;;;;45515:7;;;;45587:23;;:31;;:61;;;;;;;;;;;;;;:23;:61;;;5:2:-1;;;;30:1;27;20:12;5:2;45587:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45587:61:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45587:61:0;45722:23;;;45764:16;;45722:59;;;-1:-1:-1;;;45722:59:0;;-1:-1:-1;;;;;45722:59:0;;;;;;;;;;45764:16;;;45722:59;;;;;45587:61;;-1:-1:-1;45670:20:0;;45722:23;;;;;:31;;:59;;;;;45587:61;;45722:59;;;;;;;;:23;:59;;;5:2:-1;;;;30:1;27;20:12;5:2;45722:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45722:59:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45722:59:0;45855:23;;;:53;;;-1:-1:-1;;;45855:53:0;;-1:-1:-1;;;;;45855:53:0;;;;;;;;;;;;;;;;;;;45722:59;;-1:-1:-1;45803:20:0;;45855:23;;;;;:31;;:53;;;;;45722:59;;45855:53;;;;;;;;:23;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;45855:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45855:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45855:53:0;;-1:-1:-1;45932:24:0;45973:19;45855:53;45973:12;:19::i;:::-;45969:874;;;46033:16;;;46047:1;46033:16;;;46009:21;46033:16;;;;;46009:21;46033:16;;;;;105:10:-1;46033:16:0;88:34:-1;136:17;;-1:-1;46033:16:0;46009:40;;46074:10;46064:4;46069:1;46064:7;;;;;;;;;;;;;:20;-1:-1:-1;;;;;46064:20:0;;;-1:-1:-1;;;;;46064:20:0;;;;;46109:8;46099:4;46104:1;46099:7;;;;;;;;;;;;;:18;-1:-1:-1;;;;;46099:18:0;;;-1:-1:-1;;;;;46099:18:0;;;;;46144:15;;;;;;;;;-1:-1:-1;;;;;46144:15:0;-1:-1:-1;;;;;46144:40:0;;46203:6;46228:1;46248:4;46279;46303:3;46309;46303:9;46144:183;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46144:183:0;-1:-1:-1;;;;;46144:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46144:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46144:183:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46144:183:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;46144:183:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;46144:183:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;46144:183:0;;421:4:-1;412:14;;;;46144:183:0;;;;;412:14:-1;46144:183:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46144:183:0;;;;;;;;;;;46134:193;;46349:7;46357:1;46349:10;;;;;;;;;;;;;;46342:17;;;;;;;;;45969:874;46381:19;46394:5;46381:12;:19::i;:::-;:42;;;;;46404:19;46417:5;46404:12;:19::i;:::-;46377:466;;;46464:16;;;46478:1;46464:16;;;;;;;;;46440:21;;46464:16;;;46440:21;;105:10:-1;46464:16:0;88:34:-1;136:17;;-1:-1;46464:16:0;46440:40;;46505:10;46495:4;46500:1;46495:7;;;;;;;;-1:-1:-1;;;;;46495:20:0;;;:7;;;;;;;;;:20;46540:16;;46530:7;;46540:16;;;46530:4;;46540:16;;46530:7;;;;;;;;;;;:26;-1:-1:-1;;;;;46530:26:0;;;-1:-1:-1;;;;;46530:26:0;;;;;46581:8;46571:4;46576:1;46571:7;;;;;;;;;;;;;:18;-1:-1:-1;;;;;46571:18:0;;;-1:-1:-1;;;;;46571:18:0;;;;;46616:15;;;;;;;;;-1:-1:-1;;;;;46616:15:0;-1:-1:-1;;;;;46616:40:0;;46675:6;46700:1;46720:4;46751;46775:3;46781;46775:9;46616:183;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46616:183:0;-1:-1:-1;;;;;46616:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46616:183:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46616:183:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46616:183:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;46616:183:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;46616:183:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;373:25;;-1:-1;46616:183:0;;421:4:-1;412:14;;;;46616:183:0;;;;;412:14:-1;46616:183:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46616:183:0;;;;;;;;;;;46606:193;;46821:7;46829:1;46821:10;;;;;;;46377:466;-1:-1:-1;46860:1:0;;45380:1489;-1:-1:-1;;;;;;;45380:1489:0:o;18401:345::-;18487:7;18589:12;18582:5;18574:28;;;;-1:-1:-1;;;18574:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;18574:28:0;;18613:9;18629:1;18625;:5;;;;;;;18401:345;-1:-1:-1;;;;;18401:345:0:o;15428:181::-;15486:7;15518:5;;;15542:6;;;;15534:46;;;;;-1:-1:-1;;;15534:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://0566c1ace9e63322cffb7acfdd1b5c5e14d1e8cc28b312231e5c69e4250bb796

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

Zapper.Fi: Uniswap V2 Zap in contract has migrated to 0x80c5e6908368cb9db503ba968d7ec5a565bfb389.

Validator Index Block Amount
View All Withdrawals

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

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