ETH Price: $3,667.15 (+1.84%)

Contract

0xbEE036e3c071E5b72e5C8d034FB0fAFdBBBb8E1D
 

Overview

ETH Balance

1 wei

Eth Value

Less Than $0.01 (@ $3,667.15/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw Eth158787252022-11-02 0:21:47759 days ago1667348507IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0003953112.82880623
Swap Assets158785452022-11-01 23:45:35759 days ago1667346335IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0067714910.87802375
Swap Assets158785432022-11-01 23:45:11759 days ago1667346311IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0089103911.15767152
Withdraw Eth158785292022-11-01 23:42:23759 days ago1667346143IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0003877510.95128684
Swap Assets158784642022-11-01 23:29:23759 days ago1667345363IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0097673911.65041287
Transfer Operato...158784422022-11-01 23:24:59759 days ago1667345099IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0003879113.36547166
Payback158754582022-11-01 13:24:59760 days ago1667309099IN
0xbEE036e3...dBBBb8E1D
0.00004229 ETH0.0010264511.22632863
Loan Ether158754172022-11-01 13:16:47760 days ago1667308607IN
0xbEE036e3...dBBBb8E1D
0 ETH0.004151989.97326204
Loan Ether158751002022-11-01 12:12:47760 days ago1667304767IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0039219511.54474691
Payback158466102022-10-28 12:38:35764 days ago1666960715IN
0xbEE036e3...dBBBb8E1D
0.07047153 ETH0.0020197613.39802681
Loan Ether158466042022-10-28 12:37:23764 days ago1666960643IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0061060815.60888679
Transfer158452902022-10-28 8:13:59764 days ago1666944839IN
0xbEE036e3...dBBBb8E1D
1 ETH0.000212899.51100728
Payback158130302022-10-23 19:54:23768 days ago1666554863IN
0xbEE036e3...dBBBb8E1D
0.01710115 ETH0.0027161414.65356152
Loan Ether158130242022-10-23 19:53:11768 days ago1666554791IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0061778512.73944295
Transfer158127532022-10-23 18:58:59768 days ago1666551539IN
0xbEE036e3...dBBBb8E1D
0.4 ETH0.0003774316.86180387
Loan Ether158123602022-10-23 17:39:59768 days ago1666546799IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0085535126.55719607
Transfer158117572022-10-23 15:38:35769 days ago1666539515IN
0xbEE036e3...dBBBb8E1D
0.15 ETH0.0002706612.09207786
Add Loan Pool158053352022-10-22 18:07:35769 days ago1666462055IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0037953825.85942792
Add Loan Pool158053312022-10-22 18:06:47769 days ago1666462007IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0033899723.80871287
Add Loan Pool158053282022-10-22 18:06:11769 days ago1666461971IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0035401425.3919351
Add Loan Pool158053242022-10-22 18:05:23769 days ago1666461923IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0039678727.49816822
Add Loan Pool158053222022-10-22 18:04:59769 days ago1666461899IN
0xbEE036e3...dBBBb8E1D
0 ETH0.003764127.48121767
Add Loan Pool158053192022-10-22 18:04:23769 days ago1666461863IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0034323225.42277243
Add Loan Pool158053122022-10-22 18:02:59769 days ago1666461779IN
0xbEE036e3...dBBBb8E1D
0 ETH0.0034256825.93842123
Add Loan Pool158053122022-10-22 18:02:59769 days ago1666461779IN
0xbEE036e3...dBBBb8E1D
0 ETH0.003278525.29323865
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
158787252022-11-02 0:21:47759 days ago1667348507
0xbEE036e3...dBBBb8E1D
1.42862346 ETH
158785432022-11-01 23:45:11759 days ago1667346311
0xbEE036e3...dBBBb8E1D
0 ETH
158785292022-11-01 23:42:23759 days ago1667346143
0xbEE036e3...dBBBb8E1D
0.05 ETH
158784642022-11-01 23:29:23759 days ago1667345363
0xbEE036e3...dBBBb8E1D
0 ETH
158754172022-11-01 13:16:47760 days ago1667308607
0xbEE036e3...dBBBb8E1D
0.00004067 ETH
158751002022-11-01 12:12:47760 days ago1667304767
0xbEE036e3...dBBBb8E1D
0.10522124 ETH
158466042022-10-28 12:37:23764 days ago1666960643
0xbEE036e3...dBBBb8E1D
0.06776109 ETH
158130242022-10-23 19:53:11768 days ago1666554791
0xbEE036e3...dBBBb8E1D
0.01644341 ETH
158123602022-10-23 17:39:59768 days ago1666546799
0xbEE036e3...dBBBb8E1D
0 ETH
158050082022-10-22 17:01:59769 days ago1666458119
0xbEE036e3...dBBBb8E1D
0.00017839 ETH
158050082022-10-22 17:01:59769 days ago1666458119
0xbEE036e3...dBBBb8E1D
0.00006816 ETH
158050082022-10-22 17:01:59769 days ago1666458119
0xbEE036e3...dBBBb8E1D
0.00000777 ETH
158050082022-10-22 17:01:59769 days ago1666458119
0xbEE036e3...dBBBb8E1D
0.00050754 ETH
158049342022-10-22 16:47:11769 days ago1666457231
0xbEE036e3...dBBBb8E1D
0.00018151 ETH
158049342022-10-22 16:47:11769 days ago1666457231
0xbEE036e3...dBBBb8E1D
0.00006642 ETH
158049342022-10-22 16:47:11769 days ago1666457231
0xbEE036e3...dBBBb8E1D
0.00000782 ETH
158049342022-10-22 16:47:11769 days ago1666457231
0xbEE036e3...dBBBb8E1D
0.00050856 ETH
158049022022-10-22 16:40:35769 days ago1666456835
0xbEE036e3...dBBBb8E1D
0.00018191 ETH
158048712022-10-22 16:34:23770 days ago1666456463
0xbEE036e3...dBBBb8E1D
0.00014706 ETH
158048352022-10-22 16:27:11770 days ago1666456031
0xbEE036e3...dBBBb8E1D
0.00007407 ETH
158048042022-10-22 16:20:59770 days ago1666455659
0xbEE036e3...dBBBb8E1D
0.00002542 ETH
158047842022-10-22 16:16:59770 days ago1666455419
0xbEE036e3...dBBBb8E1D
0.0000127 ETH
158047582022-10-22 16:11:47770 days ago1666455107
0xbEE036e3...dBBBb8E1D
0.00000315 ETH
158047292022-10-22 16:05:59770 days ago1666454759
0xbEE036e3...dBBBb8E1D
0.00001579 ETH
158046882022-10-22 15:57:47770 days ago1666454267
0xbEE036e3...dBBBb8E1D
0.00020267 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Loan

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-22
*/

// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.7.0 <0.9.0;

// TODO(zx): Replace all instances of SafeMath with OZ implementation
library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        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;
    }

    // Only used in the  BondingCalculator.sol
    function sqrrt(uint256 a) internal pure returns (uint256 c) {
        if (a > 3) {
            c = a;
            uint256 b = add(div(a, 2), 1);
            while (b < c) {
                c = b;
                b = div(add(div(a, b), b), 2);
            }
        } else if (a != 0) {
            c = 1;
        }
    }
}

interface IERC20 {
    function increaseAllowance(address spender, uint256 addedValue)
        external
        returns (bool);

    function decimals() external view returns (uint8);

    function totalSupply() external view returns (uint256);

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

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

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

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

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

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

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

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

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

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

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

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

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

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

    function WETH() external pure returns (address);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

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

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

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

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

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

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

contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

/**
 * @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.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being 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 percentage 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.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @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(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

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

contract Loan is Ownable, ReentrancyGuard {
    using SafeMath for uint256;
    uint256 public ethLimit; // percentage: user can borrow eth limit
    uint256 public nativeTokenMin;
    address public nativeTokenAddress;
    address public operator;

    struct LoanPool {
        uint256 loanDuration;
        uint256 loanLimit;
        uint256 loanLimitNative;
        uint256 repayRate;
        bool closed;
    }

    struct LoanRequest {
        address borrower;
        address token;
        uint256 loanAmount;
        uint256 collateralAmount;
        uint256 paybackAmount;
        uint256 loanDueDate;
        uint256 duration;
        uint256 loanId;
        bool isPayback;
    }

    uint256 public lastSwapTs;
    mapping(address => address[]) public swapPaths;
    mapping(address => uint256) public userLoansCount;
    mapping(address => mapping(uint256 => LoanRequest)) public loans;

    address[] public collateralTokens;
    address[] public loanUsers;
    mapping(address => uint256) public loanPoolLength;
    mapping(address => mapping(uint256 => LoanPool)) public loanPools;

    IUniswapV2Router02 public immutable uniswapV2Router;

    event NewAddLoanPool(
        address collateralToken,
        uint256 loanDuration,
        uint256 loanLimit,
        uint256 loanLimitNative,
        uint256 repayRate
    );

    event NewLoanEther(
        address indexed borrower,
        uint256 loanAmount,
        uint256 collateralAmount,
        uint256 paybackAmount,
        uint256 loanDueDate,
        uint256 duration
    );

    event PayBack(
        address borrower,
        bool paybackSuccess,
        uint256 paybackTime,
        uint256 paybackAmount,
        uint256 returnCollateralAmount
    );

    event Received(address, uint256);

    event UpdatePairToken(address collateralToken, address[] swapPath);

    constructor(
        address _nativeTokenAddress,
        address _routerAddress,
        uint256 _nativeMin,
        uint256 _ethLimit
    ) {
        ethLimit = _ethLimit;
        nativeTokenMin = _nativeMin;
        nativeTokenAddress = _nativeTokenAddress;
        operator = msg.sender;
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            _routerAddress
        );
        uniswapV2Router = _uniswapV2Router;
    }

    // Operator CAN do modifier
    modifier onlyOperator() {
        require(operator == msg.sender, "operator: caller is not the operator");
        _;
    }

    modifier onlyOwnerOrOperator() {
        require(
            (msg.sender == owner()) || (msg.sender == operator),
            "Not owner or operator"
        );
        _;
    }

    receive() external payable {
        emit Received(msg.sender, msg.value);
    }

    function addLoanPool(
        address _collateralToken,
        uint256 _loanDuration,
        uint256 _loanLimit,
        uint256 _loanLimitNative,
        uint256 _repayRate,
        address[] memory _path
    ) public onlyOwner {
        require(
            _collateralToken != address(0),
            "update: Zero collateral address"
        );
        require(_loanLimit < 100, "add: Can't over 100% limit");
        require(_loanLimitNative < 100, "add: Can't over 100% limit");
        require(_repayRate >= 100, "add: shold be over 100%");

        bool isColToken = isCollateralToken(_collateralToken);
        if (!isColToken) {
            collateralTokens.push(_collateralToken);
            swapPaths[_collateralToken] = _path;
        }
        LoanPool memory newLoanPool;
        newLoanPool.loanDuration = _loanDuration;
        newLoanPool.loanLimit = _loanLimit;

        newLoanPool.loanLimitNative = _loanLimitNative;
        newLoanPool.repayRate = _repayRate;
        newLoanPool.closed = false;
        uint256 loanPoolLen = loanPoolLength[_collateralToken];

        loanPools[_collateralToken][loanPoolLen] = newLoanPool;
        loanPoolLength[_collateralToken]++;

        emit NewAddLoanPool(
            _collateralToken,
            _loanDuration,
            _loanLimit,
            _loanLimitNative,
            _repayRate
        );
    }

    function updateLoanPool(
        address _collateralToken,
        uint256 _index,
        uint256 _loanDuration,
        uint256 _loanLimit,
        uint256 _loanLimitNative,
        uint256 _repayRate
    ) public onlyOwner {
        require(
            _collateralToken != address(0),
            "update: Zero collateral address"
        );
        bool isColToken = isCollateralToken(_collateralToken);
        require(isColToken, "update: No collateral token");
        uint256 loanIdLen = loanPoolLength[_collateralToken];
        require(_index < loanIdLen, "update: No valid index");
        require(_loanLimit < 100, "add: Can't over 100% limit");
        require(_loanLimitNative < 100, "add: Can't over 100% limit");
        require(_repayRate >= 100, "add: shold be over 100%");

        loanPools[_collateralToken][_index].loanDuration = _loanDuration;
        loanPools[_collateralToken][_index].loanLimit = _loanLimit;
        loanPools[_collateralToken][_index].loanLimitNative = _loanLimitNative;
        loanPools[_collateralToken][_index].repayRate = _repayRate;
    }

    function updateSwapPath(address _collateralToken, address[] memory _path)
        public
        onlyOwner
    {
        require(
            _collateralToken != address(0),
            "update: Zero collateral address"
        );
        bool isColToken = isCollateralToken(_collateralToken);
        require(isColToken, "update: No collateral token");
        swapPaths[_collateralToken] = _path;

        emit UpdatePairToken(_collateralToken, _path);
    }

    function setLoanPoolClose(
        address _collateralToken,
        uint256 _loanPoolId,
        bool _closed
    ) public onlyOwner {
        require(
            _collateralToken != address(0),
            "update: Zero collateral address"
        );
        bool isColToken = isCollateralToken(_collateralToken);
        require(isColToken, "update: No collateral token");
        uint256 loanIdLen = loanPoolLength[_collateralToken];
        require(_loanPoolId < loanIdLen, "set: No valid loan pool id");
        loanPools[_collateralToken][_loanPoolId].closed = _closed;
    }

    function isCollateralToken(address _addr) public view returns (bool) {
        uint256 len = collateralTokens.length;
        bool isToken = false;
        for (uint256 i = 0; i < len; i++) {
            if (_addr == collateralTokens[i]) {
                isToken = true;
                break;
            }
        }
        return isToken;
    }

    function isNativeTokenHolder(address _user) public view returns (bool) {
        uint256 balance = IERC20(nativeTokenAddress).balanceOf(_user);
        if (balance > nativeTokenMin) {
            return true;
        }
        return false;
    }

    function updateNativeToken(address _tokenAddress, uint256 _min)
        public
        onlyOwner
    {
        require(_tokenAddress != address(0), "native: zero token address");
        nativeTokenAddress = _tokenAddress;
        nativeTokenMin = _min;
    }

    function updateEthLimit(uint256 _ethLimit) public onlyOwner {
        require(ethLimit < 100, "update: Eth limit should be less than 100%");
        ethLimit = _ethLimit;
    }

    // calculate require colleteral token amount by passing ether amount
    function countCollateralFromEther(
        address _collateralToken,
        uint256 _limit,
        uint256 _amount
    ) public view returns (uint256) {
        address[] memory path = swapPaths[_collateralToken];
        uint256[] memory amounts = new uint256[](path.length);
        amounts = uniswapV2Router.getAmountsIn(_amount, path);
        uint256 result = amounts[0].div(_limit).mul(100);
        return result;
    }

    // calculate require ether amount by passing collateral amount
    function countEtherFromCollateral(
        address _collateralToken,
        uint256 _limit,
        uint256 _tokenAmount
    ) public view returns (uint256) {
        address[] memory path = swapPaths[_collateralToken];
        uint256[] memory amounts = new uint256[](path.length);
        amounts = uniswapV2Router.getAmountsOut(_tokenAmount, path);
        uint256 result = amounts[path.length - 1].mul(_limit).div(100);
        return result;
    }

    function checkMax(uint256 _amount) public view returns (bool) {
        uint256 totalEth = address(this).balance;
        uint256 loanMax = totalEth.mul(ethLimit).div(100);
        if (_amount > loanMax) {
            return false;
        } else {
            return true;
        }
    }

    function TokenTransfer(
        address _user,
        address _collateralToken,
        uint256 _tokenAmount
    ) private returns (bool) {
        bool transferred = IERC20(_collateralToken).transferFrom(
            _user,
            address(this),
            _tokenAmount
        );
        return transferred;
    }

    function loanEther(
        address _collateralToken,
        uint256 _loanPoolId,
        uint256 _tokenAmount
    ) public nonReentrant {
        require(
            !loanPools[_collateralToken][_loanPoolId].closed,
            "loanEther: Loan Pool is closed"
        );
        uint256 tokenAmount = _tokenAmount;
        address collateralToken = _collateralToken;
        uint256 loanPoolId = _loanPoolId;
        uint256 loanPoolLen = loanPoolLength[collateralToken];
        
        require(loanPoolLen > loanPoolId, "loanEther: no valid loan Id");
        
        uint256 balance = IERC20(collateralToken).balanceOf(msg.sender);
        
        require(balance > tokenAmount, "loanEther: not enough token balance");

        bool isHolder = isNativeTokenHolder(msg.sender);
        uint256 limit = !isHolder
            ? loanPools[collateralToken][loanPoolId].loanLimit
            : loanPools[collateralToken][loanPoolId].loanLimitNative;
        uint256 beforeBalance = IERC20(collateralToken).balanceOf(
            address(this)
        );

        require(
            TokenTransfer(msg.sender, collateralToken, tokenAmount),
            "loanEther: Transfer token from user to contract failed"
        );
        
        uint256 afterBalance = IERC20(collateralToken).balanceOf(address(this));
        uint256 tokenAmountReal = afterBalance - beforeBalance;
        uint256 ethAmountReal = countEtherFromCollateral(
            collateralToken,
            limit,
            tokenAmountReal
        );
        bool isOldUser = false;
        for (uint256 i = 0; i < loanUsers.length; i++) {
            if (loanUsers[i] == msg.sender) {
                isOldUser = true;
                break;
            }
        }
        if (isOldUser == false) {
            loanUsers.push(msg.sender);
        }
        require(
            checkMax(ethAmountReal),
            "loanEther: not enough liquidity or over max ETH amount"
        );
        LoanRequest memory newLoan;
        newLoan.borrower = msg.sender;
        newLoan.loanAmount = ethAmountReal;
        newLoan.collateralAmount = tokenAmountReal;
        newLoan.loanId = userLoansCount[msg.sender];
        newLoan.isPayback = false;
        newLoan.token = collateralToken;
        uint256 repayRate = loanPools[collateralToken][loanPoolId].repayRate;
        uint256 loanDuration = loanPools[collateralToken][loanPoolId]
            .loanDuration;
        newLoan.paybackAmount = ethAmountReal.mul(repayRate).div(100);
        newLoan.loanDueDate = block.timestamp + loanDuration;
        newLoan.duration = loanDuration;

        loans[msg.sender][userLoansCount[msg.sender]] = newLoan;
        userLoansCount[msg.sender]++;
        payable(msg.sender).transfer(ethAmountReal);
        emit NewLoanEther(
            msg.sender,
            newLoan.loanAmount,
            newLoan.collateralAmount,
            newLoan.paybackAmount,
            newLoan.loanDueDate,
            newLoan.duration
        );
    }

    function payback(address _collateralToken, uint256 _id)
        public
        payable
        nonReentrant
    {
        LoanRequest storage loanReq = loans[msg.sender][_id];
        require(
            loanReq.borrower == msg.sender,
            "payback: Only borrower can payback"
        );
        require(!loanReq.isPayback, "payback: payback already");
        require(
            block.timestamp <= loanReq.loanDueDate,
            "payback: exceed due date"
        );
        require(
            msg.value >= loanReq.paybackAmount,
            "payback: Not enough ether"
        );
        loanReq.isPayback = true;
        require(
            IERC20(_collateralToken).transfer(
                msg.sender,
                loanReq.collateralAmount
            ),
            "payback: Transfer collateral from contract to user failed"
        );
        emit PayBack(
            msg.sender,
            loanReq.isPayback,
            block.timestamp,
            loanReq.paybackAmount,
            loanReq.collateralAmount
        );
    }

    function getAllUserLoans(address _user)
        public
        view
        returns (LoanRequest[] memory)
    {
        LoanRequest[] memory requests = new LoanRequest[](
            userLoansCount[_user]
        );
        for (uint256 i = 0; i < userLoansCount[_user]; i++) {
            requests[i] = loans[_user][i];
        }
        return requests;
    }

    function getUserOngoingLoans(address _user)
        public
        view
        returns (LoanRequest[] memory)
    {
        LoanRequest[] memory ongoing = new LoanRequest[](userLoansCount[_user]);
        for (uint256 i = 0; i < userLoansCount[_user]; i++) {
            LoanRequest memory req = loans[_user][i];
            if (!req.isPayback && req.loanDueDate > block.timestamp) {
                ongoing[i] = req;
            }
        }
        return ongoing;
    }

    function getUserOverdueLoans(address _user)
        public
        view
        returns (LoanRequest[] memory)
    {
        LoanRequest[] memory overdue = new LoanRequest[](userLoansCount[_user]);
        for (uint256 i = 0; i < userLoansCount[_user]; i++) {
            LoanRequest memory req = loans[_user][i];
            if (!req.isPayback && req.loanDueDate < block.timestamp) {
                overdue[i] = req;
            }
        }
        return overdue;
    }

    function getUserOverdueLoansFrom(address _user, uint256 _from)
        public
        view
        returns (LoanRequest[] memory)
    {
        LoanRequest[] memory overdue = new LoanRequest[](userLoansCount[_user]);
        for (uint256 i = 0; i < userLoansCount[_user]; i++) {
            LoanRequest memory req = loans[_user][i];
            if (
                !req.isPayback &&
                req.loanDueDate < block.timestamp &&
                _from < req.loanDueDate
            ) {
                overdue[i] = req;
            }
        }
        return overdue;
    }

    function countSwapAmount(address _token) public view returns (uint256) {
        uint256 tokenSwapAmount;
        for (uint256 k = 0; k < loanUsers.length; k++) {
            address user = loanUsers[k];
            LoanRequest[] memory loanUser = getUserOverdueLoansFrom(
                user,
                lastSwapTs
            );
            for (uint256 i = 0; i < loanUser.length; i++) {
                if (_token == loanUser[i].token) {
                    tokenSwapAmount = tokenSwapAmount.add(
                        loanUser[i].collateralAmount
                    );
                }
            }
        }
        return tokenSwapAmount;
    }

    function isSwappable() public view returns (bool) {
        uint256 totalSwapAmount = 0;
        bool isEnable;
        for (uint256 i = 0; i < collateralTokens.length; i++) {
            uint256 tokenAmount = countSwapAmount(collateralTokens[i]);
            totalSwapAmount = totalSwapAmount.add(tokenAmount);
        }
        if (totalSwapAmount > 0) {
            isEnable = true;
        }
        return isEnable;
    }

    function swapAssets() public onlyOperator {
        for (uint256 i = 0; i < collateralTokens.length; i++) {
            uint256 tokenAmount = countSwapAmount(collateralTokens[i]);
            if (tokenAmount > 0) {
                IERC20(collateralTokens[i]).approve(
                    address(uniswapV2Router),
                    tokenAmount
                );
                address[] memory path = swapPaths[collateralTokens[i]];
                uniswapV2Router
                    .swapExactTokensForETHSupportingFeeOnTransferTokens(
                        tokenAmount,
                        0, // accept any amount of ETH
                        path,
                        address(this),
                        block.timestamp
                    );
            }
        }
        lastSwapTs = block.timestamp;
    }

    function transferOperator(address _opeator) public onlyOwner {
        require(_opeator != address(0), "operator: Zero Address");
        operator = _opeator;
    }

    function withdrawEth(uint256 _amount) external onlyOwnerOrOperator {
        uint256 totalEth = address(this).balance;
        require(
            _amount < totalEth,
            "withdraw: Can't exceed more than totalLiquidity"
        );
        address payable _owner = payable(owner());
        _owner.transfer(_amount);
    }

    function recoverERC20(address _token) public onlyOperator {
        bool isColToken = isCollateralToken(_token);
        if (!isColToken) {
            uint256 balance = IERC20(_token).balanceOf(address(this));
            IERC20(_token).transfer(msg.sender, balance);
        }
    }

    function getCollateralLen() public view returns (uint256) {
        return collateralTokens.length;
    }

    function getTotalLiquidity() public view returns (uint256) {
        return address(this).balance;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_nativeTokenAddress","type":"address"},{"internalType":"address","name":"_routerAddress","type":"address"},{"internalType":"uint256","name":"_nativeMin","type":"uint256"},{"internalType":"uint256","name":"_ethLimit","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"loanDuration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanLimit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanLimitNative","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"repayRate","type":"uint256"}],"name":"NewAddLoanPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"loanAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"NewLoanEther","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"borrower","type":"address"},{"indexed":false,"internalType":"bool","name":"paybackSuccess","type":"bool"},{"indexed":false,"internalType":"uint256","name":"paybackTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"returnCollateralAmount","type":"uint256"}],"name":"PayBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"collateralToken","type":"address"},{"indexed":false,"internalType":"address[]","name":"swapPath","type":"address[]"}],"name":"UpdatePairToken","type":"event"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_loanDuration","type":"uint256"},{"internalType":"uint256","name":"_loanLimit","type":"uint256"},{"internalType":"uint256","name":"_loanLimitNative","type":"uint256"},{"internalType":"uint256","name":"_repayRate","type":"uint256"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"addLoanPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"checkMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collateralTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"countCollateralFromEther","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_limit","type":"uint256"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"countEtherFromCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"countSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getAllUserLoans","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollateralLen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserOngoingLoans","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserOverdueLoans","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_from","type":"uint256"}],"name":"getUserOverdueLoansFrom","outputs":[{"components":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"internalType":"struct Loan.LoanRequest[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isCollateralToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isNativeTokenHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSwappable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastSwapTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_loanPoolId","type":"uint256"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"loanEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"loanPoolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"loanPools","outputs":[{"internalType":"uint256","name":"loanDuration","type":"uint256"},{"internalType":"uint256","name":"loanLimit","type":"uint256"},{"internalType":"uint256","name":"loanLimitNative","type":"uint256"},{"internalType":"uint256","name":"repayRate","type":"uint256"},{"internalType":"bool","name":"closed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"loanUsers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"loans","outputs":[{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"loanAmount","type":"uint256"},{"internalType":"uint256","name":"collateralAmount","type":"uint256"},{"internalType":"uint256","name":"paybackAmount","type":"uint256"},{"internalType":"uint256","name":"loanDueDate","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"loanId","type":"uint256"},{"internalType":"bool","name":"isPayback","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nativeTokenMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"payback","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_loanPoolId","type":"uint256"},{"internalType":"bool","name":"_closed","type":"bool"}],"name":"setLoanPoolClose","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"swapPaths","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_opeator","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethLimit","type":"uint256"}],"name":"updateEthLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"uint256","name":"_loanDuration","type":"uint256"},{"internalType":"uint256","name":"_loanLimit","type":"uint256"},{"internalType":"uint256","name":"_loanLimitNative","type":"uint256"},{"internalType":"uint256","name":"_repayRate","type":"uint256"}],"name":"updateLoanPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_min","type":"uint256"}],"name":"updateNativeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"updateSwapPath","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userLoansCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040523480156200001157600080fd5b5060405162003875380380620038758339810160408190526200003491620000d0565b600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055600255600355600480546001600160a01b039384166001600160a01b03199182161790915560058054909116331790551660805262000118565b80516001600160a01b0381168114620000cb57600080fd5b919050565b60008060008060808587031215620000e757600080fd5b620000f285620000b3565b93506200010260208601620000b3565b6040860151606090960151949790965092505050565b60805161372562000150600039600081816102a00152818161165801528181611782015281816128ec0152612bfb01526137256000f3fe60806040526004361061024a5760003560e01c8063769db61511610139578063acc45659116100b6578063e39f9f2a1161007a578063e39f9f2a146107b1578063e7177ece14610833578063ed921a1414610853578063f2fde38b14610873578063f7cf2bf114610893578063f8915391146108b357600080fd5b8063acc4565914610726578063b8118bbe1461073b578063c311d0491461075b578063db8bb3a11461077b578063e31323ac1461079b57600080fd5b806398c61c37116100fd57806398c61c37146105e05780639e8c708e146106b1578063a007945e146106d1578063a12af896146106e6578063a803180d1461070657600080fd5b8063769db615146105355780637eff539414610555578063888eb1ee146105755780638a918694146105955780638da5cb5b146105c257600080fd5b80633c884dff116101c7578063570ca7351161018b578063570ca735146104ab57806360ab8988146104cb57806367f7b06f146104eb5780636df9d3791461050b578063715018a61461052057600080fd5b80633c884dff146103f85780634766162c146104285780634c0a79fb146104485780634d0047ee1461047557806351e8b5c61461049557600080fd5b806329605e771161020e57806329605e771461036f5780632cd1d2501461038f5780632f759d91146103a557806335c7e925146103d257806335ed8ab8146103e557600080fd5b80631694505e1461028e578063172c48c7146102df5780631fffb698146102ff57806324350de314610321578063293308f11461034157600080fd5b3661028957604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b34801561029a57600080fd5b506102c27f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102eb57600080fd5b506102c26102fa366004612fa8565b6108d3565b34801561030b57600080fd5b5061031f61031a3660046130ba565b6108fd565b005b34801561032d57600080fd5b5061031f61033c36600461312d565b610b87565b34801561034d57600080fd5b5061036161035c366004613177565b610d2c565b6040519081526020016102d6565b34801561037b57600080fd5b5061031f61038a366004613177565b610e1d565b34801561039b57600080fd5b5061036160035481565b3480156103b157600080fd5b506103c56103c0366004613177565b610eb8565b6040516102d69190613192565b3480156103de57600080fd5b5047610361565b61031f6103f3366004613238565b61100e565b34801561040457600080fd5b50610418610413366004612fa8565b611343565b60405190151581526020016102d6565b34801561043457600080fd5b50610418610443366004613177565b611389565b34801561045457600080fd5b50610361610463366004613177565b60086020526000908152604090205481565b34801561048157600080fd5b506004546102c2906001600160a01b031681565b3480156104a157600080fd5b5061036160025481565b3480156104b757600080fd5b506005546102c2906001600160a01b031681565b3480156104d757600080fd5b5061031f6104e6366004613273565b6113ef565b3480156104f757600080fd5b5061031f610506366004613238565b61150b565b34801561051757600080fd5b5061031f6115b1565b34801561052c57600080fd5b5061031f611810565b34801561054157600080fd5b506103c5610550366004613177565b611884565b34801561056157600080fd5b5061031f6105703660046132b3565b6119ef565b34801561058157600080fd5b5061031f6105903660046132e6565b6120f5565b3480156105a157600080fd5b506103616105b0366004613177565b600c6020526000908152604090205481565b3480156105ce57600080fd5b506000546001600160a01b03166102c2565b3480156105ec57600080fd5b506106606105fb366004613238565b60096020908152600092835260408084209091529082529020805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b039788169897909616969495939492939192909160ff1689565b604080516001600160a01b039a8b1681529990981660208a0152968801959095526060870193909352608086019190915260a085015260c084015260e08301521515610100820152610120016102d6565b3480156106bd57600080fd5b5061031f6106cc366004613177565b6121d7565b3480156106dd57600080fd5b50600a54610361565b3480156106f257600080fd5b506103c5610701366004613177565b6122f9565b34801561071257600080fd5b506102c2610721366004612fa8565b612464565b34801561073257600080fd5b50610418612474565b34801561074757600080fd5b50610418610756366004613177565b6124cf565b34801561076757600080fd5b5061031f610776366004612fa8565b612561565b34801561078757600080fd5b506102c2610796366004613238565b61266c565b3480156107a757600080fd5b5061036160065481565b3480156107bd57600080fd5b506108096107cc366004613238565b600d602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a0016102d6565b34801561083f57600080fd5b506103c561084e366004613238565b6126a4565b34801561085f57600080fd5b5061036161086e3660046132b3565b61281e565b34801561087f57600080fd5b5061031f61088e366004613177565b6129af565b34801561089f57600080fd5b5061031f6108ae366004612fa8565b612a99565b3480156108bf57600080fd5b506103616108ce3660046132b3565b612b2d565b600a81815481106108e357600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146109305760405162461bcd60e51b815260040161092790613334565b60405180910390fd5b6001600160a01b0386166109565760405162461bcd60e51b815260040161092790613369565b606484106109765760405162461bcd60e51b8152600401610927906133a0565b606483106109965760405162461bcd60e51b8152600401610927906133a0565b60648210156109e15760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610927565b60006109ec87611389565b905080610a5d57600a8054600181019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b03891690811790915560009081526007602090815260409091208351610a5b92850190612ece565b505b610a916040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b86815260208082018781526040808401888152606085018881526000608087018181526001600160a01b038f16808352600c8089528684208054600d8b528886208187528b529785208b518155985160018a0155955160028901559351600388015590516004909601805460ff191696151596909617909555938452909352825490929091610b1f836133ed565b9091555050604080516001600160a01b038b168152602081018a905290810188905260608101879052608081018690527f4cb98f3b8ae6aaa3e3a10d19c96b00eac0ed7b5b7415a40edf7583c26c24914b9060a00160405180910390a1505050505050505050565b6000546001600160a01b03163314610bb15760405162461bcd60e51b815260040161092790613334565b6001600160a01b038616610bd75760405162461bcd60e51b815260040161092790613369565b6000610be287611389565b905080610c015760405162461bcd60e51b815260040161092790613406565b6001600160a01b0387166000908152600c6020526040902054808710610c625760405162461bcd60e51b81526020600482015260166024820152750eae0c8c2e8ca74409cde40ecc2d8d2c840d2dcc8caf60531b6044820152606401610927565b60648510610c825760405162461bcd60e51b8152600401610927906133a0565b60648410610ca25760405162461bcd60e51b8152600401610927906133a0565b6064831015610ced5760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610927565b50506001600160a01b03959095166000908152600d60209081526040808320968352959052939093209182556001820155600281019190915560030155565b60008060005b600b54811015610e16576000600b8281548110610d5157610d5161343d565b60009182526020822001546006546001600160a01b039091169250610d779083906126a4565b905060005b8151811015610e0057818181518110610d9757610d9761343d565b6020026020010151602001516001600160a01b0316876001600160a01b031603610dee57610deb828281518110610dd057610dd061343d565b60200260200101516060015186612cb990919063ffffffff16565b94505b80610df8816133ed565b915050610d7c565b5050508080610e0e906133ed565b915050610d32565b5092915050565b6000546001600160a01b03163314610e475760405162461bcd60e51b815260040161092790613334565b6001600160a01b038116610e965760405162461bcd60e51b81526020600482015260166024820152756f70657261746f723a205a65726f204164647265737360501b6044820152606401610927565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600860205260408120546060919067ffffffffffffffff811115610eed57610eed612fdd565b604051908082528060200260200182016040528015610f2657816020015b610f13612f33565b815260200190600190039081610f0b5790505b50905060005b6001600160a01b038416600090815260086020526040902054811015610e16576001600160a01b0380851660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615156101008201528251839083908110610ff057610ff061343d565b60200260200101819052508080611006906133ed565b915050610f2c565b6002600154036110605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610927565b60026001553360008181526009602090815260408083208584529091529020805490916001600160a01b03909116146110e65760405162461bcd60e51b815260206004820152602260248201527f7061796261636b3a204f6e6c7920626f72726f7765722063616e207061796261604482015261636b60f01b6064820152608401610927565b600881015460ff161561113b5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a207061796261636b20616c726561647900000000000000006044820152606401610927565b806005015442111561118f5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a2065786365656420647565206461746500000000000000006044820152606401610927565b80600401543410156111e35760405162461bcd60e51b815260206004820152601960248201527f7061796261636b3a204e6f7420656e6f756768206574686572000000000000006044820152606401610927565b60088101805460ff19166001179055600381015460405163a9059cbb60e01b815233600482015260248101919091526001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015611245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112699190613453565b6112db5760405162461bcd60e51b815260206004820152603960248201527f7061796261636b3a205472616e7366657220636f6c6c61746572616c2066726f60448201527f6d20636f6e747261637420746f2075736572206661696c6564000000000000006064820152608401610927565b6008810154600482015460038301546040805133815260ff90941615156020850152428482015260608401929092526080830152517ff022a4d91d174959862c530aa30a63411b4f0e37186283bd5fc0000acc217a859181900360a00190a150506001805550565b600080479050600061136b606461136560025485612d1f90919063ffffffff16565b90612da1565b90508084111561137f575060009392505050565b5060019392505050565b600a5460009081805b828110156113e757600a81815481106113ad576113ad61343d565b6000918252602090912001546001600160a01b03908116908616036113d557600191506113e7565b806113df816133ed565b915050611392565b509392505050565b6000546001600160a01b031633146114195760405162461bcd60e51b815260040161092790613334565b6001600160a01b03831661143f5760405162461bcd60e51b815260040161092790613369565b600061144a84611389565b9050806114695760405162461bcd60e51b815260040161092790613406565b6001600160a01b0384166000908152600c60205260409020548084106114d15760405162461bcd60e51b815260206004820152601a60248201527f7365743a204e6f2076616c6964206c6f616e20706f6f6c2069640000000000006044820152606401610927565b50506001600160a01b03929092166000908152600d6020908152604080832093835292905220600401805460ff1916911515919091179055565b6000546001600160a01b031633146115355760405162461bcd60e51b815260040161092790613334565b6001600160a01b03821661158b5760405162461bcd60e51b815260206004820152601a60248201527f6e61746976653a207a65726f20746f6b656e20616464726573730000000000006044820152606401610927565b600480546001600160a01b0319166001600160a01b039390931692909217909155600355565b6005546001600160a01b031633146115db5760405162461bcd60e51b815260040161092790613470565b60005b600a5481101561180957600061161a600a83815481106116005761160061343d565b6000918252602090912001546001600160a01b0316610d2c565b905080156117f657600a82815481106116355761163561343d565b60009182526020909120015460405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af11580156116b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d59190613453565b50600060076000600a85815481106116ef576116ef61343d565b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208054825181850281018501909352808352919290919083018282801561176557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611747575b505060405163791ac94760e01b8152939450506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263791ac94792506117c2915085906000908690309042906004016134f8565b600060405180830381600087803b1580156117dc57600080fd5b505af11580156117f0573d6000803e3d6000fd5b50505050505b5080611801816133ed565b9150506115de565b5042600655565b6000546001600160a01b0316331461183a5760405162461bcd60e51b815260040161092790613334565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001600160a01b0381166000908152600860205260408120546060919067ffffffffffffffff8111156118b9576118b9612fdd565b6040519080825280602002602001820160405280156118f257816020015b6118df612f33565b8152602001906001900390816118d75790505b50905060005b6001600160a01b038416600090815260086020526040902054811015610e16576001600160a01b0380851660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526119b85750428160a00151115b156119dc57808383815181106119d0576119d061343d565b60200260200101819052505b50806119e7816133ed565b9150506118f8565b600260015403611a415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610927565b60026001556001600160a01b0383166000908152600d6020908152604080832085845290915290206004015460ff1615611abd5760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204c6f616e20506f6f6c20697320636c6f73656400006044820152606401610927565b6001600160a01b0383166000908152600c6020526040902054819084908490818111611b2b5760405162461bcd60e51b815260206004820152601b60248201527f6c6f616e45746865723a206e6f2076616c6964206c6f616e20496400000000006044820152606401610927565b6040516370a0823160e01b81523360048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611b72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b969190613534565b9050848111611bf35760405162461bcd60e51b815260206004820152602360248201527f6c6f616e45746865723a206e6f7420656e6f75676820746f6b656e2062616c616044820152626e636560e81b6064820152608401610927565b6000611bfe336124cf565b905060008115611c34576001600160a01b0386166000908152600d60209081526040808320888452909152902060020154611c5c565b6001600160a01b0386166000908152600d602090815260408083208884529091529020600101545b6040516370a0823160e01b81523060048201529091506000906001600160a01b038816906370a0823190602401602060405180830381865afa158015611ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cca9190613534565b9050611cd733888a612de3565b611d425760405162461bcd60e51b815260206004820152603660248201527f6c6f616e45746865723a205472616e7366657220746f6b656e2066726f6d20756044820152751cd95c881d1bc818dbdb9d1c9858dd0819985a5b195960521b6064820152608401610927565b6040516370a0823160e01b81523060048201526000906001600160a01b038916906370a0823190602401602060405180830381865afa158015611d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dad9190613534565b90506000611dbb838361354d565b90506000611dca8a8684612b2d565b90506000805b600b54811015611e2c57336001600160a01b0316600b8281548110611df757611df761343d565b6000918252602090912001546001600160a01b031603611e1a5760019150611e2c565b80611e24816133ed565b915050611dd0565b50801515600003611e7a57600b80546001810182556000919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331790555b611e8382611343565b611eee5760405162461bcd60e51b815260206004820152603660248201527f6c6f616e45746865723a206e6f7420656e6f756768206c6971756964697479206044820152751bdc881bdd995c881b585e0811551208185b5bdd5b9d60521b6064820152608401610927565b611ef6612f33565b338082526040808301859052606083018690526000918252600860209081528183205460e085015261010084018390526001600160a01b038f168185018190528352600d81528183208e84529052902060038101549054611f5c60646113658785612d1f565b6080840152611f6b8142613560565b60a0840190815260c084018281523360008181526009602090815260408083206008808452828520805486529184528285208b5181546001600160a01b039182166001600160a01b0319918216178355868e0151600184018054919093169116179055928b0151600284015560608b0151600384015560808b01516004840155965160058301559451600682015560e08901516007820155610100890151908601805491151560ff1990921691909117905591815292905280549161202f836133ed565b9091555050604051339086156108fc029087906000818181858888f19350505050158015612061573d6000803e3d6000fd5b50336001600160a01b03167f6ec47479b666ea2a5d4da977be8256c787c5724698308bd3c981e7dcd2285fa48460400151856060015186608001518760a001518860c001516040516120d5959493929190948552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a250506001805550505050505050505050505050505050565b6000546001600160a01b0316331461211f5760405162461bcd60e51b815260040161092790613334565b6001600160a01b0382166121455760405162461bcd60e51b815260040161092790613369565b600061215083611389565b90508061216f5760405162461bcd60e51b815260040161092790613406565b6001600160a01b0383166000908152600760209081526040909120835161219892850190612ece565b507f078e8a4737553c8d944056c4087a42039847a7c1ed868d8c0e5d82a224f94f5883836040516121ca929190613573565b60405180910390a1505050565b6005546001600160a01b031633146122015760405162461bcd60e51b815260040161092790613470565b600061220c82611389565b9050806122f5576040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561225a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227e9190613534565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0384169063a9059cbb906044016020604051808303816000875af11580156122ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f29190613453565b50505b5050565b6001600160a01b0381166000908152600860205260408120546060919067ffffffffffffffff81111561232e5761232e612fdd565b60405190808252806020026020018201604052801561236757816020015b612354612f33565b81526020019060019003908161234c5790505b50905060005b6001600160a01b038416600090815260086020526040902054811015610e16576001600160a01b0380851660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff16158015610100830181905261242d5750428160a00151105b1561245157808383815181106124455761244561343d565b60200260200101819052505b508061245c816133ed565b91505061236d565b600b81815481106108e357600080fd5b60008080805b600a548110156124be57600061249c600a83815481106116005761160061343d565b90506124a88482612cb9565b93505080806124b6906133ed565b91505061247a565b5081156124c9575060015b92915050565b600480546040516370a0823160e01b81526001600160a01b0384811693820193909352600092839216906370a0823190602401602060405180830381865afa15801561251f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125439190613534565b90506003548111156125585750600192915050565b50600092915050565b6000546001600160a01b031633148061258457506005546001600160a01b031633145b6125c85760405162461bcd60e51b81526020600482015260156024820152742737ba1037bbb732b91037b91037b832b930ba37b960591b6044820152606401610927565b478082106126305760405162461bcd60e51b815260206004820152602f60248201527f77697468647261773a2043616e277420657863656564206d6f7265207468616e60448201526e20746f74616c4c697175696469747960881b6064820152608401610927565b600080546040516001600160a01b039091169182916108fc86150291869190818181858888f193505050501580156122f2573d6000803e3d6000fd5b6007602052816000526040600020818154811061268857600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b0382166000908152600860205260408120546060919067ffffffffffffffff8111156126d9576126d9612fdd565b60405190808252806020026020018201604052801561271257816020015b6126ff612f33565b8152602001906001900390816126f75790505b50905060005b6001600160a01b0385166000908152600860205260409020548110156113e7576001600160a01b0380861660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526127d85750428160a00151105b80156127e757508060a0015185105b1561280b57808383815181106127ff576127ff61343d565b60200260200101819052505b5080612816816133ed565b915050612718565b6001600160a01b03831660009081526007602090815260408083208054825181850281018501909352808352849383018282801561288557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612867575b505050505090506000815167ffffffffffffffff8111156128a8576128a8612fdd565b6040519080825280602002602001820160405280156128d1578160200160208202803683370190505b506040516307c0329d60e21b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631f00ca74906129239087908690600401613597565b600060405180830381865afa158015612940573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261296891908101906135b0565b905060006129a4606461299e88856000815181106129885761298861343d565b6020026020010151612da190919063ffffffff16565b90612d1f565b979650505050505050565b6000546001600160a01b031633146129d95760405162461bcd60e51b815260040161092790613334565b6001600160a01b038116612a3e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610927565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612ac35760405162461bcd60e51b815260040161092790613334565b606460025410612b285760405162461bcd60e51b815260206004820152602a60248201527f7570646174653a20457468206c696d69742073686f756c64206265206c657373604482015269207468616e203130302560b01b6064820152608401610927565b600255565b6001600160a01b038316600090815260076020908152604080832080548251818502810185019093528083528493830182828015612b9457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612b76575b505050505090506000815167ffffffffffffffff811115612bb757612bb7612fdd565b604051908082528060200260200182016040528015612be0578160200160208202803683370190505b5060405163d06ca61f60e01b81529091506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d06ca61f90612c329087908690600401613597565b600060405180830381865afa158015612c4f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c7791908101906135b0565b905060006129a46064611365888560018851612c93919061354d565b81518110612ca357612ca361343d565b6020026020010151612d1f90919063ffffffff16565b600080612cc68385613560565b905083811015612d185760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610927565b9392505050565b600082600003612d31575060006124c9565b6000612d3d8385613636565b905082612d4a8583613663565b14612d185760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610927565b6000612d1883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e6a565b6040516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820183905260009182918516906323b872dd906064016020604051808303816000875af1158015612e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e619190613453565b95945050505050565b60008183612e8b5760405162461bcd60e51b81526004016109279190613677565b506000612e988486613663565b9050612ea484866136c5565b612eae8286613636565b612eb89190613560565b8514612ec657612ec66136d9565b949350505050565b828054828255906000526020600020908101928215612f23579160200282015b82811115612f2357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612eee565b50612f2f929150612f93565b5090565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5b80821115612f2f5760008155600101612f94565b600060208284031215612fba57600080fd5b5035919050565b80356001600160a01b0381168114612fd857600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561301c5761301c612fdd565b604052919050565b600067ffffffffffffffff82111561303e5761303e612fdd565b5060051b60200190565b600082601f83011261305957600080fd5b8135602061306e61306983613024565b612ff3565b82815260059290921b8401810191818101908684111561308d57600080fd5b8286015b848110156130af576130a281612fc1565b8352918301918301613091565b509695505050505050565b60008060008060008060c087890312156130d357600080fd5b6130dc87612fc1565b95506020870135945060408701359350606087013592506080870135915060a087013567ffffffffffffffff81111561311457600080fd5b61312089828a01613048565b9150509295509295509295565b60008060008060008060c0878903121561314657600080fd5b61314f87612fc1565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b60006020828403121561318957600080fd5b612d1882612fc1565b602080825282518282018190526000919060409081850190868401855b8281101561322b57815180516001600160a01b0390811686528782015116878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e080820151908601526101009081015115159085015261012090930192908501906001016131af565b5091979650505050505050565b6000806040838503121561324b57600080fd5b61325483612fc1565b946020939093013593505050565b801515811461327057600080fd5b50565b60008060006060848603121561328857600080fd5b61329184612fc1565b92506020840135915060408401356132a881613262565b809150509250925092565b6000806000606084860312156132c857600080fd5b6132d184612fc1565b95602085013595506040909401359392505050565b600080604083850312156132f957600080fd5b61330283612fc1565b9150602083013567ffffffffffffffff81111561331e57600080fd5b61332a85828601613048565b9150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f7570646174653a205a65726f20636f6c6c61746572616c206164647265737300604082015260600190565b6020808252601a908201527f6164643a2043616e2774206f7665722031303025206c696d6974000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016133ff576133ff6133d7565b5060010190565b6020808252601b908201527f7570646174653a204e6f20636f6c6c61746572616c20746f6b656e0000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561346557600080fd5b8151612d1881613262565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b600081518084526020808501945080840160005b838110156134ed5781516001600160a01b0316875295820195908201906001016134c8565b509495945050505050565b85815284602082015260a06040820152600061351760a08301866134b4565b6001600160a01b0394909416606083015250608001529392505050565b60006020828403121561354657600080fd5b5051919050565b818103818111156124c9576124c96133d7565b808201808211156124c9576124c96133d7565b6001600160a01b0383168152604060208201819052600090612ec6908301846134b4565b828152604060208201526000612ec660408301846134b4565b600060208083850312156135c357600080fd5b825167ffffffffffffffff8111156135da57600080fd5b8301601f810185136135eb57600080fd5b80516135f961306982613024565b81815260059190911b8201830190838101908783111561361857600080fd5b928401925b828410156129a45783518252928401929084019061361d565b80820281158282048414176124c9576124c96133d7565b634e487b7160e01b600052601260045260246000fd5b6000826136725761367261364d565b500490565b600060208083528351808285015260005b818110156136a457858101830151858201604001528201613688565b506000604082860101526040601f19601f8301168501019250505092915050565b6000826136d4576136d461364d565b500690565b634e487b7160e01b600052600160045260246000fdfea2646970667358221220554cf459aee1228d6887377c3e44bc317114aaec6e8f569b75a0dea4e712ea6f64736f6c634300081100330000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000024f2beb1aa000000000000000000000000000000000000000000000000000000000000000000a

Deployed Bytecode

0x60806040526004361061024a5760003560e01c8063769db61511610139578063acc45659116100b6578063e39f9f2a1161007a578063e39f9f2a146107b1578063e7177ece14610833578063ed921a1414610853578063f2fde38b14610873578063f7cf2bf114610893578063f8915391146108b357600080fd5b8063acc4565914610726578063b8118bbe1461073b578063c311d0491461075b578063db8bb3a11461077b578063e31323ac1461079b57600080fd5b806398c61c37116100fd57806398c61c37146105e05780639e8c708e146106b1578063a007945e146106d1578063a12af896146106e6578063a803180d1461070657600080fd5b8063769db615146105355780637eff539414610555578063888eb1ee146105755780638a918694146105955780638da5cb5b146105c257600080fd5b80633c884dff116101c7578063570ca7351161018b578063570ca735146104ab57806360ab8988146104cb57806367f7b06f146104eb5780636df9d3791461050b578063715018a61461052057600080fd5b80633c884dff146103f85780634766162c146104285780634c0a79fb146104485780634d0047ee1461047557806351e8b5c61461049557600080fd5b806329605e771161020e57806329605e771461036f5780632cd1d2501461038f5780632f759d91146103a557806335c7e925146103d257806335ed8ab8146103e557600080fd5b80631694505e1461028e578063172c48c7146102df5780631fffb698146102ff57806324350de314610321578063293308f11461034157600080fd5b3661028957604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b34801561029a57600080fd5b506102c27f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156102eb57600080fd5b506102c26102fa366004612fa8565b6108d3565b34801561030b57600080fd5b5061031f61031a3660046130ba565b6108fd565b005b34801561032d57600080fd5b5061031f61033c36600461312d565b610b87565b34801561034d57600080fd5b5061036161035c366004613177565b610d2c565b6040519081526020016102d6565b34801561037b57600080fd5b5061031f61038a366004613177565b610e1d565b34801561039b57600080fd5b5061036160035481565b3480156103b157600080fd5b506103c56103c0366004613177565b610eb8565b6040516102d69190613192565b3480156103de57600080fd5b5047610361565b61031f6103f3366004613238565b61100e565b34801561040457600080fd5b50610418610413366004612fa8565b611343565b60405190151581526020016102d6565b34801561043457600080fd5b50610418610443366004613177565b611389565b34801561045457600080fd5b50610361610463366004613177565b60086020526000908152604090205481565b34801561048157600080fd5b506004546102c2906001600160a01b031681565b3480156104a157600080fd5b5061036160025481565b3480156104b757600080fd5b506005546102c2906001600160a01b031681565b3480156104d757600080fd5b5061031f6104e6366004613273565b6113ef565b3480156104f757600080fd5b5061031f610506366004613238565b61150b565b34801561051757600080fd5b5061031f6115b1565b34801561052c57600080fd5b5061031f611810565b34801561054157600080fd5b506103c5610550366004613177565b611884565b34801561056157600080fd5b5061031f6105703660046132b3565b6119ef565b34801561058157600080fd5b5061031f6105903660046132e6565b6120f5565b3480156105a157600080fd5b506103616105b0366004613177565b600c6020526000908152604090205481565b3480156105ce57600080fd5b506000546001600160a01b03166102c2565b3480156105ec57600080fd5b506106606105fb366004613238565b60096020908152600092835260408084209091529082529020805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b039788169897909616969495939492939192909160ff1689565b604080516001600160a01b039a8b1681529990981660208a0152968801959095526060870193909352608086019190915260a085015260c084015260e08301521515610100820152610120016102d6565b3480156106bd57600080fd5b5061031f6106cc366004613177565b6121d7565b3480156106dd57600080fd5b50600a54610361565b3480156106f257600080fd5b506103c5610701366004613177565b6122f9565b34801561071257600080fd5b506102c2610721366004612fa8565b612464565b34801561073257600080fd5b50610418612474565b34801561074757600080fd5b50610418610756366004613177565b6124cf565b34801561076757600080fd5b5061031f610776366004612fa8565b612561565b34801561078757600080fd5b506102c2610796366004613238565b61266c565b3480156107a757600080fd5b5061036160065481565b3480156107bd57600080fd5b506108096107cc366004613238565b600d602090815260009283526040808420909152908252902080546001820154600283015460038401546004909401549293919290919060ff1685565b6040805195865260208601949094529284019190915260608301521515608082015260a0016102d6565b34801561083f57600080fd5b506103c561084e366004613238565b6126a4565b34801561085f57600080fd5b5061036161086e3660046132b3565b61281e565b34801561087f57600080fd5b5061031f61088e366004613177565b6129af565b34801561089f57600080fd5b5061031f6108ae366004612fa8565b612a99565b3480156108bf57600080fd5b506103616108ce3660046132b3565b612b2d565b600a81815481106108e357600080fd5b6000918252602090912001546001600160a01b0316905081565b6000546001600160a01b031633146109305760405162461bcd60e51b815260040161092790613334565b60405180910390fd5b6001600160a01b0386166109565760405162461bcd60e51b815260040161092790613369565b606484106109765760405162461bcd60e51b8152600401610927906133a0565b606483106109965760405162461bcd60e51b8152600401610927906133a0565b60648210156109e15760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610927565b60006109ec87611389565b905080610a5d57600a8054600181019091557fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b03891690811790915560009081526007602090815260409091208351610a5b92850190612ece565b505b610a916040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b86815260208082018781526040808401888152606085018881526000608087018181526001600160a01b038f16808352600c8089528684208054600d8b528886208187528b529785208b518155985160018a0155955160028901559351600388015590516004909601805460ff191696151596909617909555938452909352825490929091610b1f836133ed565b9091555050604080516001600160a01b038b168152602081018a905290810188905260608101879052608081018690527f4cb98f3b8ae6aaa3e3a10d19c96b00eac0ed7b5b7415a40edf7583c26c24914b9060a00160405180910390a1505050505050505050565b6000546001600160a01b03163314610bb15760405162461bcd60e51b815260040161092790613334565b6001600160a01b038616610bd75760405162461bcd60e51b815260040161092790613369565b6000610be287611389565b905080610c015760405162461bcd60e51b815260040161092790613406565b6001600160a01b0387166000908152600c6020526040902054808710610c625760405162461bcd60e51b81526020600482015260166024820152750eae0c8c2e8ca74409cde40ecc2d8d2c840d2dcc8caf60531b6044820152606401610927565b60648510610c825760405162461bcd60e51b8152600401610927906133a0565b60648410610ca25760405162461bcd60e51b8152600401610927906133a0565b6064831015610ced5760405162461bcd60e51b81526020600482015260176024820152766164643a2073686f6c64206265206f766572203130302560481b6044820152606401610927565b50506001600160a01b03959095166000908152600d60209081526040808320968352959052939093209182556001820155600281019190915560030155565b60008060005b600b54811015610e16576000600b8281548110610d5157610d5161343d565b60009182526020822001546006546001600160a01b039091169250610d779083906126a4565b905060005b8151811015610e0057818181518110610d9757610d9761343d565b6020026020010151602001516001600160a01b0316876001600160a01b031603610dee57610deb828281518110610dd057610dd061343d565b60200260200101516060015186612cb990919063ffffffff16565b94505b80610df8816133ed565b915050610d7c565b5050508080610e0e906133ed565b915050610d32565b5092915050565b6000546001600160a01b03163314610e475760405162461bcd60e51b815260040161092790613334565b6001600160a01b038116610e965760405162461bcd60e51b81526020600482015260166024820152756f70657261746f723a205a65726f204164647265737360501b6044820152606401610927565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600860205260408120546060919067ffffffffffffffff811115610eed57610eed612fdd565b604051908082528060200260200182016040528015610f2657816020015b610f13612f33565b815260200190600190039081610f0b5790505b50905060005b6001600160a01b038416600090815260086020526040902054811015610e16576001600160a01b0380851660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615156101008201528251839083908110610ff057610ff061343d565b60200260200101819052508080611006906133ed565b915050610f2c565b6002600154036110605760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610927565b60026001553360008181526009602090815260408083208584529091529020805490916001600160a01b03909116146110e65760405162461bcd60e51b815260206004820152602260248201527f7061796261636b3a204f6e6c7920626f72726f7765722063616e207061796261604482015261636b60f01b6064820152608401610927565b600881015460ff161561113b5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a207061796261636b20616c726561647900000000000000006044820152606401610927565b806005015442111561118f5760405162461bcd60e51b815260206004820152601860248201527f7061796261636b3a2065786365656420647565206461746500000000000000006044820152606401610927565b80600401543410156111e35760405162461bcd60e51b815260206004820152601960248201527f7061796261636b3a204e6f7420656e6f756768206574686572000000000000006044820152606401610927565b60088101805460ff19166001179055600381015460405163a9059cbb60e01b815233600482015260248101919091526001600160a01b0384169063a9059cbb906044016020604051808303816000875af1158015611245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112699190613453565b6112db5760405162461bcd60e51b815260206004820152603960248201527f7061796261636b3a205472616e7366657220636f6c6c61746572616c2066726f60448201527f6d20636f6e747261637420746f2075736572206661696c6564000000000000006064820152608401610927565b6008810154600482015460038301546040805133815260ff90941615156020850152428482015260608401929092526080830152517ff022a4d91d174959862c530aa30a63411b4f0e37186283bd5fc0000acc217a859181900360a00190a150506001805550565b600080479050600061136b606461136560025485612d1f90919063ffffffff16565b90612da1565b90508084111561137f575060009392505050565b5060019392505050565b600a5460009081805b828110156113e757600a81815481106113ad576113ad61343d565b6000918252602090912001546001600160a01b03908116908616036113d557600191506113e7565b806113df816133ed565b915050611392565b509392505050565b6000546001600160a01b031633146114195760405162461bcd60e51b815260040161092790613334565b6001600160a01b03831661143f5760405162461bcd60e51b815260040161092790613369565b600061144a84611389565b9050806114695760405162461bcd60e51b815260040161092790613406565b6001600160a01b0384166000908152600c60205260409020548084106114d15760405162461bcd60e51b815260206004820152601a60248201527f7365743a204e6f2076616c6964206c6f616e20706f6f6c2069640000000000006044820152606401610927565b50506001600160a01b03929092166000908152600d6020908152604080832093835292905220600401805460ff1916911515919091179055565b6000546001600160a01b031633146115355760405162461bcd60e51b815260040161092790613334565b6001600160a01b03821661158b5760405162461bcd60e51b815260206004820152601a60248201527f6e61746976653a207a65726f20746f6b656e20616464726573730000000000006044820152606401610927565b600480546001600160a01b0319166001600160a01b039390931692909217909155600355565b6005546001600160a01b031633146115db5760405162461bcd60e51b815260040161092790613470565b60005b600a5481101561180957600061161a600a83815481106116005761160061343d565b6000918252602090912001546001600160a01b0316610d2c565b905080156117f657600a82815481106116355761163561343d565b60009182526020909120015460405163095ea7b360e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81166004830152602482018490529091169063095ea7b3906044016020604051808303816000875af11580156116b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d59190613453565b50600060076000600a85815481106116ef576116ef61343d565b60009182526020808320909101546001600160a01b0316835282810193909352604091820190208054825181850281018501909352808352919290919083018282801561176557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611747575b505060405163791ac94760e01b8152939450506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169263791ac94792506117c2915085906000908690309042906004016134f8565b600060405180830381600087803b1580156117dc57600080fd5b505af11580156117f0573d6000803e3d6000fd5b50505050505b5080611801816133ed565b9150506115de565b5042600655565b6000546001600160a01b0316331461183a5760405162461bcd60e51b815260040161092790613334565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6001600160a01b0381166000908152600860205260408120546060919067ffffffffffffffff8111156118b9576118b9612fdd565b6040519080825280602002602001820160405280156118f257816020015b6118df612f33565b8152602001906001900390816118d75790505b50905060005b6001600160a01b038416600090815260086020526040902054811015610e16576001600160a01b0380851660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526119b85750428160a00151115b156119dc57808383815181106119d0576119d061343d565b60200260200101819052505b50806119e7816133ed565b9150506118f8565b600260015403611a415760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610927565b60026001556001600160a01b0383166000908152600d6020908152604080832085845290915290206004015460ff1615611abd5760405162461bcd60e51b815260206004820152601e60248201527f6c6f616e45746865723a204c6f616e20506f6f6c20697320636c6f73656400006044820152606401610927565b6001600160a01b0383166000908152600c6020526040902054819084908490818111611b2b5760405162461bcd60e51b815260206004820152601b60248201527f6c6f616e45746865723a206e6f2076616c6964206c6f616e20496400000000006044820152606401610927565b6040516370a0823160e01b81523360048201526000906001600160a01b038516906370a0823190602401602060405180830381865afa158015611b72573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b969190613534565b9050848111611bf35760405162461bcd60e51b815260206004820152602360248201527f6c6f616e45746865723a206e6f7420656e6f75676820746f6b656e2062616c616044820152626e636560e81b6064820152608401610927565b6000611bfe336124cf565b905060008115611c34576001600160a01b0386166000908152600d60209081526040808320888452909152902060020154611c5c565b6001600160a01b0386166000908152600d602090815260408083208884529091529020600101545b6040516370a0823160e01b81523060048201529091506000906001600160a01b038816906370a0823190602401602060405180830381865afa158015611ca6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cca9190613534565b9050611cd733888a612de3565b611d425760405162461bcd60e51b815260206004820152603660248201527f6c6f616e45746865723a205472616e7366657220746f6b656e2066726f6d20756044820152751cd95c881d1bc818dbdb9d1c9858dd0819985a5b195960521b6064820152608401610927565b6040516370a0823160e01b81523060048201526000906001600160a01b038916906370a0823190602401602060405180830381865afa158015611d89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dad9190613534565b90506000611dbb838361354d565b90506000611dca8a8684612b2d565b90506000805b600b54811015611e2c57336001600160a01b0316600b8281548110611df757611df761343d565b6000918252602090912001546001600160a01b031603611e1a5760019150611e2c565b80611e24816133ed565b915050611dd0565b50801515600003611e7a57600b80546001810182556000919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b031916331790555b611e8382611343565b611eee5760405162461bcd60e51b815260206004820152603660248201527f6c6f616e45746865723a206e6f7420656e6f756768206c6971756964697479206044820152751bdc881bdd995c881b585e0811551208185b5bdd5b9d60521b6064820152608401610927565b611ef6612f33565b338082526040808301859052606083018690526000918252600860209081528183205460e085015261010084018390526001600160a01b038f168185018190528352600d81528183208e84529052902060038101549054611f5c60646113658785612d1f565b6080840152611f6b8142613560565b60a0840190815260c084018281523360008181526009602090815260408083206008808452828520805486529184528285208b5181546001600160a01b039182166001600160a01b0319918216178355868e0151600184018054919093169116179055928b0151600284015560608b0151600384015560808b01516004840155965160058301559451600682015560e08901516007820155610100890151908601805491151560ff1990921691909117905591815292905280549161202f836133ed565b9091555050604051339086156108fc029087906000818181858888f19350505050158015612061573d6000803e3d6000fd5b50336001600160a01b03167f6ec47479b666ea2a5d4da977be8256c787c5724698308bd3c981e7dcd2285fa48460400151856060015186608001518760a001518860c001516040516120d5959493929190948552602085019390935260408401919091526060830152608082015260a00190565b60405180910390a250506001805550505050505050505050505050505050565b6000546001600160a01b0316331461211f5760405162461bcd60e51b815260040161092790613334565b6001600160a01b0382166121455760405162461bcd60e51b815260040161092790613369565b600061215083611389565b90508061216f5760405162461bcd60e51b815260040161092790613406565b6001600160a01b0383166000908152600760209081526040909120835161219892850190612ece565b507f078e8a4737553c8d944056c4087a42039847a7c1ed868d8c0e5d82a224f94f5883836040516121ca929190613573565b60405180910390a1505050565b6005546001600160a01b031633146122015760405162461bcd60e51b815260040161092790613470565b600061220c82611389565b9050806122f5576040516370a0823160e01b81523060048201526000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561225a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227e9190613534565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0384169063a9059cbb906044016020604051808303816000875af11580156122ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f29190613453565b50505b5050565b6001600160a01b0381166000908152600860205260408120546060919067ffffffffffffffff81111561232e5761232e612fdd565b60405190808252806020026020018201604052801561236757816020015b612354612f33565b81526020019060019003908161234c5790505b50905060005b6001600160a01b038416600090815260086020526040902054811015610e16576001600160a01b0380851660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff16158015610100830181905261242d5750428160a00151105b1561245157808383815181106124455761244561343d565b60200260200101819052505b508061245c816133ed565b91505061236d565b600b81815481106108e357600080fd5b60008080805b600a548110156124be57600061249c600a83815481106116005761160061343d565b90506124a88482612cb9565b93505080806124b6906133ed565b91505061247a565b5081156124c9575060015b92915050565b600480546040516370a0823160e01b81526001600160a01b0384811693820193909352600092839216906370a0823190602401602060405180830381865afa15801561251f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125439190613534565b90506003548111156125585750600192915050565b50600092915050565b6000546001600160a01b031633148061258457506005546001600160a01b031633145b6125c85760405162461bcd60e51b81526020600482015260156024820152742737ba1037bbb732b91037b91037b832b930ba37b960591b6044820152606401610927565b478082106126305760405162461bcd60e51b815260206004820152602f60248201527f77697468647261773a2043616e277420657863656564206d6f7265207468616e60448201526e20746f74616c4c697175696469747960881b6064820152608401610927565b600080546040516001600160a01b039091169182916108fc86150291869190818181858888f193505050501580156122f2573d6000803e3d6000fd5b6007602052816000526040600020818154811061268857600080fd5b6000918252602090912001546001600160a01b03169150829050565b6001600160a01b0382166000908152600860205260408120546060919067ffffffffffffffff8111156126d9576126d9612fdd565b60405190808252806020026020018201604052801561271257816020015b6126ff612f33565b8152602001906001900390816126f75790505b50905060005b6001600160a01b0385166000908152600860205260409020548110156113e7576001600160a01b0380861660009081526009602090815260408083208584528252918290208251610120810184528154851681526001820154909416918401919091526002810154918301919091526003810154606083015260048101546080830152600581015460a0830152600681015460c0830152600781015460e08301526008015460ff1615801561010083018190526127d85750428160a00151105b80156127e757508060a0015185105b1561280b57808383815181106127ff576127ff61343d565b60200260200101819052505b5080612816816133ed565b915050612718565b6001600160a01b03831660009081526007602090815260408083208054825181850281018501909352808352849383018282801561288557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612867575b505050505090506000815167ffffffffffffffff8111156128a8576128a8612fdd565b6040519080825280602002602001820160405280156128d1578160200160208202803683370190505b506040516307c0329d60e21b81529091506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d1690631f00ca74906129239087908690600401613597565b600060405180830381865afa158015612940573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261296891908101906135b0565b905060006129a4606461299e88856000815181106129885761298861343d565b6020026020010151612da190919063ffffffff16565b90612d1f565b979650505050505050565b6000546001600160a01b031633146129d95760405162461bcd60e51b815260040161092790613334565b6001600160a01b038116612a3e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610927565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314612ac35760405162461bcd60e51b815260040161092790613334565b606460025410612b285760405162461bcd60e51b815260206004820152602a60248201527f7570646174653a20457468206c696d69742073686f756c64206265206c657373604482015269207468616e203130302560b01b6064820152608401610927565b600255565b6001600160a01b038316600090815260076020908152604080832080548251818502810185019093528083528493830182828015612b9457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612b76575b505050505090506000815167ffffffffffffffff811115612bb757612bb7612fdd565b604051908082528060200260200182016040528015612be0578160200160208202803683370190505b5060405163d06ca61f60e01b81529091506001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063d06ca61f90612c329087908690600401613597565b600060405180830381865afa158015612c4f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c7791908101906135b0565b905060006129a46064611365888560018851612c93919061354d565b81518110612ca357612ca361343d565b6020026020010151612d1f90919063ffffffff16565b600080612cc68385613560565b905083811015612d185760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610927565b9392505050565b600082600003612d31575060006124c9565b6000612d3d8385613636565b905082612d4a8583613663565b14612d185760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610927565b6000612d1883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e6a565b6040516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820183905260009182918516906323b872dd906064016020604051808303816000875af1158015612e3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e619190613453565b95945050505050565b60008183612e8b5760405162461bcd60e51b81526004016109279190613677565b506000612e988486613663565b9050612ea484866136c5565b612eae8286613636565b612eb89190613560565b8514612ec657612ec66136d9565b949350505050565b828054828255906000526020600020908101928215612f23579160200282015b82811115612f2357825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612eee565b50612f2f929150612f93565b5090565b60405180610120016040528060006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000151581525090565b5b80821115612f2f5760008155600101612f94565b600060208284031215612fba57600080fd5b5035919050565b80356001600160a01b0381168114612fd857600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561301c5761301c612fdd565b604052919050565b600067ffffffffffffffff82111561303e5761303e612fdd565b5060051b60200190565b600082601f83011261305957600080fd5b8135602061306e61306983613024565b612ff3565b82815260059290921b8401810191818101908684111561308d57600080fd5b8286015b848110156130af576130a281612fc1565b8352918301918301613091565b509695505050505050565b60008060008060008060c087890312156130d357600080fd5b6130dc87612fc1565b95506020870135945060408701359350606087013592506080870135915060a087013567ffffffffffffffff81111561311457600080fd5b61312089828a01613048565b9150509295509295509295565b60008060008060008060c0878903121561314657600080fd5b61314f87612fc1565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b60006020828403121561318957600080fd5b612d1882612fc1565b602080825282518282018190526000919060409081850190868401855b8281101561322b57815180516001600160a01b0390811686528782015116878601528581015186860152606080820151908601526080808201519086015260a0808201519086015260c0808201519086015260e080820151908601526101009081015115159085015261012090930192908501906001016131af565b5091979650505050505050565b6000806040838503121561324b57600080fd5b61325483612fc1565b946020939093013593505050565b801515811461327057600080fd5b50565b60008060006060848603121561328857600080fd5b61329184612fc1565b92506020840135915060408401356132a881613262565b809150509250925092565b6000806000606084860312156132c857600080fd5b6132d184612fc1565b95602085013595506040909401359392505050565b600080604083850312156132f957600080fd5b61330283612fc1565b9150602083013567ffffffffffffffff81111561331e57600080fd5b61332a85828601613048565b9150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f7570646174653a205a65726f20636f6c6c61746572616c206164647265737300604082015260600190565b6020808252601a908201527f6164643a2043616e2774206f7665722031303025206c696d6974000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016133ff576133ff6133d7565b5060010190565b6020808252601b908201527f7570646174653a204e6f20636f6c6c61746572616c20746f6b656e0000000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561346557600080fd5b8151612d1881613262565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b600081518084526020808501945080840160005b838110156134ed5781516001600160a01b0316875295820195908201906001016134c8565b509495945050505050565b85815284602082015260a06040820152600061351760a08301866134b4565b6001600160a01b0394909416606083015250608001529392505050565b60006020828403121561354657600080fd5b5051919050565b818103818111156124c9576124c96133d7565b808201808211156124c9576124c96133d7565b6001600160a01b0383168152604060208201819052600090612ec6908301846134b4565b828152604060208201526000612ec660408301846134b4565b600060208083850312156135c357600080fd5b825167ffffffffffffffff8111156135da57600080fd5b8301601f810185136135eb57600080fd5b80516135f961306982613024565b81815260059190911b8201830190838101908783111561361857600080fd5b928401925b828410156129a45783518252928401929084019061361d565b80820281158282048414176124c9576124c96133d7565b634e487b7160e01b600052601260045260246000fd5b6000826136725761367261364d565b500490565b600060208083528351808285015260005b818110156136a457858101830151858201604001528201613688565b506000604082860101526040601f19601f8301168501019250505092915050565b6000826136d4576136d461364d565b500690565b634e487b7160e01b600052600160045260246000fdfea2646970667358221220554cf459aee1228d6887377c3e44bc317114aaec6e8f569b75a0dea4e712ea6f64736f6c63430008110033

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

0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f9840000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d00000000000000000000000000000000000000000000000000024f2beb1aa000000000000000000000000000000000000000000000000000000000000000000a

-----Decoded View---------------
Arg [0] : _nativeTokenAddress (address): 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984
Arg [1] : _routerAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _nativeMin (uint256): 650000000000000
Arg [3] : _ethLimit (uint256): 10

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000001f9840a85d5af5bf1d1762f925bdaddc4201f984
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 00000000000000000000000000000000000000000000000000024f2beb1aa000
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000a


Deployed Bytecode Sourcemap

16876:18450:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19665:31;;;19674:10;188:51:1;;19686:9:0;270:2:1;255:18;;248:34;19665:31:0;;161:18:1;19665:31:0;;;;;;;16876:18450;;;;;18018:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;483:32:1;;;465:51;;453:2;438:18;18018:51:0;;;;;;;;17815:33;;;;;;;;;;-1:-1:-1;17815:33:0;;;;;:::i;:::-;;:::i;19712:1414::-;;;;;;;;;;-1:-1:-1;19712:1414:0;;;;;:::i;:::-;;:::i;:::-;;21134:1113;;;;;;;;;;-1:-1:-1;21134:1113:0;;;;;:::i;:::-;;:::i;32289:679::-;;;;;;;;;;-1:-1:-1;32289:679:0;;;;;:::i;:::-;;:::i;:::-;;;3944:25:1;;;3932:2;3917:18;32289:679:0;3798:177:1;34282:167:0;;;;;;;;;;-1:-1:-1;34282:167:0;;;;;:::i;:::-;;:::i;17029:29::-;;;;;;;;;;;;;;;;30316:374;;;;;;;;;;-1:-1:-1;30316:374:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35217:106::-;;;;;;;;;;-1:-1:-1;35294:21:0;35217:106;;29218:1090;;;;;;:::i;:::-;;:::i;25487:297::-;;;;;;;;;;-1:-1:-1;25487:297:0;;;;;:::i;:::-;;:::i;:::-;;;5957:14:1;;5950:22;5932:41;;5920:2;5905:18;25487:297:0;5792:187:1;23341:358:0;;;;;;;;;;-1:-1:-1;23341:358:0;;;;;:::i;:::-;;:::i;17686:49::-;;;;;;;;;;-1:-1:-1;17686:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;17065:33;;;;;;;;;;-1:-1:-1;17065:33:0;;;;-1:-1:-1;;;;;17065:33:0;;;16958:23;;;;;;;;;;;;;;;;17105;;;;;;;;;;-1:-1:-1;17105:23:0;;;;-1:-1:-1;;;;;17105:23:0;;;22736:597;;;;;;;;;;-1:-1:-1;22736:597:0;;;;;:::i;:::-;;:::i;23967:266::-;;;;;;;;;;-1:-1:-1;23967:266:0;;;;;:::i;:::-;;:::i;33421:853::-;;;;;;;;;;;;;:::i;13698:148::-;;;;;;;;;;;;;:::i;30698:485::-;;;;;;;;;;-1:-1:-1;30698:485:0;;;;;:::i;:::-;;:::i;26133:3077::-;;;;;;;;;;-1:-1:-1;26133:3077:0;;;;;:::i;:::-;;:::i;22255:473::-;;;;;;;;;;-1:-1:-1;22255:473:0;;;;;:::i;:::-;;:::i;17888:49::-;;;;;;;;;;-1:-1:-1;17888:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;13056:79;;;;;;;;;;-1:-1:-1;13094:7:0;13121:6;-1:-1:-1;;;;;13121:6:0;13056:79;;17742:64;;;;;;;;;;-1:-1:-1;17742:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17742:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7670:15:1;;;7652:34;;7722:15;;;;7717:2;7702:18;;7695:43;7754:18;;;7747:34;;;;7812:2;7797:18;;7790:34;;;;7855:3;7840:19;;7833:35;;;;7632:3;7884:19;;7877:35;7943:3;7928:19;;7921:35;7987:3;7972:19;;7965:35;8044:14;8037:22;8031:3;8016:19;;8009:51;7601:3;7586:19;17742:64:0;7249:817:1;34804:290:0;;;;;;;;;;-1:-1:-1;34804:290:0;;;;;:::i;:::-;;:::i;35102:107::-;;;;;;;;;;-1:-1:-1;35178:16:0;:23;35102:107;;31191:485;;;;;;;;;;-1:-1:-1;31191:485:0;;;;;:::i;:::-;;:::i;17855:26::-;;;;;;;;;;-1:-1:-1;17855:26:0;;;;;:::i;:::-;;:::i;32976:437::-;;;;;;;;;;;;;:::i;23707:252::-;;;;;;;;;;-1:-1:-1;23707:252:0;;;;;:::i;:::-;;:::i;34457:339::-;;;;;;;;;;-1:-1:-1;34457:339:0;;;;;:::i;:::-;;:::i;17633:46::-;;;;;;;;;;-1:-1:-1;17633:46:0;;;;;:::i;:::-;;:::i;17601:25::-;;;;;;;;;;;;;;;;17944:65;;;;;;;;;;-1:-1:-1;17944:65:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8324:25:1;;;8380:2;8365:18;;8358:34;;;;8408:18;;;8401:34;;;;8466:2;8451:18;;8444:34;8522:14;8515:22;8509:3;8494:19;;8487:51;8311:3;8296:19;17944:65:0;8071:473:1;31684:597:0;;;;;;;;;;-1:-1:-1;31684:597:0;;;;;:::i;:::-;;:::i;24502:438::-;;;;;;;;;;-1:-1:-1;24502:438:0;;;;;:::i;:::-;;:::i;14001:281::-;;;;;;;;;;-1:-1:-1;14001:281:0;;;;;:::i;:::-;;:::i;24241:179::-;;;;;;;;;;-1:-1:-1;24241:179:0;;;;;:::i;:::-;;:::i;25016:463::-;;;;;;;;;;-1:-1:-1;25016:463:0;;;;;:::i;:::-;;:::i;17815:33::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17815:33:0;;-1:-1:-1;17815:33:0;:::o;19712:1414::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;19983:30:0;::::1;19961:111;;;;-1:-1:-1::0;;;19961:111:0::1;;;;;;;:::i;:::-;20104:3;20091:10;:16;20083:55;;;;-1:-1:-1::0;;;20083:55:0::1;;;;;;;:::i;:::-;20176:3;20157:16;:22;20149:61;;;;-1:-1:-1::0;;;20149:61:0::1;;;;;;;:::i;:::-;20243:3;20229:10;:17;;20221:53;;;::::0;-1:-1:-1;;;20221:53:0;;9827:2:1;20221:53:0::1;::::0;::::1;9809:21:1::0;9866:2;9846:18;;;9839:30;-1:-1:-1;;;9885:18:1;;;9878:53;9948:18;;20221:53:0::1;9625:347:1::0;20221:53:0::1;20287:15;20305:35;20323:16;20305:17;:35::i;:::-;20287:53;;20356:10;20351:133;;20383:16;:39:::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;-1:-1:-1;;;;;;20383:39:0::1;-1:-1:-1::0;;;;;20383:39:0;::::1;::::0;;::::1;::::0;;;-1:-1:-1;20437:27:0;;;:9:::1;20383:39;20437:27:::0;;;;;;;:35;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;20351:133;20494:27;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20494:27:0::1;20532:40:::0;;;20583:21:::1;::::0;;::::1;:34:::0;;;20630:27:::1;::::0;;::::1;:46:::0;;;20687:21:::1;::::0;::::1;:34:::0;;;-1:-1:-1;20732:18:0::1;::::0;::::1;:26:::0;;;-1:-1:-1;;;;;20791:32:0;::::1;::::0;;;:14:::1;:32:::0;;;;;;;;20836:9:::1;:27:::0;;;;;:40;;;;;;;;:54;;;;;;20732:26;20836:54;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;20836:54:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;20901:32;;;;;;:34;;20791:32;;20901:34;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;20953:165:0::1;::::0;;-1:-1:-1;;;;;10526:32:1;;10508:51;;10590:2;10575:18;;10568:34;;;10618:18;;;10611:34;;;10676:2;10661:18;;10654:34;;;10719:3;10704:19;;10697:35;;;20953:165:0::1;::::0;10495:3:1;10480:19;20953:165:0::1;;;;;;;19950:1176;;;19712:1414:::0;;;;;;:::o;21134:1113::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21400:30:0;::::1;21378:111;;;;-1:-1:-1::0;;;21378:111:0::1;;;;;;;:::i;:::-;21500:15;21518:35;21536:16;21518:17;:35::i;:::-;21500:53;;21572:10;21564:50;;;;-1:-1:-1::0;;;21564:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21645:32:0;::::1;21625:17;21645:32:::0;;;:14:::1;:32;::::0;;;;;21696:18;;::::1;21688:53;;;::::0;-1:-1:-1;;;21688:53:0;;11301:2:1;21688:53:0::1;::::0;::::1;11283:21:1::0;11340:2;11320:18;;;11313:30;-1:-1:-1;;;11359:18:1;;;11352:52;11421:18;;21688:53:0::1;11099:346:1::0;21688:53:0::1;21773:3;21760:10;:16;21752:55;;;;-1:-1:-1::0;;;21752:55:0::1;;;;;;;:::i;:::-;21845:3;21826:16;:22;21818:61;;;;-1:-1:-1::0;;;21818:61:0::1;;;;;;;:::i;:::-;21912:3;21898:10;:17;;21890:53;;;::::0;-1:-1:-1;;;21890:53:0;;9827:2:1;21890:53:0::1;::::0;::::1;9809:21:1::0;9866:2;9846:18;;;9839:30;-1:-1:-1;;;9885:18:1;;;9878:53;9948:18;;21890:53:0::1;9625:347:1::0;21890:53:0::1;-1:-1:-1::0;;;;;;;21956:27:0;;;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:35;;;;;;;;;;:64;;;22031:45:::1;::::0;::::1;:58:::0;22100:51:::1;::::0;::::1;:70:::0;;;;22181:45:::1;;:58:::0;21134:1113::o;32289:679::-;32351:7;32371:23;32410:9;32405:523;32429:9;:16;32425:20;;32405:523;;;32467:12;32482:9;32492:1;32482:12;;;;;;;;:::i;:::-;;;;;;;;;;32606:10;;-1:-1:-1;;;;;32482:12:0;;;;-1:-1:-1;32541:90:0;;32482:12;;32541:23;:90::i;:::-;32509:122;;32651:9;32646:271;32670:8;:15;32666:1;:19;32646:271;;;32725:8;32734:1;32725:11;;;;;;;;:::i;:::-;;;;;;;:17;;;-1:-1:-1;;;;;32715:27:0;:6;-1:-1:-1;;;;;32715:27:0;;32711:191;;32785:97;32831:8;32840:1;32831:11;;;;;;;;:::i;:::-;;;;;;;:28;;;32785:15;:19;;:97;;;;:::i;:::-;32767:115;;32711:191;32687:3;;;;:::i;:::-;;;;32646:271;;;;32452:476;;32447:3;;;;;:::i;:::-;;;;32405:523;;;-1:-1:-1;32945:15:0;32289:679;-1:-1:-1;;32289:679:0:o;34282:167::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34362:22:0;::::1;34354:57;;;::::0;-1:-1:-1;;;34354:57:0;;11784:2:1;34354:57:0::1;::::0;::::1;11766:21:1::0;11823:2;11803:18;;;11796:30;-1:-1:-1;;;11842:18:1;;;11835:52;11904:18;;34354:57:0::1;11582:346:1::0;34354:57:0::1;34422:8;:19:::0;;-1:-1:-1;;;;;;34422:19:0::1;-1:-1:-1::0;;;;;34422:19:0;;;::::1;::::0;;;::::1;::::0;;34282:167::o;30316:374::-;-1:-1:-1;;;;;30506:21:0;;30442:29;30506:21;;;:14;:21;;;;;;30404:20;;30442:29;30474:64;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;30442:96;;30554:9;30549:108;-1:-1:-1;;;;;30573:21:0;;;;;;:14;:21;;;;;;30569:25;;30549:108;;;-1:-1:-1;;;;;30630:12:0;;;;;;;:5;:12;;;;;;;;:15;;;;;;;;;30616:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;;:8;;30643:1;;30616:11;;;;;;:::i;:::-;;;;;;:29;;;;30596:3;;;;;:::i;:::-;;;;30549:108;;29218:1090;15931:1;16527:7;;:19;16519:63;;;;-1:-1:-1;;;16519:63:0;;12135:2:1;16519:63:0;;;12117:21:1;12174:2;12154:18;;;12147:30;12213:33;12193:18;;;12186:61;12264:18;;16519:63:0;11933:355:1;16519:63:0;15931:1;16660:7;:18;29381:10:::1;29345:27;29375:17:::0;;;:5:::1;:17;::::0;;;;;;;:22;;;;;;;;29430:16;;29375:22;;-1:-1:-1;;;;;29430:16:0;;::::1;:30;29408:114;;;::::0;-1:-1:-1;;;29408:114:0;;12495:2:1;29408:114:0::1;::::0;::::1;12477:21:1::0;12534:2;12514:18;;;12507:30;12573:34;12553:18;;;12546:62;-1:-1:-1;;;12624:18:1;;;12617:32;12666:19;;29408:114:0::1;12293:398:1::0;29408:114:0::1;29542:17;::::0;::::1;::::0;::::1;;29541:18;29533:55;;;::::0;-1:-1:-1;;;29533:55:0;;12898:2:1;29533:55:0::1;::::0;::::1;12880:21:1::0;12937:2;12917:18;;;12910:30;12976:26;12956:18;;;12949:54;13020:18;;29533:55:0::1;12696:348:1::0;29533:55:0::1;29640:7;:19;;;29621:15;:38;;29599:112;;;::::0;-1:-1:-1;;;29599:112:0;;13251:2:1;29599:112:0::1;::::0;::::1;13233:21:1::0;13290:2;13270:18;;;13263:30;13329:26;13309:18;;;13302:54;13373:18;;29599:112:0::1;13049:348:1::0;29599:112:0::1;29757:7;:21;;;29744:9;:34;;29722:109;;;::::0;-1:-1:-1;;;29722:109:0;;13604:2:1;29722:109:0::1;::::0;::::1;13586:21:1::0;13643:2;13623:18;;;13616:30;13682:27;13662:18;;;13655:55;13727:18;;29722:109:0::1;13402:349:1::0;29722:109:0::1;29842:17;::::0;::::1;:24:::0;;-1:-1:-1;;29842:24:0::1;29862:4;29842:24;::::0;;29980::::1;::::0;::::1;::::0;29899:120:::1;::::0;-1:-1:-1;;;29899:120:0;;29951:10:::1;29899:120;::::0;::::1;188:51:1::0;255:18;;;248:34;;;;-1:-1:-1;;;;;29899:33:0;::::1;::::0;::::1;::::0;161:18:1;;29899:120:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29877:227;;;::::0;-1:-1:-1;;;29877:227:0;;14208:2:1;29877:227:0::1;::::0;::::1;14190:21:1::0;14247:2;14227:18;;;14220:30;14286:34;14266:18;;;14259:62;14357:27;14337:18;;;14330:55;14402:19;;29877:227:0::1;14006:421:1::0;29877:227:0::1;30167:17;::::0;::::1;::::0;30229:21:::1;::::0;::::1;::::0;30265:24:::1;::::0;::::1;::::0;30120:180:::1;::::0;;30142:10:::1;14685:51:1::0;;30167:17:0::1;::::0;;::::1;14779:14:1::0;14772:22;14767:2;14752:18;;14745:50;30199:15:0::1;14811:18:1::0;;;14804:34;14869:2;14854:18;;14847:34;;;;14912:3;14897:19;;14890:35;30120:180:0;::::1;::::0;;;;14672:3:1;30120:180:0;;::::1;-1:-1:-1::0;;15887:1:0;16839:22;;-1:-1:-1;29218:1090:0:o;25487:297::-;25543:4;25560:16;25579:21;25560:40;;25611:15;25629:31;25656:3;25629:22;25642:8;;25629;:12;;:22;;;;:::i;:::-;:26;;:31::i;:::-;25611:49;;25685:7;25675;:17;25671:106;;;-1:-1:-1;25716:5:0;;25487:297;-1:-1:-1;;;25487:297:0:o;25671:106::-;-1:-1:-1;25761:4:0;;25487:297;-1:-1:-1;;;25487:297:0:o;23341:358::-;23435:16;:23;23404:4;;;;23500:167;23524:3;23520:1;:7;23500:167;;;23562:16;23579:1;23562:19;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;23562:19:0;;;23553:28;;;;23549:107;;23612:4;23602:14;;23635:5;;23549:107;23529:3;;;;:::i;:::-;;;;23500:167;;;-1:-1:-1;23684:7:0;23341:358;-1:-1:-1;;;23341:358:0:o;22736:597::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22907:30:0;::::1;22885:111;;;;-1:-1:-1::0;;;22885:111:0::1;;;;;;;:::i;:::-;23007:15;23025:35;23043:16;23025:17;:35::i;:::-;23007:53;;23079:10;23071:50;;;;-1:-1:-1::0;;;23071:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;23152:32:0;::::1;23132:17;23152:32:::0;;;:14:::1;:32;::::0;;;;;23203:23;;::::1;23195:62;;;::::0;-1:-1:-1;;;23195:62:0;;15138:2:1;23195:62:0::1;::::0;::::1;15120:21:1::0;15177:2;15157:18;;;15150:30;15216:28;15196:18;;;15189:56;15262:18;;23195:62:0::1;14936:350:1::0;23195:62:0::1;-1:-1:-1::0;;;;;;;23268:27:0;;;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:40;;;;;;;:47:::1;;:57:::0;;-1:-1:-1;;23268:57:0::1;::::0;::::1;;::::0;;;::::1;::::0;;22736:597::o;23967:266::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24090:27:0;::::1;24082:66;;;::::0;-1:-1:-1;;;24082:66:0;;15493:2:1;24082:66:0::1;::::0;::::1;15475:21:1::0;15532:2;15512:18;;;15505:30;15571:28;15551:18;;;15544:56;15617:18;;24082:66:0::1;15291:350:1::0;24082:66:0::1;24159:18;:34:::0;;-1:-1:-1;;;;;;24159:34:0::1;-1:-1:-1::0;;;;;24159:34:0;;;::::1;::::0;;;::::1;::::0;;;24204:14:::1;:21:::0;23967:266::o;33421:853::-;19339:8;;-1:-1:-1;;;;;19339:8:0;19351:10;19339:22;19331:71;;;;-1:-1:-1;;;19331:71:0;;;;;;;:::i;:::-;33479:9:::1;33474:754;33498:16;:23:::0;33494:27;::::1;33474:754;;;33543:19;33565:36;33581:16;33598:1;33581:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;33581:19:0::1;33565:15;:36::i;:::-;33543:58:::0;-1:-1:-1;33620:15:0;;33616:601:::1;;33663:16;33680:1;33663:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;33656:135:::1;::::0;-1:-1:-1;;;33656:135:0;;-1:-1:-1;;;;;33722:15:0::1;206:32:1::0;;33656:135:0::1;::::0;::::1;188:51:1::0;255:18;;;248:34;;;33663:19:0;;::::1;::::0;33656:35:::1;::::0;161:18:1;;33656:135:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33810:21;33834:9;:30;33844:16;33861:1;33844:19;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;33844:19:0::1;33834:30:::0;;;;::::1;::::0;;;;;;;;;;33810:54;;;;;;::::1;::::0;;;;;;;;;;;;33834:30;;33810:54;;::::1;33834:30:::0;33810:54;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;33810:54:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;-1:-1:-1::0;;33883:318:0::1;::::0;-1:-1:-1;;;33883:318:0;;33810:54;;-1:-1:-1;;;;;;;33883:15:0::1;:88;::::0;::::1;::::0;-1:-1:-1;33883:318:0::1;::::0;-1:-1:-1;33998:11:0;;34036:1:::1;::::0;33810:54;;34131:4:::1;::::0;34163:15:::1;::::0;33883:318:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33637:580;33616:601;-1:-1:-1::0;33523:3:0;::::1;::::0;::::1;:::i;:::-;;;;33474:754;;;-1:-1:-1::0;34251:15:0::1;34238:10;:28:::0;33421:853::o;13698:148::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;13805:1:::1;13789:6:::0;;13768:40:::1;::::0;-1:-1:-1;;;;;13789:6:0;;::::1;::::0;13768:40:::1;::::0;13805:1;;13768:40:::1;13836:1;13819:19:::0;;-1:-1:-1;;;;;;13819:19:0::1;::::0;;13698:148::o;30698:485::-;-1:-1:-1;;;;;30877:21:0;;30828:28;30877:21;;;:14;:21;;;;;;30790:20;;30828:28;30859:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;30828:71;;30915:9;30910:241;-1:-1:-1;;;;;30934:21:0;;;;;;:14;:21;;;;;;30930:25;;30910:241;;;-1:-1:-1;;;;;31002:12:0;;;30977:22;31002:12;;;:5;:12;;;;;;;;:15;;;;;;;;;30977:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31036:51;;;31072:15;31054:3;:15;;;:33;31036:51;31032:108;;;31121:3;31108:7;31116:1;31108:10;;;;;;;;:::i;:::-;;;;;;:16;;;;31032:108;-1:-1:-1;30957:3:0;;;;:::i;:::-;;;;30910:241;;26133:3077;15931:1;16527:7;;:19;16519:63;;;;-1:-1:-1;;;16519:63:0;;12135:2:1;16519:63:0;;;12117:21:1;12174:2;12154:18;;;12147:30;12213:33;12193:18;;;12186:61;12264:18;;16519:63:0;11933:355:1;16519:63:0;15931:1;16660:7;:18;-1:-1:-1;;;;;26309:27:0;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:40;;;;;;;;:47:::1;;::::0;::::1;;26308:48;26286:128;;;::::0;-1:-1:-1;;;26286:128:0;;17306:2:1;26286:128:0::1;::::0;::::1;17288:21:1::0;17345:2;17325:18;;;17318:30;17384:32;17364:18;;;17357:60;17434:18;;26286:128:0::1;17104:354:1::0;26286:128:0::1;-1:-1:-1::0;;;;;26588:31:0;::::1;26425:19;26588:31:::0;;;:14:::1;:31;::::0;;;;;26447:12;;26496:16;;26544:11;;26648:24;;::::1;26640:64;;;::::0;-1:-1:-1;;;26640:64:0;;17665:2:1;26640:64:0::1;::::0;::::1;17647:21:1::0;17704:2;17684:18;;;17677:30;17743:29;17723:18;;;17716:57;17790:18;;26640:64:0::1;17463:351:1::0;26640:64:0::1;26743:45;::::0;-1:-1:-1;;;26743:45:0;;26777:10:::1;26743:45;::::0;::::1;465:51:1::0;26725:15:0::1;::::0;-1:-1:-1;;;;;26743:33:0;::::1;::::0;::::1;::::0;438:18:1;;26743:45:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26725:63;;26827:11;26817:7;:21;26809:69;;;::::0;-1:-1:-1;;;26809:69:0;;18210:2:1;26809:69:0::1;::::0;::::1;18192:21:1::0;18249:2;18229:18;;;18222:30;18288:34;18268:18;;;18261:62;-1:-1:-1;;;18339:18:1;;;18332:33;18382:19;;26809:69:0::1;18008:399:1::0;26809:69:0::1;26891:13;26907:31;26927:10;26907:19;:31::i;:::-;26891:47;;26949:13;26966:8;26965:9;:143;;-1:-1:-1::0;;;;;27054:26:0;::::1;;::::0;;;:9:::1;:26;::::0;;;;;;;:38;;;;;;;;:54:::1;;::::0;26965:143:::1;;;-1:-1:-1::0;;;;;26990:26:0;::::1;;::::0;;;:9:::1;:26;::::0;;;;;;;:38;;;;;;;;:48:::1;;::::0;26965:143:::1;27143:72;::::0;-1:-1:-1;;;27143:72:0;;27199:4:::1;27143:72;::::0;::::1;465:51:1::0;26949:159:0;;-1:-1:-1;27119:21:0::1;::::0;-1:-1:-1;;;;;27143:33:0;::::1;::::0;::::1;::::0;438:18:1;;27143:72:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27119:96;;27250:55;27264:10;27276:15;27293:11;27250:13;:55::i;:::-;27228:159;;;::::0;-1:-1:-1;;;27228:159:0;;18614:2:1;27228:159:0::1;::::0;::::1;18596:21:1::0;18653:2;18633:18;;;18626:30;18692:34;18672:18;;;18665:62;-1:-1:-1;;;18743:18:1;;;18736:52;18805:19;;27228:159:0::1;18412:418:1::0;27228:159:0::1;27431:48;::::0;-1:-1:-1;;;27431:48:0;;27473:4:::1;27431:48;::::0;::::1;465:51:1::0;27408:20:0::1;::::0;-1:-1:-1;;;;;27431:33:0;::::1;::::0;::::1;::::0;438:18:1;;27431:48:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27408:71:::0;-1:-1:-1;27490:23:0::1;27516:28;27531:13:::0;27408:71;27516:28:::1;:::i;:::-;27490:54;;27555:21;27579:115;27618:15;27648:5;27668:15;27579:24;:115::i;:::-;27555:139;;27705:14;27743:9:::0;27738:180:::1;27762:9;:16:::0;27758:20;::::1;27738:180;;;27820:10;-1:-1:-1::0;;;;;27804:26:0::1;:9;27814:1;27804:12;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;27804:12:0::1;:26:::0;27800:107:::1;;27863:4;27851:16;;27886:5;;27800:107;27780:3:::0;::::1;::::0;::::1;:::i;:::-;;;;27738:180;;;-1:-1:-1::0;27932:18:0;::::1;;27945:5;27932:18:::0;27928:77:::1;;27967:9;:26:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;27967:26:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;27967:26:0::1;27982:10;27967:26;::::0;;27928:77:::1;28037:23;28046:13;28037:8;:23::i;:::-;28015:127;;;::::0;-1:-1:-1;;;28015:127:0;;19170:2:1;28015:127:0::1;::::0;::::1;19152:21:1::0;19209:2;19189:18;;;19182:30;19248:34;19228:18;;;19221:62;-1:-1:-1;;;19299:18:1;;;19292:52;19361:19;;28015:127:0::1;18968:418:1::0;28015:127:0::1;28153:26;;:::i;:::-;28209:10;28190:29:::0;;;28230:18:::1;::::0;;::::1;:34:::0;;;28275:24:::1;::::0;::::1;:42:::0;;;-1:-1:-1;28345:26:0;;;:14:::1;:26;::::0;;;;;;;28328:14:::1;::::0;::::1;:43:::0;28382:17:::1;::::0;::::1;:25:::0;;;-1:-1:-1;;;;;28418:31:0;::::1;:13:::0;;::::1;:31:::0;;;28480:26;;:9:::1;:26:::0;;;;;:38;;;;;;;:48:::1;::::0;::::1;::::0;28562:65;;28662:37:::1;28695:3;28662:28;28230:34:::0;28480:48;28662:17:::1;:28::i;:37::-;28638:21;::::0;::::1;:61:::0;28732:30:::1;28750:12:::0;28732:15:::1;:30;:::i;:::-;28710:19;::::0;::::1;:52:::0;;;28773:16:::1;::::0;::::1;:31:::0;;;28823:10:::1;-1:-1:-1::0;28817:17:0;;;:5:::1;:17;::::0;;;;;;;28835:14:::1;:26:::0;;;;;;;;28817:45;;;;;;;;:55;;;;-1:-1:-1;;;;;28817:55:0;;::::1;-1:-1:-1::0;;;;;;28817:55:0;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;;;;::::1;::::0;::::1;;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;::::1;;-1:-1:-1::0;;28817:55:0;;::::1;::::0;;;::::1;::::0;;28883:26;;;;;;:28;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;28922:43:0::1;::::0;28930:10:::1;::::0;28922:43;::::1;;;::::0;28951:13;;28922:43:::1;::::0;;;28951:13;28930:10;28922:43;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;29008:10;-1:-1:-1::0;;;;;28981:221:0::1;;29033:7;:18;;;29066:7;:24;;;29105:7;:21;;;29141:7;:19;;;29175:7;:16;;;28981:221;;;;;;;;;19780:25:1::0;;;19836:2;19821:18;;19814:34;;;;19879:2;19864:18;;19857:34;;;;19922:2;19907:18;;19900:34;19965:3;19950:19;;19943:35;19767:3;19752:19;;19521:463;28981:221:0::1;;;;;;;;-1:-1:-1::0;;15887:1:0;16839:22;;-1:-1:-1;;;;;;;;;;;;;;;;26133:3077:0:o;22255:473::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22402:30:0;::::1;22380:111;;;;-1:-1:-1::0;;;22380:111:0::1;;;;;;;:::i;:::-;22502:15;22520:35;22538:16;22520:17;:35::i;:::-;22502:53;;22574:10;22566:50;;;;-1:-1:-1::0;;;22566:50:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22627:27:0;::::1;;::::0;;;:9:::1;:27;::::0;;;;;;;:35;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;22680:40;22696:16;22714:5;22680:40;;;;;;;:::i;:::-;;;;;;;;22369:359;22255:473:::0;;:::o;34804:290::-;19339:8;;-1:-1:-1;;;;;19339:8:0;19351:10;19339:22;19331:71;;;;-1:-1:-1;;;19331:71:0;;;;;;;:::i;:::-;34873:15:::1;34891:25;34909:6;34891:17;:25::i;:::-;34873:43;;34932:10;34927:160;;34977:39;::::0;-1:-1:-1;;;34977:39:0;;35010:4:::1;34977:39;::::0;::::1;465:51:1::0;34959:15:0::1;::::0;-1:-1:-1;;;;;34977:24:0;::::1;::::0;::::1;::::0;438:18:1;;34977:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35031:44;::::0;-1:-1:-1;;;35031:44:0;;35055:10:::1;35031:44;::::0;::::1;188:51:1::0;255:18;;;248:34;;;34959:57:0;;-1:-1:-1;;;;;;35031:23:0;::::1;::::0;::::1;::::0;161:18:1;;35031:44:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34944:143;34927:160;34862:232;34804:290:::0;:::o;31191:485::-;-1:-1:-1;;;;;31370:21:0;;31321:28;31370:21;;;:14;:21;;;;;;31283:20;;31321:28;31352:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;31321:71;;31408:9;31403:241;-1:-1:-1;;;;;31427:21:0;;;;;;:14;:21;;;;;;31423:25;;31403:241;;;-1:-1:-1;;;;;31495:12:0;;;31470:22;31495:12;;;:5;:12;;;;;;;;:15;;;;;;;;;31470:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31529:51;;;31565:15;31547:3;:15;;;:33;31529:51;31525:108;;;31614:3;31601:7;31609:1;31601:10;;;;;;;;:::i;:::-;;;;;;:16;;;;31525:108;-1:-1:-1;31450:3:0;;;;:::i;:::-;;;;31403:241;;17855:26;;;;;;;;;;;;32976:437;33020:4;;;;33099:204;33123:16;:23;33119:27;;33099:204;;;33168:19;33190:36;33206:16;33223:1;33206:19;;;;;;;;:::i;33190:36::-;33168:58;-1:-1:-1;33259:32:0;:15;33168:58;33259:19;:32::i;:::-;33241:50;;33153:150;33148:3;;;;;:::i;:::-;;;;33099:204;;;-1:-1:-1;33317:19:0;;33313:67;;-1:-1:-1;33364:4:0;33313:67;33397:8;32976:437;-1:-1:-1;;32976:437:0:o;23707:252::-;23814:18;;;23807:43;;-1:-1:-1;;;23807:43:0;;-1:-1:-1;;;;;483:32:1;;;23807:43:0;;;465:51:1;;;;23772:4:0;;;;23814:18;;23807:36;;438:18:1;;23807:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23789:61;;23875:14;;23865:7;:24;23861:68;;;-1:-1:-1;23913:4:0;;23707:252;-1:-1:-1;;23707:252:0:o;23861:68::-;-1:-1:-1;23946:5:0;;23707:252;-1:-1:-1;;23707:252:0:o;34457:339::-;13094:7;13121:6;-1:-1:-1;;;;;13121:6:0;19495:10;:21;;19494:51;;-1:-1:-1;19536:8:0;;-1:-1:-1;;;;;19536:8:0;19522:10;:22;19494:51;19472:122;;;;-1:-1:-1;;;19472:122:0;;20554:2:1;19472:122:0;;;20536:21:1;20593:2;20573:18;;;20566:30;-1:-1:-1;;;20612:18:1;;;20605:51;20673:18;;19472:122:0;20352:345:1;19472:122:0;34554:21:::1;34608:18:::0;;::::1;34586:115;;;::::0;-1:-1:-1;;;34586:115:0;;20904:2:1;34586:115:0::1;::::0;::::1;20886:21:1::0;20943:2;20923:18;;;20916:30;20982:34;20962:18;;;20955:62;-1:-1:-1;;;21033:18:1;;;21026:45;21088:19;;34586:115:0::1;20702:411:1::0;34586:115:0::1;34712:22;13121:6:::0;;34764:24:::1;::::0;-1:-1:-1;;;;;13121:6:0;;;;;;34764:24:::1;::::0;::::1;;::::0;;;;;34712:22;34764:24;;13121:6;34764:24;::::1;;;;;;;;;;;;;::::0;::::1;;;;17633:46:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17633:46:0;;-1:-1:-1;17633:46:0;;-1:-1:-1;17633:46:0:o;31684:597::-;-1:-1:-1;;;;;31882:21:0;;31833:28;31882:21;;;:14;:21;;;;;;31795:20;;31833:28;31864:40;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;31833:71;;31920:9;31915:334;-1:-1:-1;;;;;31939:21:0;;;;;;:14;:21;;;;;;31935:25;;31915:334;;;-1:-1:-1;;;;;32007:12:0;;;31982:22;32007:12;;;:5;:12;;;;;;;;:15;;;;;;;;;31982:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32059:68;;;32112:15;32094:3;:15;;;:33;32059:68;:112;;;;;32156:3;:15;;;32148:5;:23;32059:112;32037:201;;;32219:3;32206:7;32214:1;32206:10;;;;;;;;:::i;:::-;;;;;;:16;;;;32037:201;-1:-1:-1;31962:3:0;;;;:::i;:::-;;;;31915:334;;24502:438;-1:-1:-1;;;;;24694:27:0;;24650:7;24694:27;;;:9;:27;;;;;;;;24670:51;;;;;;;;;;;;;;;;;24650:7;;24670:51;;24694:27;24670:51;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24670:51:0;;;;;;;;;;;;;;;;;;;;;;;24732:24;24773:4;:11;24759:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24759:26:0;-1:-1:-1;24806:43:0;;-1:-1:-1;;;24806:43:0;;24732:53;;-1:-1:-1;;;;;;24806:15:0;:28;;;;:43;;24835:7;;24844:4;;24806:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24806:43:0;;;;;;;;;;;;:::i;:::-;24796:53;;24860:14;24877:31;24904:3;24877:22;24892:6;24877:7;24885:1;24877:10;;;;;;;;:::i;:::-;;;;;;;:14;;:22;;;;:::i;:::-;:26;;:31::i;:::-;24860:48;24502:438;-1:-1:-1;;;;;;;24502:438:0:o;14001:281::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14104:22:0;::::1;14082:110;;;::::0;-1:-1:-1;;;14082:110:0;;22543:2:1;14082:110:0::1;::::0;::::1;22525:21:1::0;22582:2;22562:18;;;22555:30;22621:34;22601:18;;;22594:62;-1:-1:-1;;;22672:18:1;;;22665:36;22718:19;;14082:110:0::1;22341:402:1::0;14082:110:0::1;14229:6;::::0;;14208:38:::1;::::0;-1:-1:-1;;;;;14208:38:0;;::::1;::::0;14229:6;::::1;::::0;14208:38:::1;::::0;::::1;14257:6;:17:::0;;-1:-1:-1;;;;;;14257:17:0::1;-1:-1:-1::0;;;;;14257:17:0;;;::::1;::::0;;;::::1;::::0;;14001:281::o;24241:179::-;13268:6;;-1:-1:-1;;;;;13268:6:0;12272:10;13268:22;13260:67;;;;-1:-1:-1;;;13260:67:0;;;;;;;:::i;:::-;24331:3:::1;24320:8;;:14;24312:69;;;::::0;-1:-1:-1;;;24312:69:0;;22950:2:1;24312:69:0::1;::::0;::::1;22932:21:1::0;22989:2;22969:18;;;22962:30;23028:34;23008:18;;;23001:62;-1:-1:-1;;;23079:18:1;;;23072:40;23129:19;;24312:69:0::1;22748:406:1::0;24312:69:0::1;24392:8;:20:::0;24241:179::o;25016:463::-;-1:-1:-1;;;;;25213:27:0;;25169:7;25213:27;;;:9;:27;;;;;;;;25189:51;;;;;;;;;;;;;;;;;25169:7;;25189:51;;25213:27;25189:51;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25189:51:0;;;;;;;;;;;;;;;;;;;;;;;25251:24;25292:4;:11;25278:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25278:26:0;-1:-1:-1;25325:49:0;;-1:-1:-1;;;25325:49:0;;25251:53;;-1:-1:-1;;;;;;25325:15:0;:29;;;;:49;;25355:12;;25369:4;;25325:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25325:49:0;;;;;;;;;;;;:::i;:::-;25315:59;;25385:14;25402:45;25443:3;25402:36;25431:6;25402:7;25424:1;25410:4;:11;:15;;;;:::i;:::-;25402:24;;;;;;;;:::i;:::-;;;;;;;:28;;:36;;;;:::i;170:181::-;228:7;;260:5;264:1;260;:5;:::i;:::-;248:17;;289:1;284;:6;;276:46;;;;-1:-1:-1;;;276:46:0;;23361:2:1;276:46:0;;;23343:21:1;23400:2;23380:18;;;23373:30;23439:29;23419:18;;;23412:57;23486:18;;276:46:0;23159:351:1;276:46:0;342:1;170:181;-1:-1:-1;;;170:181:0:o;737:250::-;795:7;819:1;824;819:6;815:47;;-1:-1:-1;849:1:0;842:8;;815:47;874:9;886:5;890:1;886;:5;:::i;:::-;874:17;-1:-1:-1;919:1:0;910:5;914:1;874:17;910:5;:::i;:::-;:10;902:56;;;;-1:-1:-1;;;902:56:0;;24147:2:1;902:56:0;;;24129:21:1;24186:2;24166:18;;;24159:30;24225:34;24205:18;;;24198:62;-1:-1:-1;;;24276:18:1;;;24269:31;24317:19;;902:56:0;23945:397:1;995:132:0;1053:7;1080:39;1084:1;1087;1080:39;;;;;;;;;;;;;;;;;:3;:39::i;25792:333::-;25965:123;;-1:-1:-1;;;25965:123:0;;-1:-1:-1;;;;;24605:15:1;;;25965:123:0;;;24587:34:1;26045:4:0;24637:18:1;;;24630:43;24689:18;;;24682:34;;;25929:4:0;;;;25965:37;;;;;24522:18:1;;25965:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25946:142;25792:333;-1:-1:-1;;;;;25792:333:0:o;1135:311::-;1255:7;1290:12;1283:5;1275:28;;;;-1:-1:-1;;;1275:28:0;;;;;;;;:::i;:::-;-1:-1:-1;1314:9:0;1326:5;1330:1;1326;:5;:::i;:::-;1314:17;-1:-1:-1;1363:5:0;1367:1;1363;:5;:::i;:::-;1354;1358:1;1354;:5;:::i;:::-;:15;;;;:::i;:::-;1349:1;:20;1342:28;;;;:::i;:::-;1437:1;1135:311;-1:-1:-1;;;;1135:311:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;527:180:1;586:6;639:2;627:9;618:7;614:23;610:32;607:52;;;655:1;652;645:12;607:52;-1:-1:-1;678:23:1;;527:180;-1:-1:-1;527:180:1:o;920:173::-;988:20;;-1:-1:-1;;;;;1037:31:1;;1027:42;;1017:70;;1083:1;1080;1073:12;1017:70;920:173;;;:::o;1098:127::-;1159:10;1154:3;1150:20;1147:1;1140:31;1190:4;1187:1;1180:15;1214:4;1211:1;1204:15;1230:275;1301:2;1295:9;1366:2;1347:13;;-1:-1:-1;;1343:27:1;1331:40;;1401:18;1386:34;;1422:22;;;1383:62;1380:88;;;1448:18;;:::i;:::-;1484:2;1477:22;1230:275;;-1:-1:-1;1230:275:1:o;1510:183::-;1570:4;1603:18;1595:6;1592:30;1589:56;;;1625:18;;:::i;:::-;-1:-1:-1;1670:1:1;1666:14;1682:4;1662:25;;1510:183::o;1698:668::-;1752:5;1805:3;1798:4;1790:6;1786:17;1782:27;1772:55;;1823:1;1820;1813:12;1772:55;1859:6;1846:20;1885:4;1909:60;1925:43;1965:2;1925:43;:::i;:::-;1909:60;:::i;:::-;2003:15;;;2089:1;2085:10;;;;2073:23;;2069:32;;;2034:12;;;;2113:15;;;2110:35;;;2141:1;2138;2131:12;2110:35;2177:2;2169:6;2165:15;2189:148;2205:6;2200:3;2197:15;2189:148;;;2271:23;2290:3;2271:23;:::i;:::-;2259:36;;2315:12;;;;2222;;2189:148;;;-1:-1:-1;2355:5:1;1698:668;-1:-1:-1;;;;;;1698:668:1:o;2371:697::-;2500:6;2508;2516;2524;2532;2540;2593:3;2581:9;2572:7;2568:23;2564:33;2561:53;;;2610:1;2607;2600:12;2561:53;2633:29;2652:9;2633:29;:::i;:::-;2623:39;;2709:2;2698:9;2694:18;2681:32;2671:42;;2760:2;2749:9;2745:18;2732:32;2722:42;;2811:2;2800:9;2796:18;2783:32;2773:42;;2862:3;2851:9;2847:19;2834:33;2824:43;;2918:3;2907:9;2903:19;2890:33;2946:18;2938:6;2935:30;2932:50;;;2978:1;2975;2968:12;2932:50;3001:61;3054:7;3045:6;3034:9;3030:22;3001:61;:::i;:::-;2991:71;;;2371:697;;;;;;;;:::o;3073:529::-;3177:6;3185;3193;3201;3209;3217;3270:3;3258:9;3249:7;3245:23;3241:33;3238:53;;;3287:1;3284;3277:12;3238:53;3310:29;3329:9;3310:29;:::i;:::-;3300:39;3386:2;3371:18;;3358:32;;-1:-1:-1;3437:2:1;3422:18;;3409:32;;3488:2;3473:18;;3460:32;;-1:-1:-1;3539:3:1;3524:19;;3511:33;;-1:-1:-1;3591:3:1;3576:19;3563:33;;-1:-1:-1;3073:529:1;-1:-1:-1;;;3073:529:1:o;3607:186::-;3666:6;3719:2;3707:9;3698:7;3694:23;3690:32;3687:52;;;3735:1;3732;3725:12;3687:52;3758:29;3777:9;3758:29;:::i;4076:1452::-;4305:2;4357:21;;;4427:13;;4330:18;;;4449:22;;;4276:4;;4305:2;4490;;4508:18;;;;4549:15;;;4276:4;4592:910;4606:6;4603:1;4600:13;4592:910;;;4665:13;;4749:9;;-1:-1:-1;;;;;4745:18:1;;;4733:31;;4808:11;;;4802:18;4798:27;4784:12;;;4777:49;4866:11;;;4860:18;4846:12;;;4839:40;4902:4;4946:11;;;4940:18;4926:12;;;4919:40;4982:4;5026:11;;;5020:18;5006:12;;;4999:40;4709:3;5106:11;;;5100:18;5086:12;;;5079:40;5142:4;5186:11;;;5180:18;5166:12;;;5159:40;5222:4;5266:11;;;5260:18;5246:12;;;5239:40;5303:6;5348:12;;;5342:19;4050:13;4043:21;5404:13;;;4031:34;5447:6;5438:16;;;;5477:15;;;;4628:1;4621:9;4592:910;;;-1:-1:-1;5519:3:1;;4076:1452;-1:-1:-1;;;;;;;4076:1452:1:o;5533:254::-;5601:6;5609;5662:2;5650:9;5641:7;5637:23;5633:32;5630:52;;;5678:1;5675;5668:12;5630:52;5701:29;5720:9;5701:29;:::i;:::-;5691:39;5777:2;5762:18;;;;5749:32;;-1:-1:-1;;;5533:254:1:o;5984:118::-;6070:5;6063:13;6056:21;6049:5;6046:32;6036:60;;6092:1;6089;6082:12;6036:60;5984:118;:::o;6107:383::-;6181:6;6189;6197;6250:2;6238:9;6229:7;6225:23;6221:32;6218:52;;;6266:1;6263;6256:12;6218:52;6289:29;6308:9;6289:29;:::i;:::-;6279:39;;6365:2;6354:9;6350:18;6337:32;6327:42;;6419:2;6408:9;6404:18;6391:32;6432:28;6454:5;6432:28;:::i;:::-;6479:5;6469:15;;;6107:383;;;;;:::o;6495:322::-;6572:6;6580;6588;6641:2;6629:9;6620:7;6616:23;6612:32;6609:52;;;6657:1;6654;6647:12;6609:52;6680:29;6699:9;6680:29;:::i;:::-;6670:39;6756:2;6741:18;;6728:32;;-1:-1:-1;6807:2:1;6792:18;;;6779:32;;6495:322;-1:-1:-1;;;6495:322:1:o;6822:422::-;6915:6;6923;6976:2;6964:9;6955:7;6951:23;6947:32;6944:52;;;6992:1;6989;6982:12;6944:52;7015:29;7034:9;7015:29;:::i;:::-;7005:39;;7095:2;7084:9;7080:18;7067:32;7122:18;7114:6;7111:30;7108:50;;;7154:1;7151;7144:12;7108:50;7177:61;7230:7;7221:6;7210:9;7206:22;7177:61;:::i;:::-;7167:71;;;6822:422;;;;;:::o;8549:356::-;8751:2;8733:21;;;8770:18;;;8763:30;8829:34;8824:2;8809:18;;8802:62;8896:2;8881:18;;8549:356::o;8910:355::-;9112:2;9094:21;;;9151:2;9131:18;;;9124:30;9190:33;9185:2;9170:18;;9163:61;9256:2;9241:18;;8910:355::o;9270:350::-;9472:2;9454:21;;;9511:2;9491:18;;;9484:30;9550:28;9545:2;9530:18;;9523:56;9611:2;9596:18;;9270:350::o;9977:127::-;10038:10;10033:3;10029:20;10026:1;10019:31;10069:4;10066:1;10059:15;10093:4;10090:1;10083:15;10109:135;10148:3;10169:17;;;10166:43;;10189:18;;:::i;:::-;-1:-1:-1;10236:1:1;10225:13;;10109:135::o;10743:351::-;10945:2;10927:21;;;10984:2;10964:18;;;10957:30;11023:29;11018:2;11003:18;;10996:57;11085:2;11070:18;;10743:351::o;11450:127::-;11511:10;11506:3;11502:20;11499:1;11492:31;11542:4;11539:1;11532:15;11566:4;11563:1;11556:15;13756:245;13823:6;13876:2;13864:9;13855:7;13851:23;13847:32;13844:52;;;13892:1;13889;13882:12;13844:52;13924:9;13918:16;13943:28;13965:5;13943:28;:::i;15646:400::-;15848:2;15830:21;;;15887:2;15867:18;;;15860:30;15926:34;15921:2;15906:18;;15899:62;-1:-1:-1;;;15992:2:1;15977:18;;15970:34;16036:3;16021:19;;15646:400::o;16051:461::-;16104:3;16142:5;16136:12;16169:6;16164:3;16157:19;16195:4;16224:2;16219:3;16215:12;16208:19;;16261:2;16254:5;16250:14;16282:1;16292:195;16306:6;16303:1;16300:13;16292:195;;;16371:13;;-1:-1:-1;;;;;16367:39:1;16355:52;;16427:12;;;;16462:15;;;;16403:1;16321:9;16292:195;;;-1:-1:-1;16503:3:1;;16051:461;-1:-1:-1;;;;;16051:461:1:o;16517:582::-;16816:6;16805:9;16798:25;16859:6;16854:2;16843:9;16839:18;16832:34;16902:3;16897:2;16886:9;16882:18;16875:31;16779:4;16923:57;16975:3;16964:9;16960:19;16952:6;16923:57;:::i;:::-;-1:-1:-1;;;;;17016:32:1;;;;17011:2;16996:18;;16989:60;-1:-1:-1;17080:3:1;17065:19;17058:35;16915:65;16517:582;-1:-1:-1;;;16517:582:1:o;17819:184::-;17889:6;17942:2;17930:9;17921:7;17917:23;17913:32;17910:52;;;17958:1;17955;17948:12;17910:52;-1:-1:-1;17981:16:1;;17819:184;-1:-1:-1;17819:184:1:o;18835:128::-;18902:9;;;18923:11;;;18920:37;;;18937:18;;:::i;19391:125::-;19456:9;;;19477:10;;;19474:36;;;19490:18;;:::i;19989:358::-;-1:-1:-1;;;;;20196:32:1;;20178:51;;20265:2;20260;20245:18;;20238:30;;;-1:-1:-1;;20285:56:1;;20322:18;;20314:6;20285:56;:::i;21118:332::-;21325:6;21314:9;21307:25;21368:2;21363;21352:9;21348:18;21341:30;21288:4;21388:56;21440:2;21429:9;21425:18;21417:6;21388:56;:::i;21455:881::-;21550:6;21581:2;21624;21612:9;21603:7;21599:23;21595:32;21592:52;;;21640:1;21637;21630:12;21592:52;21673:9;21667:16;21706:18;21698:6;21695:30;21692:50;;;21738:1;21735;21728:12;21692:50;21761:22;;21814:4;21806:13;;21802:27;-1:-1:-1;21792:55:1;;21843:1;21840;21833:12;21792:55;21872:2;21866:9;21895:60;21911:43;21951:2;21911:43;:::i;21895:60::-;21989:15;;;22071:1;22067:10;;;;22059:19;;22055:28;;;22020:12;;;;22095:19;;;22092:39;;;22127:1;22124;22117:12;22092:39;22151:11;;;;22171:135;22187:6;22182:3;22179:15;22171:135;;;22253:10;;22241:23;;22204:12;;;;22284;;;;22171:135;;23515:168;23588:9;;;23619;;23636:15;;;23630:22;;23616:37;23606:71;;23657:18;;:::i;23688:127::-;23749:10;23744:3;23740:20;23737:1;23730:31;23780:4;23777:1;23770:15;23804:4;23801:1;23794:15;23820:120;23860:1;23886;23876:35;;23891:18;;:::i;:::-;-1:-1:-1;23925:9:1;;23820:120::o;24727:548::-;24839:4;24868:2;24897;24886:9;24879:21;24929:6;24923:13;24972:6;24967:2;24956:9;24952:18;24945:34;24997:1;25007:140;25021:6;25018:1;25015:13;25007:140;;;25116:14;;;25112:23;;25106:30;25082:17;;;25101:2;25078:26;25071:66;25036:10;;25007:140;;;25011:3;25196:1;25191:2;25182:6;25171:9;25167:22;25163:31;25156:42;25266:2;25259;25255:7;25250:2;25242:6;25238:15;25234:29;25223:9;25219:45;25215:54;25207:62;;;;24727:548;;;;:::o;25280:112::-;25312:1;25338;25328:35;;25343:18;;:::i;:::-;-1:-1:-1;25377:9:1;;25280:112::o;25397:127::-;25458:10;25453:3;25449:20;25446:1;25439:31;25489:4;25486:1;25479:15;25513:4;25510:1;25503:15

Swarm Source

ipfs://554cf459aee1228d6887377c3e44bc317114aaec6e8f569b75a0dea4e712ea6f

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ 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.