ETH Price: $2,040.49 (-0.67%)
Gas: 34 Gwei
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multi Chain

Multichain Addresses

Transaction Hash
Method
Block
From
To
Value
Repay And Withdr...186754532023-11-29 6:23:2321 hrs 33 mins ago1701239003IN
Inverse Finance: FiRM WETH Market
0 ETH0.0064343531.86396935
Withdraw185827082023-11-16 6:39:1113 days 21 hrs ago1700116751IN
Inverse Finance: FiRM WETH Market
0 ETH0.003578524.72520031
Repay185276822023-11-08 13:57:5921 days 13 hrs ago1699451879IN
Inverse Finance: FiRM WETH Market
0 ETH0.0032272539
Deposit185258642023-11-08 7:51:4721 days 20 hrs ago1699429907IN
Inverse Finance: FiRM WETH Market
0 ETH0.001713228
Borrow184950812023-11-04 0:23:3526 days 3 hrs ago1699057415IN
Inverse Finance: FiRM WETH Market
0 ETH0.0026740413.37572128
Repay184859002023-11-02 17:32:4727 days 10 hrs ago1698946367IN
Inverse Finance: FiRM WETH Market
0 ETH0.0028944133.06464262
Repay184820452023-11-02 4:32:2327 days 23 hrs ago1698899543IN
Inverse Finance: FiRM WETH Market
0 ETH0.0017921219.41080198
Borrow184817362023-11-02 3:29:3528 days 27 mins ago1698895775IN
Inverse Finance: FiRM WETH Market
0 ETH0.0053143424.48669471
Borrow184187692023-10-24 7:56:2336 days 20 hrs ago1698134183IN
Inverse Finance: FiRM WETH Market
0 ETH0.0032251315.1964324
Repay183705862023-10-17 14:07:4743 days 13 hrs ago1697551667IN
Inverse Finance: FiRM WETH Market
0 ETH0.0013948815.93465717
Borrow183704242023-10-17 13:34:5943 days 14 hrs ago1697549699IN
Inverse Finance: FiRM WETH Market
0 ETH0.0025877511.92346893
Repay And Withdr...183432042023-10-13 18:16:5947 days 9 hrs ago1697221019IN
Inverse Finance: FiRM WETH Market
0 ETH0.0015275611.44756871
Repay And Withdr...183431922023-10-13 18:14:3547 days 9 hrs ago1697220875IN
Inverse Finance: FiRM WETH Market
0 ETH0.0022381412.75104837
Repay And Withdr...183431692023-10-13 18:09:5947 days 9 hrs ago1697220599IN
Inverse Finance: FiRM WETH Market
0 ETH0.002321613.22655275
Repay And Withdr...183431572023-10-13 18:07:3547 days 9 hrs ago1697220455IN
Inverse Finance: FiRM WETH Market
0 ETH0.0025659914.61887698
Repay And Withdr...183431472023-10-13 18:05:3547 days 9 hrs ago1697220335IN
Inverse Finance: FiRM WETH Market
0 ETH0.0020795610.79588404
Withdraw183431312023-10-13 18:02:2347 days 9 hrs ago1697220143IN
Inverse Finance: FiRM WETH Market
0 ETH0.001423679.83668162
Borrow182612442023-10-02 7:06:3558 days 20 hrs ago1696230395IN
Inverse Finance: FiRM WETH Market
0 ETH0.001548437.29600545
Deposit178631812023-08-07 12:53:35114 days 15 hrs ago1691412815IN
Inverse Finance: FiRM WETH Market
0 ETH0.0016186726.45493998
Withdraw178164522023-08-01 0:03:47121 days 3 hrs ago1690848227IN
Inverse Finance: FiRM WETH Market
0 ETH0.0016582225.92476546
Deposit177899492023-07-28 7:05:23124 days 20 hrs ago1690527923IN
Inverse Finance: FiRM WETH Market
0 ETH0.0055111933
Repay177743452023-07-26 2:42:23127 days 1 hr ago1690339343IN
Inverse Finance: FiRM WETH Market
0 ETH0.0022508426.6009674
Repay177740042023-07-26 1:33:47127 days 2 hrs ago1690335227IN
Inverse Finance: FiRM WETH Market
0 ETH0.0015847218.72865182
Borrow177725052023-07-25 20:31:35127 days 7 hrs ago1690317095IN
Inverse Finance: FiRM WETH Market
0 ETH0.0046813830.71392248
Borrow177716032023-07-25 17:28:59127 days 10 hrs ago1690306139IN
Inverse Finance: FiRM WETH Market
0 ETH0.0042615228.83385429
View all transactions

Latest 24 internal transactions

Advanced mode:
Parent Txn Hash Block From To Value
185346212023-11-09 13:14:5920 days 14 hrs ago1699535699
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
182506272023-09-30 19:32:2360 days 8 hrs ago1696102343
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
177899492023-07-28 7:05:23124 days 20 hrs ago1690527923
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
176645952023-07-10 16:58:47142 days 10 hrs ago1689008327
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
172262632023-05-09 23:51:23204 days 4 hrs ago1683676283
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
171844482023-05-04 2:50:59210 days 1 hr ago1683168659
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
169069332023-03-25 20:44:47249 days 7 hrs ago1679777087
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
167436372023-03-02 21:48:35272 days 6 hrs ago1677793715
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
164660742023-01-23 0:59:23311 days 2 hrs ago1674435563
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
164536472023-01-21 7:21:23312 days 20 hrs ago1674285683
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
162525502022-12-24 5:37:47340 days 22 hrs ago1671860267
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
162371302022-12-22 2:03:47343 days 1 hr ago1671674627
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
162368642022-12-22 1:10:11343 days 2 hrs ago1671671411
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
162290602022-12-20 23:01:47344 days 4 hrs ago1671577307
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
162253362022-12-20 10:33:35344 days 17 hrs ago1671532415
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
162098892022-12-18 6:49:35346 days 21 hrs ago1671346175
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
162060222022-12-17 17:50:47347 days 10 hrs ago1671299447
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
162003382022-12-16 22:48:35348 days 5 hrs ago1671230915
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
161992672022-12-16 19:11:59348 days 8 hrs ago1671217919
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
161979952022-12-16 14:56:23348 days 13 hrs ago1671202583
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
161977812022-12-16 14:13:11348 days 13 hrs ago1671199991
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
161976082022-12-16 13:38:35348 days 14 hrs ago1671197915
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
161975022022-12-16 13:17:11348 days 14 hrs ago1671196631
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
161974892022-12-16 13:14:35348 days 14 hrs ago1671196475
Inverse Finance: FiRM WETH Market
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Market

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-11
*/

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

// Caution. We assume all failed transfers cause reverts and ignore the returned bool.
interface IERC20 {
    function transfer(address,uint) external returns (bool);
    function transferFrom(address,address,uint) external returns (bool);
    function balanceOf(address) external view returns (uint);
}

interface IOracle {
    function getPrice(address,uint) external returns (uint);
    function viewPrice(address,uint) external view returns (uint);
}

interface IEscrow {
    function initialize(IERC20 _token, address beneficiary) external;
    function onDeposit() external;
    function pay(address recipient, uint amount) external;
    function balance() external view returns (uint);
}

interface IDolaBorrowingRights {
    function onBorrow(address user, uint additionalDebt) external;
    function onRepay(address user, uint repaidDebt) external;
    function onForceReplenish(address user, address replenisher, uint amount, uint replenisherReward) external;
    function balanceOf(address user) external view returns (uint);
    function deficitOf(address user) external view returns (uint);
    function replenishmentPriceBps() external view returns (uint);
}

interface IBorrowController {
    function borrowAllowed(address msgSender, address borrower, uint amount) external returns (bool);
    function onRepay(uint amount) external;
}

contract Market {

    address public gov;
    address public lender;
    address public pauseGuardian;
    address public immutable escrowImplementation;
    IDolaBorrowingRights public immutable dbr;
    IBorrowController public borrowController;
    IERC20 public immutable dola = IERC20(0x865377367054516e17014CcdED1e7d814EDC9ce4);
    IERC20 public immutable collateral;
    IOracle public oracle;
    uint public collateralFactorBps;
    uint public replenishmentIncentiveBps;
    uint public liquidationIncentiveBps;
    uint public liquidationFeeBps;
    uint public liquidationFactorBps = 5000; // 50% by default
    bool immutable callOnDepositCallback;
    bool public borrowPaused;
    uint public totalDebt;
    uint256 internal immutable INITIAL_CHAIN_ID;
    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;
    mapping (address => IEscrow) public escrows; // user => escrow
    mapping (address => uint) public debts; // user => debt
    mapping(address => uint256) public nonces; // user => nonce

    constructor (
        address _gov,
        address _lender,
        address _pauseGuardian,
        address _escrowImplementation,
        IDolaBorrowingRights _dbr,
        IERC20 _collateral,
        IOracle _oracle,
        uint _collateralFactorBps,
        uint _replenishmentIncentiveBps,
        uint _liquidationIncentiveBps,
        bool _callOnDepositCallback
    ) {
        require(_collateralFactorBps < 10000, "Invalid collateral factor");
        require(_liquidationIncentiveBps > 0 && _liquidationIncentiveBps < 10000, "Invalid liquidation incentive");
        require(_replenishmentIncentiveBps < 10000, "Replenishment incentive must be less than 100%");
        gov = _gov;
        lender = _lender;
        pauseGuardian = _pauseGuardian;
        escrowImplementation = _escrowImplementation;
        dbr = _dbr;
        collateral = _collateral;
        oracle = _oracle;
        collateralFactorBps = _collateralFactorBps;
        replenishmentIncentiveBps = _replenishmentIncentiveBps;
        liquidationIncentiveBps = _liquidationIncentiveBps;
        callOnDepositCallback = _callOnDepositCallback;
        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
        if(collateralFactorBps > 0){
            uint unsafeLiquidationIncentive = (10000 - collateralFactorBps) * (liquidationFeeBps + 10000) / collateralFactorBps;
            require(liquidationIncentiveBps < unsafeLiquidationIncentive,  "Liquidation param allow profitable self liquidation");
        }
    }
    
    modifier onlyGov {
        require(msg.sender == gov, "Only gov can call this function");
        _;
    }

    modifier liquidationParamChecker {
        _;
        if(collateralFactorBps > 0){
            uint unsafeLiquidationIncentive = (10000 - collateralFactorBps) * (liquidationFeeBps + 10000) / collateralFactorBps;
            require(liquidationIncentiveBps < unsafeLiquidationIncentive,  "New liquidation param allow profitable self liquidation");
        }
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes("DBR MARKET")),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /**
    @notice sets the oracle to a new oracle. Only callable by governance.
    @param _oracle The new oracle conforming to the IOracle interface.
    */
    function setOracle(IOracle _oracle) public onlyGov { oracle = _oracle; }

    /**
    @notice sets the borrow controller to a new borrow controller. Only callable by governance.
    @param _borrowController The new borrow controller conforming to the IBorrowController interface.
    */
    function setBorrowController(IBorrowController _borrowController) public onlyGov { borrowController = _borrowController; }

    /**
    @notice sets the address of governance. Only callable by governance.
    @param _gov Address of the new governance.
    */
    function setGov(address _gov) public onlyGov { gov = _gov; }

    /**
    @notice sets the lender to a new lender. The lender is allowed to recall dola from the contract. Only callable by governance.
    @param _lender Address of the new lender.
    */
    function setLender(address _lender) public onlyGov { lender = _lender; }

    /**
    @notice sets the pause guardian. The pause guardian can pause borrowing. Only callable by governance.
    @param _pauseGuardian Address of the new pauseGuardian.
    */
    function setPauseGuardian(address _pauseGuardian) public onlyGov { pauseGuardian = _pauseGuardian; }
    
    /**
    @notice sets the Collateral Factor requirement of the market as measured in basis points. 1 = 0.01%. Only callable by governance.
    @dev Collateral factor mus be set below 100%
    @param _collateralFactorBps The new collateral factor as measured in basis points. 
    */
    function setCollateralFactorBps(uint _collateralFactorBps) public onlyGov liquidationParamChecker {
        require(_collateralFactorBps < 10000, "Invalid collateral factor");
        collateralFactorBps = _collateralFactorBps;
    }
    
    /**
    @notice sets the Liquidation Factor of the market as denoted in basis points.
     The liquidation Factor denotes the maximum amount of debt that can be liquidated in basis points.
     At 5000, 50% of of a borrower's underwater debt can be liquidated. Only callable by governance.
    @dev Must be set between 1 and 10000.
    @param _liquidationFactorBps The new liquidation factor in basis points. 1 = 0.01%/
    */
    function setLiquidationFactorBps(uint _liquidationFactorBps) public onlyGov {
        require(_liquidationFactorBps > 0 && _liquidationFactorBps <= 10000, "Invalid liquidation factor");
        liquidationFactorBps = _liquidationFactorBps;
    }

    /**
    @notice sets the Replenishment Incentive of the market as denoted in basis points.
     The Replenishment Incentive is the percentage paid out to replenishers on a successful forceReplenish call, denoted in basis points.
    @dev Must be set between 1 and 10000.
    @param _replenishmentIncentiveBps The new replenishment incentive set in basis points. 1 = 0.01%
    */
    function setReplenismentIncentiveBps(uint _replenishmentIncentiveBps) public onlyGov {
        require(_replenishmentIncentiveBps > 0 && _replenishmentIncentiveBps < 10000, "Invalid replenishment incentive");
        replenishmentIncentiveBps = _replenishmentIncentiveBps;
    }

    /**
    @notice sets the Liquidation Incentive of the market as denoted in basis points.
     The Liquidation Incentive is the percentage paid out to liquidators of a borrower's debt when successfully liquidated.
    @dev Must be set between 0 and 10000 - liquidation fee.
    @param _liquidationIncentiveBps The new liqudation incentive set in basis points. 1 = 0.01% 
    */
    function setLiquidationIncentiveBps(uint _liquidationIncentiveBps) public onlyGov liquidationParamChecker {
        require(_liquidationIncentiveBps > 0 && _liquidationIncentiveBps + liquidationFeeBps < 10000, "Invalid liquidation incentive");
        liquidationIncentiveBps = _liquidationIncentiveBps;
    }

    /**
    @notice sets the Liquidation Fee of the market as denoted in basis points.
     The Liquidation Fee is the percentage paid out to governance of a borrower's debt when successfully liquidated.
    @dev Must be set between 0 and 10000 - liquidation factor.
    @param _liquidationFeeBps The new liquidation fee set in basis points. 1 = 0.01%
    */
    function setLiquidationFeeBps(uint _liquidationFeeBps) public onlyGov liquidationParamChecker {
        require(_liquidationFeeBps > 0 && _liquidationFeeBps + liquidationIncentiveBps < 10000, "Invalid liquidation fee");
        liquidationFeeBps = _liquidationFeeBps;
    }

    /**
    @notice Recalls amount of DOLA to the lender.
    @param amount The amount od DOLA to recall to the the lender.
    */
    function recall(uint amount) public {
        require(msg.sender == lender, "Only lender can recall");
        dola.transfer(msg.sender, amount);
    }

    /**
    @notice Pauses or unpauses borrowing for the market. Only gov can unpause a market, while gov and pauseGuardian can pause it.
    @param _value Boolean representing the state pause state of borrows. true = paused, false = unpaused.
    */
    function pauseBorrows(bool _value) public {
        if(_value) {
            require(msg.sender == pauseGuardian || msg.sender == gov, "Only pause guardian or governance can pause");
        } else {
            require(msg.sender == gov, "Only governance can unpause");
        }
        borrowPaused = _value;
    }

    /**
    @notice Internal function for creating an escrow for users to deposit collateral in.
    @dev Uses create2 and minimal proxies to create the escrow at a deterministic address
    @param user The address of the user to create an escrow for.
    */
    function createEscrow(address user) internal returns (IEscrow instance) {
        address implementation = escrowImplementation;
        /// @solidity memory-safe-assembly
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            instance := create2(0, ptr, 0x37, user)
        }
        require(instance != IEscrow(address(0)), "ERC1167: create2 failed");
        emit CreateEscrow(user, address(instance));
    }

    /**
    @notice Internal function for getting the escrow of a user.
    @dev If the escrow doesn't exist, an escrow contract is deployed.
    @param user The address of the user owning the escrow.
    */
    function getEscrow(address user) internal returns (IEscrow) {
        if(escrows[user] != IEscrow(address(0))) return escrows[user];
        IEscrow escrow = createEscrow(user);
        escrow.initialize(collateral, user);
        escrows[user] = escrow;
        return escrow;
    }

    /**
    @notice Deposit amount of collateral into escrow
    @dev Will deposit the amount into the escrow contract.
    @param amount Amount of collateral token to deposit.
    */
    function deposit(uint amount) public {
        deposit(msg.sender, amount);
    }

    /**
    @notice Deposit and borrow in a single transaction.
    @param amountDeposit Amount of collateral token to deposit into escrow.
    @param amountBorrow Amount of DOLA to borrow.
    */
    function depositAndBorrow(uint amountDeposit, uint amountBorrow) public {
        deposit(amountDeposit);
        borrow(amountBorrow);
    }

    /**
    @notice Deposit amount of collateral into escrow on behalf of msg.sender
    @dev Will deposit the amount into the escrow contract.
    @param user User to deposit on behalf of.
    @param amount Amount of collateral token to deposit.
    */
    function deposit(address user, uint amount) public {
        IEscrow escrow = getEscrow(user);
        collateral.transferFrom(msg.sender, address(escrow), amount);
        if(callOnDepositCallback) {
            escrow.onDeposit();
        }
        emit Deposit(user, amount);
    }

    /**
    @notice View function for predicting the deterministic escrow address of a user.
    @dev Only use deposit() function for deposits and NOT the predicted escrow address unless you know what you're doing
    @param user Address of the user owning the escrow.
    */
    function predictEscrow(address user) public view returns (IEscrow predicted) {
        address implementation = escrowImplementation;
        address deployer = address(this);
        /// @solidity memory-safe-assembly
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(ptr, 0x14), shl(0x60, implementation))
            mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000)
            mstore(add(ptr, 0x38), shl(0x60, deployer))
            mstore(add(ptr, 0x4c), user)
            mstore(add(ptr, 0x6c), keccak256(ptr, 0x37))
            predicted := keccak256(add(ptr, 0x37), 0x55)
        }
    }

    /**
    @notice View function for getting the dollar value of the user's collateral in escrow for the market.
    @param user Address of the user.
    */
    function getCollateralValue(address user) public view returns (uint) {
        IEscrow escrow = predictEscrow(user);
        uint collateralBalance = escrow.balance();
        return collateralBalance * oracle.viewPrice(address(collateral), collateralFactorBps) / 1 ether;
    }

    /**
    @notice Internal function for getting the dollar value of the user's collateral in escrow for the market.
    @dev Updates the lowest price comparisons of the pessimistic oracle
    @param user Address of the user.
    */
    function getCollateralValueInternal(address user) internal returns (uint) {
        IEscrow escrow = predictEscrow(user);
        uint collateralBalance = escrow.balance();
        return collateralBalance * oracle.getPrice(address(collateral), collateralFactorBps) / 1 ether;
    }

    /**
    @notice View function for getting the credit limit of a user.
    @dev To calculate the available credit, subtract user debt from credit limit.
    @param user Address of the user.
    */
    function getCreditLimit(address user) public view returns (uint) {
        uint collateralValue = getCollateralValue(user);
        return collateralValue * collateralFactorBps / 10000;
    }

    /**
    @notice Internal function for getting the credit limit of a user.
    @dev To calculate the available credit, subtract user debt from credit limit. Updates the pessimistic oracle.
    @param user Address of the user.
    */
    function getCreditLimitInternal(address user) internal returns (uint) {
        uint collateralValue = getCollateralValueInternal(user);
        return collateralValue * collateralFactorBps / 10000;
    }
    /**
    @notice Internal function for getting the withdrawal limit of a user.
     The withdrawal limit is how much collateral a user can withdraw before their loan would be underwater. Updates the pessimistic oracle.
    @param user Address of the user.
    */
    function getWithdrawalLimitInternal(address user) internal returns (uint) {
        IEscrow escrow = predictEscrow(user);
        uint collateralBalance = escrow.balance();
        if(collateralBalance == 0) return 0;
        uint debt = debts[user];
        if(debt == 0) return collateralBalance;
        if(collateralFactorBps == 0) return 0;
        uint minimumCollateral = debt * 1 ether / oracle.getPrice(address(collateral), collateralFactorBps) * 10000 / collateralFactorBps;
        if(collateralBalance <= minimumCollateral) return 0;
        return collateralBalance - minimumCollateral;
    }

    /**
    @notice View function for getting the withdrawal limit of a user.
     The withdrawal limit is how much collateral a user can withdraw before their loan would be underwater.
    @param user Address of the user.
    */
    function getWithdrawalLimit(address user) public view returns (uint) {
        IEscrow escrow = predictEscrow(user);
        uint collateralBalance = escrow.balance();
        if(collateralBalance == 0) return 0;
        uint debt = debts[user];
        if(debt == 0) return collateralBalance;
        if(collateralFactorBps == 0) return 0;
        uint minimumCollateral = debt * 1 ether / oracle.viewPrice(address(collateral), collateralFactorBps) * 10000 / collateralFactorBps;
        if(collateralBalance <= minimumCollateral) return 0;
        return collateralBalance - minimumCollateral;
    }

    /**
    @notice Internal function for borrowing DOLA against collateral.
    @dev This internal function is shared between the borrow and borrowOnBehalf function
    @param borrower The address of the borrower that debt will be accrued to.
    @param to The address that will receive the borrowed DOLA
    @param amount The amount of DOLA to be borrowed
    */
    function borrowInternal(address borrower, address to, uint amount) internal {
        require(!borrowPaused, "Borrowing is paused");
        if(borrowController != IBorrowController(address(0))) {
            require(borrowController.borrowAllowed(msg.sender, borrower, amount), "Denied by borrow controller");
        }
        uint credit = getCreditLimitInternal(borrower);
        debts[borrower] += amount;
        require(credit >= debts[borrower], "Exceeded credit limit");
        totalDebt += amount;
        dbr.onBorrow(borrower, amount);
        dola.transfer(to, amount);
        emit Borrow(borrower, amount);
    }

    /**
    @notice Function for borrowing DOLA.
    @dev Will borrow to msg.sender
    @param amount The amount of DOLA to be borrowed.
    */
    function borrow(uint amount) public {
        borrowInternal(msg.sender, msg.sender, amount);
    }

    /**
    @notice Function for using a signed message to borrow on behalf of an address owning an escrow with collateral.
    @dev Signed messaged can be invalidated by incrementing the nonce. Will always borrow to the msg.sender.
    @param from The address of the user being borrowed from
    @param amount The amount to be borrowed
    @param deadline Timestamp after which the signed message will be invalid
    @param v The v param of the ECDSA signature
    @param r The r param of the ECDSA signature
    @param s The s param of the ECDSA signature
    */
    function borrowOnBehalf(address from, uint amount, uint deadline, uint8 v, bytes32 r, bytes32 s) public {
        require(deadline >= block.timestamp, "DEADLINE_EXPIRED");
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "BorrowOnBehalf(address caller,address from,uint256 amount,uint256 nonce,uint256 deadline)"
                                ),
                                msg.sender,
                                from,
                                amount,
                                nonces[from]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );
            require(recoveredAddress != address(0) && recoveredAddress == from, "INVALID_SIGNER");
            borrowInternal(from, msg.sender, amount);
        }
    }

    /**
    @notice Internal function for withdrawing from the escrow
    @dev The internal function is shared by the withdraw function and withdrawOnBehalf function
    @param from The address owning the escrow to withdraw from.
    @param to The address receiving the tokens
    @param amount The amount being withdrawn.
    */
    function withdrawInternal(address from, address to, uint amount) internal {
        uint limit = getWithdrawalLimitInternal(from);
        require(limit >= amount, "Insufficient withdrawal limit");
        require(dbr.deficitOf(from) == 0, "Can't withdraw with DBR deficit");
        IEscrow escrow = getEscrow(from);
        escrow.pay(to, amount);
        emit Withdraw(from, to, amount);
    }

    /**
    @notice Function for withdrawing to msg.sender.
    @param amount Amount to withdraw.
    */
    function withdraw(uint amount) public {
        withdrawInternal(msg.sender, msg.sender, amount);
    }

    /**
    @notice Function for using a signed message to withdraw on behalf of an address owning an escrow with collateral.
    @dev Signed messaged can be invalidated by incrementing the nonce. Will always withdraw to the msg.sender.
    @param from The address of the user owning the escrow being withdrawn from
    @param amount The amount to be withdrawn
    @param deadline Timestamp after which the signed message will be invalid
    @param v The v param of the ECDSA signature
    @param r The r param of the ECDSA signature
    @param s The s param of the ECDSA signature
    */
    function withdrawOnBehalf(address from, uint amount, uint deadline, uint8 v, bytes32 r, bytes32 s) public {
        require(deadline >= block.timestamp, "DEADLINE_EXPIRED");
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "WithdrawOnBehalf(address caller,address from,uint256 amount,uint256 nonce,uint256 deadline)"
                                ),
                                msg.sender,
                                from,
                                amount,
                                nonces[from]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );
            require(recoveredAddress != address(0) && recoveredAddress == from, "INVALID_SIGNER");
            withdrawInternal(from, msg.sender, amount);
        }
    }

    /**
    @notice Function for incrementing the nonce of the msg.sender, making their latest signed message unusable.
    */
    function invalidateNonce() public {
        nonces[msg.sender]++;
    }
    
    /**
    @notice Function for repaying debt on behalf of user. Debt must be repaid in DOLA.
    @dev If the user has a DBR deficit, they risk initial debt being accrued by forced replenishments.
    @param user Address of the user whose debt is being repaid
    @param amount DOLA amount to be repaid. If set to max uint debt will be repaid in full.
    */
    function repay(address user, uint amount) public {
        uint debt = debts[user];
        if(amount == type(uint).max){
            amount = debt;
        }
        require(debt >= amount, "Repayment greater than debt");
        debts[user] -= amount;
        totalDebt -= amount;
        dbr.onRepay(user, amount);
        if(address(borrowController) != address(0)){
            borrowController.onRepay(amount);
        }
        dola.transferFrom(msg.sender, address(this), amount);
        emit Repay(user, msg.sender, amount);
    }

    /**
    @notice Bundles repayment and withdrawal into a single function call.
    @param repayAmount Amount of DOLA to be repaid
    @param withdrawAmount Amount of underlying to be withdrawn from the escrow
    */
    function repayAndWithdraw(uint repayAmount, uint withdrawAmount) public {
        repay(msg.sender, repayAmount);
        withdraw(withdrawAmount);
    }

    /**
    @notice Function for forcing a user to replenish their DBR deficit at a pre-determined price.
     The replenishment will accrue additional DOLA debt.
     On a successful call, the caller will be paid a replenishment incentive.
    @dev The function will only top the user back up to 0, meaning that the user will have a DBR deficit again in the next block.
    @param user The address of the user being forced to replenish DBR
    @param amount The amount of DBR the user will be replenished.
    */
    function forceReplenish(address user, uint amount) public {
        uint deficit = dbr.deficitOf(user);
        require(deficit > 0, "No DBR deficit");
        require(deficit >= amount, "Amount > deficit");
        uint replenishmentCost = amount * dbr.replenishmentPriceBps() / 10000;
        uint replenisherReward = replenishmentCost * replenishmentIncentiveBps / 10000;
        debts[user] += replenishmentCost;
        uint collateralValue = getCollateralValueInternal(user) * (10000 - liquidationIncentiveBps - liquidationFeeBps) / 10000;
        require(collateralValue >= debts[user], "Exceeded collateral value");
        totalDebt += replenishmentCost;
        dbr.onForceReplenish(user, msg.sender, amount, replenisherReward);
        dola.transfer(msg.sender, replenisherReward);
    }
    /**
    @notice Function for forcing a user to replenish all of their DBR deficit at a pre-determined price.
     The replenishment will accrue additional DOLA debt.
     On a successful call, the caller will be paid a replenishment incentive.
    @dev The function will only top the user back up to 0, meaning that the user will have a DBR deficit again in the next block.
    @param user The address of the user being forced to replenish DBR
    */
    function forceReplenishAll(address user) public {
        uint deficit = dbr.deficitOf(user);
        forceReplenish(user, deficit);
    }

    /**
    @notice Function for liquidating a user's under water debt. Debt is under water when the value of a user's debt is above their collateral factor.
    @param user The user to be liquidated
    @param repaidDebt Th amount of user user debt to liquidate.
    */
    function liquidate(address user, uint repaidDebt) public {
        require(repaidDebt > 0, "Must repay positive debt");
        uint debt = debts[user];
        require(getCreditLimitInternal(user) < debt, "User debt is healthy");
        require(repaidDebt <= debt * liquidationFactorBps / 10000, "Exceeded liquidation factor");
        uint price = oracle.getPrice(address(collateral), collateralFactorBps);
        uint liquidatorReward = repaidDebt * 1 ether / price;
        liquidatorReward += liquidatorReward * liquidationIncentiveBps / 10000;
        debts[user] -= repaidDebt;
        totalDebt -= repaidDebt;
        dbr.onRepay(user, repaidDebt);
        dola.transferFrom(msg.sender, address(this), repaidDebt);
        IEscrow escrow = predictEscrow(user);
        escrow.pay(msg.sender, liquidatorReward);
        if(liquidationFeeBps > 0) {
            uint liquidationFee = repaidDebt * 1 ether / price * liquidationFeeBps / 10000;
            uint balance = escrow.balance();
            if(balance >= liquidationFee) {
                escrow.pay(gov, liquidationFee);
            } else if(balance > 0) {
                escrow.pay(gov, balance);
            }
        }
        emit Liquidate(user, msg.sender, repaidDebt, liquidatorReward);
    }
    
    event Deposit(address indexed account, uint amount);
    event Borrow(address indexed account, uint amount);
    event Withdraw(address indexed account, address indexed to, uint amount);
    event Repay(address indexed account, address indexed repayer, uint amount);
    event Liquidate(address indexed account, address indexed liquidator, uint repaidDebt, uint liquidatorReward);
    event CreateEscrow(address indexed user, address escrow);
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_gov","type":"address"},{"internalType":"address","name":"_lender","type":"address"},{"internalType":"address","name":"_pauseGuardian","type":"address"},{"internalType":"address","name":"_escrowImplementation","type":"address"},{"internalType":"contract IDolaBorrowingRights","name":"_dbr","type":"address"},{"internalType":"contract IERC20","name":"_collateral","type":"address"},{"internalType":"contract IOracle","name":"_oracle","type":"address"},{"internalType":"uint256","name":"_collateralFactorBps","type":"uint256"},{"internalType":"uint256","name":"_replenishmentIncentiveBps","type":"uint256"},{"internalType":"uint256","name":"_liquidationIncentiveBps","type":"uint256"},{"internalType":"bool","name":"_callOnDepositCallback","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Borrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"escrow","type":"address"}],"name":"CreateEscrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"liquidator","type":"address"},{"indexed":false,"internalType":"uint256","name":"repaidDebt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"liquidatorReward","type":"uint256"}],"name":"Liquidate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"repayer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Repay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"borrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"borrowController","outputs":[{"internalType":"contract IBorrowController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"borrowOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"borrowPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateral","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralFactorBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dbr","outputs":[{"internalType":"contract IDolaBorrowingRights","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"debts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountDeposit","type":"uint256"},{"internalType":"uint256","name":"amountBorrow","type":"uint256"}],"name":"depositAndBorrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dola","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"escrowImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"escrows","outputs":[{"internalType":"contract IEscrow","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"forceReplenish","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"forceReplenishAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getCollateralValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getCreditLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getWithdrawalLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"invalidateNonce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lender","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"repaidDebt","type":"uint256"}],"name":"liquidate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"liquidationFactorBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidationFeeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidationIncentiveBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"pauseBorrows","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseGuardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"predictEscrow","outputs":[{"internalType":"contract IEscrow","name":"predicted","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recall","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"repay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"repayAmount","type":"uint256"},{"internalType":"uint256","name":"withdrawAmount","type":"uint256"}],"name":"repayAndWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"replenishmentIncentiveBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IBorrowController","name":"_borrowController","type":"address"}],"name":"setBorrowController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collateralFactorBps","type":"uint256"}],"name":"setCollateralFactorBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lender","type":"address"}],"name":"setLender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidationFactorBps","type":"uint256"}],"name":"setLiquidationFactorBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidationFeeBps","type":"uint256"}],"name":"setLiquidationFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidationIncentiveBps","type":"uint256"}],"name":"setLiquidationIncentiveBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOracle","name":"_oracle","type":"address"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pauseGuardian","type":"address"}],"name":"setPauseGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_replenishmentIncentiveBps","type":"uint256"}],"name":"setReplenismentIncentiveBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"withdrawOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"}]

61016060405273865377367054516e17014ccded1e7d814edc9ce460c0526113886009553480156200003057600080fd5b50604051620036cd380380620036cd8339810160408190526200005391620003a0565b6127108410620000aa5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420636f6c6c61746572616c20666163746f720000000000000060448201526064015b60405180910390fd5b600082118015620000bc575061271082105b6200010a5760405162461bcd60e51b815260206004820152601d60248201527f496e76616c6964206c69717569646174696f6e20696e63656e746976650000006044820152606401620000a1565b6127108310620001745760405162461bcd60e51b815260206004820152602e60248201527f5265706c656e6973686d656e7420696e63656e74697665206d7573742062652060448201526d6c657373207468616e203130302560901b6064820152608401620000a1565b600080546001600160a01b03808e166001600160a01b031992831617909255600180548d8416908316179055600280548c841690831617905589821660805288821660a05287821660e0526004805492881692909116919091179055600584905560068390556007829055801515610100524661012052620002ac604080518082018252600a8152691110948813505492d15560b21b60209182015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f4fdd2304dc9d5c5a62691d8e7e6cf5fe56e23281f4652fb6b06b133c9c2b03b4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b610140526005541562000376576000600554600854612710620002d091906200049c565b600554620002e190612710620004b7565b620002ed9190620004d1565b620002f99190620004f3565b90508060075410620003745760405162461bcd60e51b815260206004820152603360248201527f4c69717569646174696f6e20706172616d20616c6c6f772070726f666974616260448201527f6c652073656c66206c69717569646174696f6e000000000000000000000000006064820152608401620000a1565b505b505050505050505050505062000516565b6001600160a01b03811681146200039d57600080fd5b50565b60008060008060008060008060008060006101608c8e031215620003c357600080fd5b8b51620003d08162000387565b60208d0151909b50620003e38162000387565b60408d0151909a50620003f68162000387565b60608d0151909950620004098162000387565b60808d01519098506200041c8162000387565b60a08d01519097506200042f8162000387565b60c08d0151909650620004428162000387565b8095505060e08c015193506101008c015192506101208c015191506101408c015180151581146200047257600080fd5b809150509295989b509295989b9093969950565b634e487b7160e01b600052601160045260246000fd5b60008219821115620004b257620004b262000486565b500190565b600082821015620004cc57620004cc62000486565b500390565b6000816000190483118215151615620004ee57620004ee62000486565b500290565b6000826200051157634e487b7160e01b600052601260045260246000fd5b500490565b60805160a05160c05160e0516101005161012051610140516130c26200060b600039600061106101526000610f7b01526000611173015260008181610647015281816110f401528181611abd01528181611cae0152818161220901528181612a3901528181612b870152612cce01526000818161068a01528181610b0901528181611689015281816118e201528181611e3f015261271a0152600081816105e7015281816106ea01528181610a1701528181611346015281816114400152818161161801528181611dc10152818161269c015261285c0152600081816104430152818161129e0152612d3401526130c26000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c80637164695a11610182578063bcead63e116100e9578063d1220a3c116100a2578063e031a8241161007c578063e031a8241461067c578063ea0593e414610685578063ebc9b94d146106ac578063fc7b9c18146106bf57600080fd5b8063d1220a3c1461062f578063d8dfeb4514610642578063e00f0a991461066957600080fd5b8063bcead63e146105a9578063c5ebeaec146105bc578063c74e6d80146105cf578063c7ed69cd146105e2578063c801861914610609578063cfad57a21461061c57600080fd5b80638951b0541161013b5780638951b0541461052d57806397904e4214610540578063b6b55f2514610553578063b75061bb14610566578063bcb4bbea14610579578063bcbaf4871461059657600080fd5b80637164695a146104b85780637adbf973146104cb5780637d32e793146104de5780637dc0d1d0146104f15780637ecebe00146105045780637f5007ed1461052457600080fd5b80633e553756116102265780634ef64ee7116101df5780634ef64ee7146104655780635a57b46f14610478578063651afe83146104805780636f1c4839146104935780636f48fbb61461049c5780636f8dd24c146104af57600080fd5b80633e553756146103d357806346e368d4146103dc578063477230b2146103ef57806347e7ef241461041857806348bde20c1461042b5780634ca8ff5a1461043e57600080fd5b80632c333e25116102785780632c333e25146103515780632e1a7d4d146103725780632ecd4e7d1461038557806334734dd3146103a55780633525f591146103b85780633644e515146103cb57600080fd5b80630e81c403146102c057806312d43a51146102d55780631ef08b751461030557806322867d7814610318578063236331e91461032b57806324a3d6221461033e575b600080fd5b6102d36102ce366004612e32565b6106c8565b005b6000546102e8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6102d3610313366004612e4f565b610767565b6102d3610326366004612eb1565b610945565b6102d3610339366004612e32565b610bcb565b6002546102e8906001600160a01b031681565b61036461035f366004612e32565b610c17565b6040519081526020016102fc565b6102d3610380366004612edd565b610c47565b610364610393366004612e32565b600d6020526000908152604090205481565b6102d36103b3366004612edd565b610c55565b6102d36103c6366004612e4f565b610da7565b610364610f77565b61036460065481565b6102d36103ea366004612e32565b611083565b6102e86103fd366004612e32565b600c602052600090815260409020546001600160a01b031681565b6102d3610426366004612eb1565b6110cf565b6102d3610439366004612e32565b611233565b6102e87f000000000000000000000000000000000000000000000000000000000000000081565b6102e8610473366004612e32565b61127f565b6102d3611302565b6102d361048e366004612eb1565b611324565b61036460095481565b6102d36104aa366004612edd565b611705565b61036460075481565b6102d36104c6366004612edd565b611791565b6102d36104d9366004612e32565b61182c565b6102d36104ec366004612edd565b611878565b6004546102e8906001600160a01b031681565b610364610512366004612e32565b600e6020526000908152604090205481565b61036460055481565b6102d361053b366004612edd565b61195c565b61036461054e366004612e32565b611a12565b6102d3610561366004612edd565b611b42565b6102d3610574366004612ef6565b611b4c565b600a546105869060ff1681565b60405190151581526020016102fc565b6102d36105a4366004612eb1565b611b5e565b6001546102e8906001600160a01b031681565b6102d36105ca366004612edd565b61210a565b6103646105dd366004612e32565b612115565b6102e87f000000000000000000000000000000000000000000000000000000000000000081565b6102d3610617366004612f26565b6122cd565b6102d361062a366004612e32565b6123c8565b6102d361063d366004612edd565b612414565b6102e87f000000000000000000000000000000000000000000000000000000000000000081565b6003546102e8906001600160a01b031681565b61036460085481565b6102e87f000000000000000000000000000000000000000000000000000000000000000081565b6102d36106ba366004612ef6565b6124a1565b610364600b5481565b604051630d9167c160e21b81526001600160a01b0382811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906336459f0490602401602060405180830381865afa158015610733573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107579190612f43565b90506107638282611324565b5050565b428410156107af5760405162461bcd60e51b815260206004820152601060248201526f111150511312539157d156141254915160821b60448201526064015b60405180910390fd5b600060016107bb610f77565b6001600160a01b0389166000818152600e602090815260409182902080546001810190915582517f1f0bc49e000c018ca72680800f3b2f7ce61e76471cce3756387071d004b0eee98184015233818501526060810194909452608084018c905260a084015260c08084018b90528251808503909101815260e08401909252815191012061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156108be573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906108f45750866001600160a01b0316816001600160a01b0316145b6109315760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b60448201526064016107a6565b61093c8733886124b4565b50505050505050565b6001600160a01b0382166000908152600d60205260409020546001820161096a578091505b818110156109ba5760405162461bcd60e51b815260206004820152601b60248201527f52657061796d656e742067726561746572207468616e2064656274000000000060448201526064016107a6565b6001600160a01b0383166000908152600d6020526040812080548492906109e2908490612f72565b9250508190555081600b60008282546109fb9190612f72565b9091555050604051631b1a58c960e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d8d2c64890610a4e9086908690600401612f89565b600060405180830381600087803b158015610a6857600080fd5b505af1158015610a7c573d6000803e3d6000fd5b50506003546001600160a01b0316159150610af290505760035460405163081e664160e01b8152600481018490526001600160a01b039091169063081e664190602401600060405180830381600087803b158015610ad957600080fd5b505af1158015610aed573d6000803e3d6000fd5b505050505b6040516323b872dd60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd90610b4290339030908790600401612fa2565b6020604051808303816000875af1158015610b61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b859190612fc6565b5060405182815233906001600160a01b038516907f05f2eeda0e08e4b437f487c8d7d29b14537d15e3488170dc3de5dbdf8dac46849060200160405180910390a3505050565b6000546001600160a01b03163314610bf55760405162461bcd60e51b81526004016107a690612fe3565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600080610c2383611a12565b905061271060055482610c36919061301a565b610c409190613039565b9392505050565b610c523333836127e0565b50565b6000546001600160a01b03163314610c7f5760405162461bcd60e51b81526004016107a690612fe3565b600081118015610c9d575061271060085482610c9b919061305b565b105b610ce95760405162461bcd60e51b815260206004820152601d60248201527f496e76616c6964206c69717569646174696f6e20696e63656e7469766500000060448201526064016107a6565b600781905560055415610c52576000600554600854612710610d0b919061305b565b600554610d1a90612710612f72565b610d24919061301a565b610d2e9190613039565b905080600754106107635760405162461bcd60e51b815260206004820152603760248201527f4e6577206c69717569646174696f6e20706172616d20616c6c6f772070726f6660448201527f697461626c652073656c66206c69717569646174696f6e00000000000000000060648201526084016107a6565b42841015610dea5760405162461bcd60e51b815260206004820152601060248201526f111150511312539157d156141254915160821b60448201526064016107a6565b60006001610df6610f77565b6001600160a01b0389166000818152600e602090815260409182902080546001810190915582517f7dbda1635348f4206be1d85078da9f4a74703081e4fa6e174f3fd066c56189658184015233818501526060810194909452608084018c905260a084015260c08084018b90528251808503909101815260e08401909252815191012061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610ef9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610f2f5750866001600160a01b0316816001600160a01b0316145b610f6c5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b60448201526064016107a6565b61093c8733886127e0565b60007f0000000000000000000000000000000000000000000000000000000000000000461461105e5750604080518082018252600a8152691110948813505492d15560b21b60209182015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f4fdd2304dc9d5c5a62691d8e7e6cf5fe56e23281f4652fb6b06b133c9c2b03b4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b507f000000000000000000000000000000000000000000000000000000000000000090565b6000546001600160a01b031633146110ad5760405162461bcd60e51b81526004016107a690612fe3565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006110da836129d6565b6040516323b872dd60e01b81529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906323b872dd9061112d90339085908790600401612fa2565b6020604051808303816000875af115801561114c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111709190612fc6565b507f0000000000000000000000000000000000000000000000000000000000000000156111eb57806001600160a01b03166312c93f596040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111d257600080fd5b505af11580156111e6573d6000803e3d6000fd5b505050505b826001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8360405161122691815260200190565b60405180910390a2505050565b6000546001600160a01b0316331461125d5760405162461bcd60e51b81526004016107a690612fe3565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81527f0000000000000000000000000000000000000000000000000000000000000000606090811b60148301526f5af43d82803e903d91602b57fd5bf3ff60801b602883015230901b6038820152604c8101919091526037808220606c830152605591012090565b336000908152600e6020526040812080549161131d83613073565b9190505550565b604051630d9167c160e21b81526001600160a01b0383811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906336459f0490602401602060405180830381865afa15801561138f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b39190612f43565b9050600081116113f65760405162461bcd60e51b815260206004820152600e60248201526d139bc8111094881919599a58da5d60921b60448201526064016107a6565b818110156114395760405162461bcd60e51b815260206004820152601060248201526f105b5bdd5b9d080f881919599a58da5d60821b60448201526064016107a6565b60006127107f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a10f84cb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561149c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c09190612f43565b6114ca908561301a565b6114d49190613039565b90506000612710600654836114e9919061301a565b6114f39190613039565b6001600160a01b0386166000908152600d602052604081208054929350849290919061152090849061305b565b90915550506008546007546000916127109161153c9083612f72565b6115469190612f72565b61154f88612adc565b611559919061301a565b6115639190613039565b6001600160a01b0387166000908152600d60205260409020549091508110156115ce5760405162461bcd60e51b815260206004820152601960248201527f457863656564656420636f6c6c61746572616c2076616c75650000000000000060448201526064016107a6565b82600b60008282546115e0919061305b565b909155505060405163b2c0877560e01b81526001600160a01b03878116600483015233602483015260448201879052606482018490527f0000000000000000000000000000000000000000000000000000000000000000169063b2c0877590608401600060405180830381600087803b15801561165c57600080fd5b505af1158015611670573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016925063a9059cbb91506116c29033908690600401612f89565b6020604051808303816000875af11580156116e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093c9190612fc6565b6000546001600160a01b0316331461172f5760405162461bcd60e51b81526004016107a690612fe3565b600081118015611740575061271081105b61178c5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964207265706c656e6973686d656e7420696e63656e746976650060448201526064016107a6565b600655565b6000546001600160a01b031633146117bb5760405162461bcd60e51b81526004016107a690612fe3565b612710811061180c5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420636f6c6c61746572616c20666163746f720000000000000060448201526064016107a6565b60058190558015610c52576000600554600854612710610d0b919061305b565b6000546001600160a01b031633146118565760405162461bcd60e51b81526004016107a690612fe3565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146118cb5760405162461bcd60e51b815260206004820152601660248201527513db9b1e481b195b99195c8818d85b881c9958d85b1b60521b60448201526064016107a6565b60405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906119199033908590600401612f89565b6020604051808303816000875af1158015611938573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107639190612fc6565b6000546001600160a01b031633146119865760405162461bcd60e51b81526004016107a690612fe3565b6000811180156119a45750612710600754826119a2919061305b565b105b6119f05760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206c69717569646174696f6e2066656500000000000000000060448201526064016107a6565b600881905560055415610c52576000600554600854612710610d0b919061305b565b600080611a1e8361127f565b90506000816001600160a01b031663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a849190612f43565b6004805460055460405163949c4fa360e01b8152939450670de0b6b3a7640000936001600160a01b039092169263949c4fa392611ae5927f000000000000000000000000000000000000000000000000000000000000000092909101612f89565b602060405180830381865afa158015611b02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b269190612f43565b611b30908361301a565b611b3a9190613039565b949350505050565b610c5233826110cf565b611b5582611b42565b6107638161210a565b60008111611bae5760405162461bcd60e51b815260206004820152601860248201527f4d75737420726570617920706f7369746976652064656274000000000000000060448201526064016107a6565b6001600160a01b0382166000908152600d602052604090205480611bd184612bce565b10611c155760405162461bcd60e51b8152602060048201526014602482015273557365722064656274206973206865616c74687960601b60448201526064016107a6565b61271060095482611c26919061301a565b611c309190613039565b821115611c7f5760405162461bcd60e51b815260206004820152601b60248201527f4578636565646564206c69717569646174696f6e20666163746f72000000000060448201526064016107a6565b6004805460055460405163449e815d60e01b81526000936001600160a01b039093169263449e815d92611cd4927f00000000000000000000000000000000000000000000000000000000000000009201612f89565b6020604051808303816000875af1158015611cf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d179190612f43565b9050600081611d2e85670de0b6b3a764000061301a565b611d389190613039565b905061271060075482611d4b919061301a565b611d559190613039565b611d5f908261305b565b6001600160a01b0386166000908152600d6020526040812080549293508692909190611d8c908490612f72565b9250508190555083600b6000828254611da59190612f72565b9091555050604051631b1a58c960e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d8d2c64890611df89088908890600401612f89565b600060405180830381600087803b158015611e1257600080fd5b505af1158015611e26573d6000803e3d6000fd5b50506040516323b872dd60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692506323b872dd9150611e7a90339030908990600401612fa2565b6020604051808303816000875af1158015611e99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebd9190612fc6565b506000611ec98661127f565b604051636203b43b60e11b81529091506001600160a01b0382169063c407687690611efa9033908690600401612f89565b600060405180830381600087803b158015611f1457600080fd5b505af1158015611f28573d6000803e3d6000fd5b50505050600060085411156120bc5760006127106008548588670de0b6b3a7640000611f54919061301a565b611f5e9190613039565b611f68919061301a565b611f729190613039565b90506000826001600160a01b031663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd89190612f43565b905081811061204c57600054604051636203b43b60e11b81526001600160a01b038581169263c40768769261201592909116908690600401612f89565b600060405180830381600087803b15801561202f57600080fd5b505af1158015612043573d6000803e3d6000fd5b505050506120b9565b80156120b957600054604051636203b43b60e11b81526001600160a01b038581169263c40768769261208692909116908590600401612f89565b600060405180830381600087803b1580156120a057600080fd5b505af11580156120b4573d6000803e3d6000fd5b505050505b50505b604080518681526020810184905233916001600160a01b038916917ff3fa0eaee8f258c23b013654df25d1527f98a5c7ccd5e951dd77caca400ef972910160405180910390a3505050505050565b610c523333836124b4565b6000806121218361127f565b90506000816001600160a01b031663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381865afa158015612163573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121879190612f43565b90508060000361219b575060009392505050565b6001600160a01b0384166000908152600d6020526040812054908190036121c457509392505050565b6005546000036121d957506000949350505050565b6005546004805460405163949c4fa360e01b8152600093926001600160a01b039092169163949c4fa391612231917f000000000000000000000000000000000000000000000000000000000000000091869101612f89565b602060405180830381865afa15801561224e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122729190612f43565b61228484670de0b6b3a764000061301a565b61228e9190613039565b61229a9061271061301a565b6122a49190613039565b90508083116122b95750600095945050505050565b6122c38184612f72565b9695505050505050565b801561235b576002546001600160a01b03163314806122f657506000546001600160a01b031633145b6123565760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c7920706175736520677561726469616e206f7220676f7665726e616e6360448201526a652063616e20706175736560a81b60648201526084016107a6565b6123b5565b6000546001600160a01b031633146123b55760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c7920676f7665726e616e63652063616e20756e7061757365000000000060448201526064016107a6565b600a805460ff1916911515919091179055565b6000546001600160a01b031633146123f25760405162461bcd60e51b81526004016107a690612fe3565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461243e5760405162461bcd60e51b81526004016107a690612fe3565b60008111801561245057506127108111155b61249c5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206c69717569646174696f6e20666163746f7200000000000060448201526064016107a6565b600955565b6124ab3383610945565b61076381610c47565b600a5460ff16156124fd5760405162461bcd60e51b8152602060048201526013602482015272109bdc9c9bddda5b99c81a5cc81c185d5cd959606a1b60448201526064016107a6565b6003546001600160a01b0316156125d15760035460405163368f515360e21b81526001600160a01b039091169063da3d454c9061254290339087908690600401612fa2565b6020604051808303816000875af1158015612561573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125859190612fc6565b6125d15760405162461bcd60e51b815260206004820152601b60248201527f44656e69656420627920626f72726f7720636f6e74726f6c6c6572000000000060448201526064016107a6565b60006125dc84612bce565b6001600160a01b0385166000908152600d602052604081208054929350849290919061260990849061305b565b90915550506001600160a01b0384166000908152600d602052604090205481101561266e5760405162461bcd60e51b8152602060048201526015602482015274115e18d9595919590818dc99591a5d081b1a5b5a5d605a1b60448201526064016107a6565b81600b6000828254612680919061305b565b909155505060405163f7f11fb760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f7f11fb7906126d39087908690600401612f89565b600060405180830381600087803b1580156126ed57600080fd5b505af1158015612701573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016925063a9059cbb91506127539086908690600401612f89565b6020604051808303816000875af1158015612772573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127969190612fc6565b50836001600160a01b03167fcbc04eca7e9da35cb1393a6135a199ca52e450d5e9251cbd99f7847d33a36750836040516127d291815260200190565b60405180910390a250505050565b60006127eb84612bda565b90508181101561283d5760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e74207769746864726177616c206c696d697400000060448201526064016107a6565b604051630d9167c160e21b81526001600160a01b0385811660048301527f000000000000000000000000000000000000000000000000000000000000000016906336459f0490602401602060405180830381865afa1580156128a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c79190612f43565b156129145760405162461bcd60e51b815260206004820152601f60248201527f43616e277420776974686472617720776974682044425220646566696369740060448201526064016107a6565b600061291f856129d6565b604051636203b43b60e11b81529091506001600160a01b0382169063c4076876906129509087908790600401612f89565b600060405180830381600087803b15801561296a57600080fd5b505af115801561297e573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb856040516129c791815260200190565b60405180910390a35050505050565b6001600160a01b038181166000908152600c602052604081205490911615612a1757506001600160a01b039081166000908152600c60205260409020541690565b6000612a2283612d15565b60405163485cc95560e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015285811660248301529192509082169063485cc95590604401600060405180830381600087803b158015612a9157600080fd5b505af1158015612aa5573d6000803e3d6000fd5b505050506001600160a01b039283166000908152600c6020526040902080546001600160a01b031916938216939093179092555090565b600080612ae88361127f565b90506000816001600160a01b031663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4e9190612f43565b6004805460055460405163449e815d60e01b8152939450670de0b6b3a7640000936001600160a01b039092169263449e815d92612baf927f000000000000000000000000000000000000000000000000000000000000000092909101612f89565b6020604051808303816000875af1158015611b02573d6000803e3d6000fd5b600080610c2383612adc565b600080612be68361127f565b90506000816001600160a01b031663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4c9190612f43565b905080600003612c60575060009392505050565b6001600160a01b0384166000908152600d602052604081205490819003612c8957509392505050565b600554600003612c9e57506000949350505050565b6005546004805460405163449e815d60e01b8152600093926001600160a01b039092169163449e815d91612cf6917f000000000000000000000000000000000000000000000000000000000000000091869101612f89565b6020604051808303816000875af115801561224e573d6000803e3d6000fd5b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81527f0000000000000000000000000000000000000000000000000000000000000000606081901b60148301526e5af43d82803e903d91602b57fd5bf360881b60288301526000918360378285f59250506001600160a01b038216612dd75760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c656400000000000000000060448201526064016107a6565b6040516001600160a01b0383811682528416907f1cfd6e6fe6d92716198ef80381fd40e4338b9a461cc4fc235c51b152f7f830159060200160405180910390a250919050565b6001600160a01b0381168114610c5257600080fd5b600060208284031215612e4457600080fd5b8135610c4081612e1d565b60008060008060008060c08789031215612e6857600080fd5b8635612e7381612e1d565b95506020870135945060408701359350606087013560ff81168114612e9757600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215612ec457600080fd5b8235612ecf81612e1d565b946020939093013593505050565b600060208284031215612eef57600080fd5b5035919050565b60008060408385031215612f0957600080fd5b50508035926020909101359150565b8015158114610c5257600080fd5b600060208284031215612f3857600080fd5b8135610c4081612f18565b600060208284031215612f5557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082821015612f8457612f84612f5c565b500390565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208284031215612fd857600080fd5b8151610c4081612f18565b6020808252601f908201527f4f6e6c7920676f762063616e2063616c6c20746869732066756e6374696f6e00604082015260600190565b600081600019048311821515161561303457613034612f5c565b500290565b60008261305657634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561306e5761306e612f5c565b500190565b60006001820161308557613085612f5c565b506001019056fea2646970667358221220fdc33928d89e3c6803f662a349bdcc537c9a4b1b6dc9e58a68074748bc89730d64736f6c634300080d0033000000000000000000000000926df14a23be491164dcf93f4c468a50ef659d5b0000000000000000000000002b34548b865ad66a2b046cb82e59ee43f75b90fd000000000000000000000000e3ed95e130ad9e15643f5a5f232a3dae980784cd000000000000000000000000c06053fcad0a0df7cc32289a135bbea9030c010f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d710000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000abe146cf570fd27ddd985895ce9b138a7110cce80000000000000000000000000000000000000000000000000000000000001b58000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102bb5760003560e01c80637164695a11610182578063bcead63e116100e9578063d1220a3c116100a2578063e031a8241161007c578063e031a8241461067c578063ea0593e414610685578063ebc9b94d146106ac578063fc7b9c18146106bf57600080fd5b8063d1220a3c1461062f578063d8dfeb4514610642578063e00f0a991461066957600080fd5b8063bcead63e146105a9578063c5ebeaec146105bc578063c74e6d80146105cf578063c7ed69cd146105e2578063c801861914610609578063cfad57a21461061c57600080fd5b80638951b0541161013b5780638951b0541461052d57806397904e4214610540578063b6b55f2514610553578063b75061bb14610566578063bcb4bbea14610579578063bcbaf4871461059657600080fd5b80637164695a146104b85780637adbf973146104cb5780637d32e793146104de5780637dc0d1d0146104f15780637ecebe00146105045780637f5007ed1461052457600080fd5b80633e553756116102265780634ef64ee7116101df5780634ef64ee7146104655780635a57b46f14610478578063651afe83146104805780636f1c4839146104935780636f48fbb61461049c5780636f8dd24c146104af57600080fd5b80633e553756146103d357806346e368d4146103dc578063477230b2146103ef57806347e7ef241461041857806348bde20c1461042b5780634ca8ff5a1461043e57600080fd5b80632c333e25116102785780632c333e25146103515780632e1a7d4d146103725780632ecd4e7d1461038557806334734dd3146103a55780633525f591146103b85780633644e515146103cb57600080fd5b80630e81c403146102c057806312d43a51146102d55780631ef08b751461030557806322867d7814610318578063236331e91461032b57806324a3d6221461033e575b600080fd5b6102d36102ce366004612e32565b6106c8565b005b6000546102e8906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b6102d3610313366004612e4f565b610767565b6102d3610326366004612eb1565b610945565b6102d3610339366004612e32565b610bcb565b6002546102e8906001600160a01b031681565b61036461035f366004612e32565b610c17565b6040519081526020016102fc565b6102d3610380366004612edd565b610c47565b610364610393366004612e32565b600d6020526000908152604090205481565b6102d36103b3366004612edd565b610c55565b6102d36103c6366004612e4f565b610da7565b610364610f77565b61036460065481565b6102d36103ea366004612e32565b611083565b6102e86103fd366004612e32565b600c602052600090815260409020546001600160a01b031681565b6102d3610426366004612eb1565b6110cf565b6102d3610439366004612e32565b611233565b6102e87f000000000000000000000000c06053fcad0a0df7cc32289a135bbea9030c010f81565b6102e8610473366004612e32565b61127f565b6102d3611302565b6102d361048e366004612eb1565b611324565b61036460095481565b6102d36104aa366004612edd565b611705565b61036460075481565b6102d36104c6366004612edd565b611791565b6102d36104d9366004612e32565b61182c565b6102d36104ec366004612edd565b611878565b6004546102e8906001600160a01b031681565b610364610512366004612e32565b600e6020526000908152604090205481565b61036460055481565b6102d361053b366004612edd565b61195c565b61036461054e366004612e32565b611a12565b6102d3610561366004612edd565b611b42565b6102d3610574366004612ef6565b611b4c565b600a546105869060ff1681565b60405190151581526020016102fc565b6102d36105a4366004612eb1565b611b5e565b6001546102e8906001600160a01b031681565b6102d36105ca366004612edd565b61210a565b6103646105dd366004612e32565b612115565b6102e87f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d71081565b6102d3610617366004612f26565b6122cd565b6102d361062a366004612e32565b6123c8565b6102d361063d366004612edd565b612414565b6102e87f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6003546102e8906001600160a01b031681565b61036460085481565b6102e87f000000000000000000000000865377367054516e17014ccded1e7d814edc9ce481565b6102d36106ba366004612ef6565b6124a1565b610364600b5481565b604051630d9167c160e21b81526001600160a01b0382811660048301526000917f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d710909116906336459f0490602401602060405180830381865afa158015610733573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107579190612f43565b90506107638282611324565b5050565b428410156107af5760405162461bcd60e51b815260206004820152601060248201526f111150511312539157d156141254915160821b60448201526064015b60405180910390fd5b600060016107bb610f77565b6001600160a01b0389166000818152600e602090815260409182902080546001810190915582517f1f0bc49e000c018ca72680800f3b2f7ce61e76471cce3756387071d004b0eee98184015233818501526060810194909452608084018c905260a084015260c08084018b90528251808503909101815260e08401909252815191012061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156108be573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906108f45750866001600160a01b0316816001600160a01b0316145b6109315760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b60448201526064016107a6565b61093c8733886124b4565b50505050505050565b6001600160a01b0382166000908152600d60205260409020546001820161096a578091505b818110156109ba5760405162461bcd60e51b815260206004820152601b60248201527f52657061796d656e742067726561746572207468616e2064656274000000000060448201526064016107a6565b6001600160a01b0383166000908152600d6020526040812080548492906109e2908490612f72565b9250508190555081600b60008282546109fb9190612f72565b9091555050604051631b1a58c960e31b81526001600160a01b037f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d710169063d8d2c64890610a4e9086908690600401612f89565b600060405180830381600087803b158015610a6857600080fd5b505af1158015610a7c573d6000803e3d6000fd5b50506003546001600160a01b0316159150610af290505760035460405163081e664160e01b8152600481018490526001600160a01b039091169063081e664190602401600060405180830381600087803b158015610ad957600080fd5b505af1158015610aed573d6000803e3d6000fd5b505050505b6040516323b872dd60e01b81526001600160a01b037f000000000000000000000000865377367054516e17014ccded1e7d814edc9ce416906323b872dd90610b4290339030908790600401612fa2565b6020604051808303816000875af1158015610b61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b859190612fc6565b5060405182815233906001600160a01b038516907f05f2eeda0e08e4b437f487c8d7d29b14537d15e3488170dc3de5dbdf8dac46849060200160405180910390a3505050565b6000546001600160a01b03163314610bf55760405162461bcd60e51b81526004016107a690612fe3565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600080610c2383611a12565b905061271060055482610c36919061301a565b610c409190613039565b9392505050565b610c523333836127e0565b50565b6000546001600160a01b03163314610c7f5760405162461bcd60e51b81526004016107a690612fe3565b600081118015610c9d575061271060085482610c9b919061305b565b105b610ce95760405162461bcd60e51b815260206004820152601d60248201527f496e76616c6964206c69717569646174696f6e20696e63656e7469766500000060448201526064016107a6565b600781905560055415610c52576000600554600854612710610d0b919061305b565b600554610d1a90612710612f72565b610d24919061301a565b610d2e9190613039565b905080600754106107635760405162461bcd60e51b815260206004820152603760248201527f4e6577206c69717569646174696f6e20706172616d20616c6c6f772070726f6660448201527f697461626c652073656c66206c69717569646174696f6e00000000000000000060648201526084016107a6565b42841015610dea5760405162461bcd60e51b815260206004820152601060248201526f111150511312539157d156141254915160821b60448201526064016107a6565b60006001610df6610f77565b6001600160a01b0389166000818152600e602090815260409182902080546001810190915582517f7dbda1635348f4206be1d85078da9f4a74703081e4fa6e174f3fd066c56189658184015233818501526060810194909452608084018c905260a084015260c08084018b90528251808503909101815260e08401909252815191012061190160f01b6101008301526101028201929092526101228101919091526101420160408051601f198184030181528282528051602091820120600084529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610ef9573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590610f2f5750866001600160a01b0316816001600160a01b0316145b610f6c5760405162461bcd60e51b815260206004820152600e60248201526d24a72b20a624a22fa9a4a3a722a960911b60448201526064016107a6565b61093c8733886127e0565b60007f0000000000000000000000000000000000000000000000000000000000000001461461105e5750604080518082018252600a8152691110948813505492d15560b21b60209182015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818301527f4fdd2304dc9d5c5a62691d8e7e6cf5fe56e23281f4652fb6b06b133c9c2b03b4818401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a0808301919091528351808303909101815260c0909101909252815191012090565b507fb09b9181e55a2682687e15c541b275436cd361a5a31c95ec5b09621e84d70f5190565b6000546001600160a01b031633146110ad5760405162461bcd60e51b81526004016107a690612fe3565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60006110da836129d6565b6040516323b872dd60e01b81529091506001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216906323b872dd9061112d90339085908790600401612fa2565b6020604051808303816000875af115801561114c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111709190612fc6565b507f0000000000000000000000000000000000000000000000000000000000000000156111eb57806001600160a01b03166312c93f596040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156111d257600080fd5b505af11580156111e6573d6000803e3d6000fd5b505050505b826001600160a01b03167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8360405161122691815260200190565b60405180910390a2505050565b6000546001600160a01b0316331461125d5760405162461bcd60e51b81526004016107a690612fe3565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81527f000000000000000000000000c06053fcad0a0df7cc32289a135bbea9030c010f606090811b60148301526f5af43d82803e903d91602b57fd5bf3ff60801b602883015230901b6038820152604c8101919091526037808220606c830152605591012090565b336000908152600e6020526040812080549161131d83613073565b9190505550565b604051630d9167c160e21b81526001600160a01b0383811660048301526000917f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d710909116906336459f0490602401602060405180830381865afa15801561138f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b39190612f43565b9050600081116113f65760405162461bcd60e51b815260206004820152600e60248201526d139bc8111094881919599a58da5d60921b60448201526064016107a6565b818110156114395760405162461bcd60e51b815260206004820152601060248201526f105b5bdd5b9d080f881919599a58da5d60821b60448201526064016107a6565b60006127107f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d7106001600160a01b031663a10f84cb6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561149c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114c09190612f43565b6114ca908561301a565b6114d49190613039565b90506000612710600654836114e9919061301a565b6114f39190613039565b6001600160a01b0386166000908152600d602052604081208054929350849290919061152090849061305b565b90915550506008546007546000916127109161153c9083612f72565b6115469190612f72565b61154f88612adc565b611559919061301a565b6115639190613039565b6001600160a01b0387166000908152600d60205260409020549091508110156115ce5760405162461bcd60e51b815260206004820152601960248201527f457863656564656420636f6c6c61746572616c2076616c75650000000000000060448201526064016107a6565b82600b60008282546115e0919061305b565b909155505060405163b2c0877560e01b81526001600160a01b03878116600483015233602483015260448201879052606482018490527f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d710169063b2c0877590608401600060405180830381600087803b15801561165c57600080fd5b505af1158015611670573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000865377367054516e17014ccded1e7d814edc9ce416925063a9059cbb91506116c29033908690600401612f89565b6020604051808303816000875af11580156116e1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093c9190612fc6565b6000546001600160a01b0316331461172f5760405162461bcd60e51b81526004016107a690612fe3565b600081118015611740575061271081105b61178c5760405162461bcd60e51b815260206004820152601f60248201527f496e76616c6964207265706c656e6973686d656e7420696e63656e746976650060448201526064016107a6565b600655565b6000546001600160a01b031633146117bb5760405162461bcd60e51b81526004016107a690612fe3565b612710811061180c5760405162461bcd60e51b815260206004820152601960248201527f496e76616c696420636f6c6c61746572616c20666163746f720000000000000060448201526064016107a6565b60058190558015610c52576000600554600854612710610d0b919061305b565b6000546001600160a01b031633146118565760405162461bcd60e51b81526004016107a690612fe3565b600480546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146118cb5760405162461bcd60e51b815260206004820152601660248201527513db9b1e481b195b99195c8818d85b881c9958d85b1b60521b60448201526064016107a6565b60405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000865377367054516e17014ccded1e7d814edc9ce4169063a9059cbb906119199033908590600401612f89565b6020604051808303816000875af1158015611938573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107639190612fc6565b6000546001600160a01b031633146119865760405162461bcd60e51b81526004016107a690612fe3565b6000811180156119a45750612710600754826119a2919061305b565b105b6119f05760405162461bcd60e51b815260206004820152601760248201527f496e76616c6964206c69717569646174696f6e2066656500000000000000000060448201526064016107a6565b600881905560055415610c52576000600554600854612710610d0b919061305b565b600080611a1e8361127f565b90506000816001600160a01b031663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a849190612f43565b6004805460055460405163949c4fa360e01b8152939450670de0b6b3a7640000936001600160a01b039092169263949c4fa392611ae5927f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc292909101612f89565b602060405180830381865afa158015611b02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b269190612f43565b611b30908361301a565b611b3a9190613039565b949350505050565b610c5233826110cf565b611b5582611b42565b6107638161210a565b60008111611bae5760405162461bcd60e51b815260206004820152601860248201527f4d75737420726570617920706f7369746976652064656274000000000000000060448201526064016107a6565b6001600160a01b0382166000908152600d602052604090205480611bd184612bce565b10611c155760405162461bcd60e51b8152602060048201526014602482015273557365722064656274206973206865616c74687960601b60448201526064016107a6565b61271060095482611c26919061301a565b611c309190613039565b821115611c7f5760405162461bcd60e51b815260206004820152601b60248201527f4578636565646564206c69717569646174696f6e20666163746f72000000000060448201526064016107a6565b6004805460055460405163449e815d60e01b81526000936001600160a01b039093169263449e815d92611cd4927f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc29201612f89565b6020604051808303816000875af1158015611cf3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d179190612f43565b9050600081611d2e85670de0b6b3a764000061301a565b611d389190613039565b905061271060075482611d4b919061301a565b611d559190613039565b611d5f908261305b565b6001600160a01b0386166000908152600d6020526040812080549293508692909190611d8c908490612f72565b9250508190555083600b6000828254611da59190612f72565b9091555050604051631b1a58c960e31b81526001600160a01b037f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d710169063d8d2c64890611df89088908890600401612f89565b600060405180830381600087803b158015611e1257600080fd5b505af1158015611e26573d6000803e3d6000fd5b50506040516323b872dd60e01b81526001600160a01b037f000000000000000000000000865377367054516e17014ccded1e7d814edc9ce41692506323b872dd9150611e7a90339030908990600401612fa2565b6020604051808303816000875af1158015611e99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ebd9190612fc6565b506000611ec98661127f565b604051636203b43b60e11b81529091506001600160a01b0382169063c407687690611efa9033908690600401612f89565b600060405180830381600087803b158015611f1457600080fd5b505af1158015611f28573d6000803e3d6000fd5b50505050600060085411156120bc5760006127106008548588670de0b6b3a7640000611f54919061301a565b611f5e9190613039565b611f68919061301a565b611f729190613039565b90506000826001600160a01b031663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd89190612f43565b905081811061204c57600054604051636203b43b60e11b81526001600160a01b038581169263c40768769261201592909116908690600401612f89565b600060405180830381600087803b15801561202f57600080fd5b505af1158015612043573d6000803e3d6000fd5b505050506120b9565b80156120b957600054604051636203b43b60e11b81526001600160a01b038581169263c40768769261208692909116908590600401612f89565b600060405180830381600087803b1580156120a057600080fd5b505af11580156120b4573d6000803e3d6000fd5b505050505b50505b604080518681526020810184905233916001600160a01b038916917ff3fa0eaee8f258c23b013654df25d1527f98a5c7ccd5e951dd77caca400ef972910160405180910390a3505050505050565b610c523333836124b4565b6000806121218361127f565b90506000816001600160a01b031663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381865afa158015612163573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121879190612f43565b90508060000361219b575060009392505050565b6001600160a01b0384166000908152600d6020526040812054908190036121c457509392505050565b6005546000036121d957506000949350505050565b6005546004805460405163949c4fa360e01b8152600093926001600160a01b039092169163949c4fa391612231917f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc291869101612f89565b602060405180830381865afa15801561224e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122729190612f43565b61228484670de0b6b3a764000061301a565b61228e9190613039565b61229a9061271061301a565b6122a49190613039565b90508083116122b95750600095945050505050565b6122c38184612f72565b9695505050505050565b801561235b576002546001600160a01b03163314806122f657506000546001600160a01b031633145b6123565760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c7920706175736520677561726469616e206f7220676f7665726e616e6360448201526a652063616e20706175736560a81b60648201526084016107a6565b6123b5565b6000546001600160a01b031633146123b55760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c7920676f7665726e616e63652063616e20756e7061757365000000000060448201526064016107a6565b600a805460ff1916911515919091179055565b6000546001600160a01b031633146123f25760405162461bcd60e51b81526004016107a690612fe3565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461243e5760405162461bcd60e51b81526004016107a690612fe3565b60008111801561245057506127108111155b61249c5760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206c69717569646174696f6e20666163746f7200000000000060448201526064016107a6565b600955565b6124ab3383610945565b61076381610c47565b600a5460ff16156124fd5760405162461bcd60e51b8152602060048201526013602482015272109bdc9c9bddda5b99c81a5cc81c185d5cd959606a1b60448201526064016107a6565b6003546001600160a01b0316156125d15760035460405163368f515360e21b81526001600160a01b039091169063da3d454c9061254290339087908690600401612fa2565b6020604051808303816000875af1158015612561573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125859190612fc6565b6125d15760405162461bcd60e51b815260206004820152601b60248201527f44656e69656420627920626f72726f7720636f6e74726f6c6c6572000000000060448201526064016107a6565b60006125dc84612bce565b6001600160a01b0385166000908152600d602052604081208054929350849290919061260990849061305b565b90915550506001600160a01b0384166000908152600d602052604090205481101561266e5760405162461bcd60e51b8152602060048201526015602482015274115e18d9595919590818dc99591a5d081b1a5b5a5d605a1b60448201526064016107a6565b81600b6000828254612680919061305b565b909155505060405163f7f11fb760e01b81526001600160a01b037f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d710169063f7f11fb7906126d39087908690600401612f89565b600060405180830381600087803b1580156126ed57600080fd5b505af1158015612701573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000865377367054516e17014ccded1e7d814edc9ce416925063a9059cbb91506127539086908690600401612f89565b6020604051808303816000875af1158015612772573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127969190612fc6565b50836001600160a01b03167fcbc04eca7e9da35cb1393a6135a199ca52e450d5e9251cbd99f7847d33a36750836040516127d291815260200190565b60405180910390a250505050565b60006127eb84612bda565b90508181101561283d5760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e74207769746864726177616c206c696d697400000060448201526064016107a6565b604051630d9167c160e21b81526001600160a01b0385811660048301527f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d71016906336459f0490602401602060405180830381865afa1580156128a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128c79190612f43565b156129145760405162461bcd60e51b815260206004820152601f60248201527f43616e277420776974686472617720776974682044425220646566696369740060448201526064016107a6565b600061291f856129d6565b604051636203b43b60e11b81529091506001600160a01b0382169063c4076876906129509087908790600401612f89565b600060405180830381600087803b15801561296a57600080fd5b505af115801561297e573d6000803e3d6000fd5b50505050836001600160a01b0316856001600160a01b03167f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb856040516129c791815260200190565b60405180910390a35050505050565b6001600160a01b038181166000908152600c602052604081205490911615612a1757506001600160a01b039081166000908152600c60205260409020541690565b6000612a2283612d15565b60405163485cc95560e01b81526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28116600483015285811660248301529192509082169063485cc95590604401600060405180830381600087803b158015612a9157600080fd5b505af1158015612aa5573d6000803e3d6000fd5b505050506001600160a01b039283166000908152600c6020526040902080546001600160a01b031916938216939093179092555090565b600080612ae88361127f565b90506000816001600160a01b031663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b4e9190612f43565b6004805460055460405163449e815d60e01b8152939450670de0b6b3a7640000936001600160a01b039092169263449e815d92612baf927f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc292909101612f89565b6020604051808303816000875af1158015611b02573d6000803e3d6000fd5b600080610c2383612adc565b600080612be68361127f565b90506000816001600160a01b031663b69ef8a86040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4c9190612f43565b905080600003612c60575060009392505050565b6001600160a01b0384166000908152600d602052604081205490819003612c8957509392505050565b600554600003612c9e57506000949350505050565b6005546004805460405163449e815d60e01b8152600093926001600160a01b039092169163449e815d91612cf6917f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc291869101612f89565b6020604051808303816000875af115801561224e573d6000803e3d6000fd5b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81527f000000000000000000000000c06053fcad0a0df7cc32289a135bbea9030c010f606081901b60148301526e5af43d82803e903d91602b57fd5bf360881b60288301526000918360378285f59250506001600160a01b038216612dd75760405162461bcd60e51b815260206004820152601760248201527f455243313136373a2063726561746532206661696c656400000000000000000060448201526064016107a6565b6040516001600160a01b0383811682528416907f1cfd6e6fe6d92716198ef80381fd40e4338b9a461cc4fc235c51b152f7f830159060200160405180910390a250919050565b6001600160a01b0381168114610c5257600080fd5b600060208284031215612e4457600080fd5b8135610c4081612e1d565b60008060008060008060c08789031215612e6857600080fd5b8635612e7381612e1d565b95506020870135945060408701359350606087013560ff81168114612e9757600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215612ec457600080fd5b8235612ecf81612e1d565b946020939093013593505050565b600060208284031215612eef57600080fd5b5035919050565b60008060408385031215612f0957600080fd5b50508035926020909101359150565b8015158114610c5257600080fd5b600060208284031215612f3857600080fd5b8135610c4081612f18565b600060208284031215612f5557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082821015612f8457612f84612f5c565b500390565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208284031215612fd857600080fd5b8151610c4081612f18565b6020808252601f908201527f4f6e6c7920676f762063616e2063616c6c20746869732066756e6374696f6e00604082015260600190565b600081600019048311821515161561303457613034612f5c565b500290565b60008261305657634e487b7160e01b600052601260045260246000fd5b500490565b6000821982111561306e5761306e612f5c565b500190565b60006001820161308557613085612f5c565b506001019056fea2646970667358221220fdc33928d89e3c6803f662a349bdcc537c9a4b1b6dc9e58a68074748bc89730d64736f6c634300080d0033

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

000000000000000000000000926df14a23be491164dcf93f4c468a50ef659d5b0000000000000000000000002b34548b865ad66a2b046cb82e59ee43f75b90fd000000000000000000000000e3ed95e130ad9e15643f5a5f232a3dae980784cd000000000000000000000000c06053fcad0a0df7cc32289a135bbea9030c010f000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d710000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000abe146cf570fd27ddd985895ce9b138a7110cce80000000000000000000000000000000000000000000000000000000000001b58000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000003e80000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _gov (address): 0x926dF14a23BE491164dCF93f4c468A50ef659D5B
Arg [1] : _lender (address): 0x2b34548b865ad66A2B046cb82e59eE43F75B90fd
Arg [2] : _pauseGuardian (address): 0xE3eD95e130ad9E15643f5A5f232a3daE980784cd
Arg [3] : _escrowImplementation (address): 0xc06053FcAd0A0Df7cC32289A135bBEA9030C010f
Arg [4] : _dbr (address): 0xAD038Eb671c44b853887A7E32528FaB35dC5D710
Arg [5] : _collateral (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [6] : _oracle (address): 0xaBe146CF570FD27ddD985895ce9B138a7110cce8
Arg [7] : _collateralFactorBps (uint256): 7000
Arg [8] : _replenishmentIncentiveBps (uint256): 5000
Arg [9] : _liquidationIncentiveBps (uint256): 1000
Arg [10] : _callOnDepositCallback (bool): False

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 000000000000000000000000926df14a23be491164dcf93f4c468a50ef659d5b
Arg [1] : 0000000000000000000000002b34548b865ad66a2b046cb82e59ee43f75b90fd
Arg [2] : 000000000000000000000000e3ed95e130ad9e15643f5a5f232a3dae980784cd
Arg [3] : 000000000000000000000000c06053fcad0a0df7cc32289a135bbea9030c010f
Arg [4] : 000000000000000000000000ad038eb671c44b853887a7e32528fab35dc5d710
Arg [5] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [6] : 000000000000000000000000abe146cf570fd27ddd985895ce9b138a7110cce8
Arg [7] : 0000000000000000000000000000000000000000000000000000000000001b58
Arg [8] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [9] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

1454:28069:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27345:141;;;;;;:::i;:::-;;:::i;:::-;;1479:18;;;;;-1:-1:-1;;;;;1479:18:0;;;;;;-1:-1:-1;;;;;566:32:1;;;548:51;;536:2;521:18;1479::0;;;;;;;;19935:1244;;;;;;:::i;:::-;;:::i;24595:554::-;;;;;;:::i;:::-;;:::i;5702:122::-;;;;;;:::i;:::-;;:::i;1532:28::-;;;;;-1:-1:-1;;;;;1532:28:0;;;15677:194;;;;;;:::i;:::-;;:::i;:::-;;;2045:25:1;;;2033:2;2018:18;15677:194:0;1899:177:1;22044:105:0;;;;;;:::i;:::-;;:::i;2374:38::-;;;;;;:::i;:::-;;;;;;;;;;;;;;8909:312;;;;;;:::i;:::-;;:::i;22756:1250::-;;;;;;:::i;:::-;;:::i;4581:179::-;;;:::i;1910:37::-;;;;;;6234:72;;;;;;:::i;:::-;;:::i;2306:43::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;2306:43:0;;;13129:291;;;;;;:::i;:::-;;:::i;6499:100::-;;;;;;:::i;:::-;;:::i;1567:45::-;;;;;13709:770;;;;;;:::i;:::-;;:::i;24144:73::-;;;:::i;26067:810::-;;;;;;:::i;:::-;;:::i;2032:39::-;;;;;;8233:281;;;;;;:::i;:::-;;:::i;1954:35::-;;;;;;6902:236;;;;;;:::i;:::-;;:::i;5405:72::-;;;;;;:::i;:::-;;:::i;10013:154::-;;;;;;:::i;:::-;;:::i;1844:21::-;;;;;-1:-1:-1;;;;;1844:21:0;;;2435:41;;;;;;:::i;:::-;;;;;;;;;;;;;;1872:31;;;;;;9594:276;;;;;;:::i;:::-;;:::i;14649:282::-;;;;;;:::i;:::-;;:::i;12424:83::-;;;;;;:::i;:::-;;:::i;12717:144::-;;;;;;:::i;:::-;;:::i;2139:24::-;;;;;;;;;;;;3576:14:1;;3569:22;3551:41;;3539:2;3524:18;2139:24:0;3411:187:1;27770:1291:0;;;;;;:::i;:::-;;:::i;1504:21::-;;;;;-1:-1:-1;;;;;1504:21:0;;;19251:101;;;;;;:::i;:::-;;:::i;17462:611::-;;;;;;:::i;:::-;;:::i;1619:41::-;;;;;10430:324;;;;;;:::i;:::-;;:::i;5971:60::-;;;;;;:::i;:::-;;:::i;7588:248::-;;;;;;:::i;:::-;;:::i;1803:34::-;;;;;1667:41;;;;;-1:-1:-1;;;;;1667:41:0;;;1996:29;;;;;;1715:81;;;;;25381:156;;;;;;:::i;:::-;;:::i;2170:21::-;;;;;;27345:141;27419:19;;-1:-1:-1;;;27419:19:0;;-1:-1:-1;;;;;566:32:1;;;27419:19:0;;;548:51:1;27404:12:0;;27419:3;:13;;;;;;521:18:1;;27419:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27404:34;;27449:29;27464:4;27470:7;27449:14;:29::i;:::-;27393:93;27345:141;:::o;19935:1244::-;20070:15;20058:8;:27;;20050:56;;;;-1:-1:-1;;;20050:56:0;;5053:2:1;20050:56:0;;;5035:21:1;5092:2;5072:18;;;5065:30;-1:-1:-1;;;5111:18:1;;;5104:46;5167:18;;20050:56:0;;;;;;;;;20142:24;20169:836;20309:18;:16;:18::i;:::-;-1:-1:-1;;;;;20773:12:0;;;;;;:6;:12;;;;;;;;;:14;;;;;;;;20394:467;;20439:174;20394:467;;;5483:25:1;20648:10:0;5562:18:1;;;5555:43;5614:18;;;5607:43;;;;5666:18;;;5659:34;;;5709:19;;;5702:35;5753:19;;;;5746:35;;;20394:467:0;;;;;;;;;;5455:19:1;;;20394:467:0;;;20354:534;;;;;-1:-1:-1;;;20229:682:0;;;6050:27:1;6093:11;;;6086:27;;;;6129:12;;;6122:28;;;;6166:12;;20229:682:0;;;-1:-1:-1;;20229:682:0;;;;;;;;;20197:733;;20229:682;20197:733;;;;20169:836;;;;;;;;;6416:25:1;6489:4;6477:17;;6457:18;;;6450:45;6511:18;;;6504:34;;;6554:18;;;6547:34;;;6388:19;;20169:836:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20169:836:0;;-1:-1:-1;;20169:836:0;;;-1:-1:-1;;;;;;;21028:30:0;;;;;;:58;;;21082:4;-1:-1:-1;;;;;21062:24:0;:16;-1:-1:-1;;;;;21062:24:0;;21028:58;21020:85;;;;-1:-1:-1;;;21020:85:0;;6794:2:1;21020:85:0;;;6776:21:1;6833:2;6813:18;;;6806:30;-1:-1:-1;;;6852:18:1;;;6845:44;6906:18;;21020:85:0;6592:338:1;21020:85:0;21120:40;21135:4;21141:10;21153:6;21120:14;:40::i;:::-;20117:1055;19935:1244;;;;;;:::o;24595:554::-;-1:-1:-1;;;;;24667:11:0;;24655:9;24667:11;;;:5;:11;;;;;;24692:24;;;24689:68;;24741:4;24732:13;;24689:68;24783:6;24775:4;:14;;24767:54;;;;-1:-1:-1;;;24767:54:0;;7137:2:1;24767:54:0;;;7119:21:1;7176:2;7156:18;;;7149:30;7215:29;7195:18;;;7188:57;7262:18;;24767:54:0;6935:351:1;24767:54:0;-1:-1:-1;;;;;24832:11:0;;;;;;:5;:11;;;;;:21;;24847:6;;24832:11;:21;;24847:6;;24832:21;:::i;:::-;;;;;;;;24877:6;24864:9;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;24894:25:0;;-1:-1:-1;;;24894:25:0;;-1:-1:-1;;;;;24894:3:0;:11;;;;:25;;24906:4;;24912:6;;24894:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24941:16:0;;-1:-1:-1;;;;;24941:16:0;24933:39;;-1:-1:-1;24930:102:0;;-1:-1:-1;24930:102:0;24988:16;;:32;;-1:-1:-1;;;24988:32:0;;;;;2045:25:1;;;-1:-1:-1;;;;;24988:16:0;;;;:24;;2018:18:1;;24988:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24930:102;25042:52;;-1:-1:-1;;;25042:52:0;;-1:-1:-1;;;;;25042:4:0;:17;;;;:52;;25060:10;;25080:4;;25087:6;;25042:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;25110:31:0;;2045:25:1;;;25122:10:0;;-1:-1:-1;;;;;25110:31:0;;;;;2033:2:1;2018:18;25110:31:0;;;;;;;24644:505;24595:554;;:::o;5702:122::-;4138:3;;-1:-1:-1;;;;;4138:3:0;4124:10;:17;4116:61;;;;-1:-1:-1;;;4116:61:0;;;;;;;:::i;:::-;5785:16:::1;:36:::0;;-1:-1:-1;;;;;;5785:36:0::1;-1:-1:-1::0;;;;;5785:36:0;;;::::1;::::0;;;::::1;::::0;;5702:122::o;15677:194::-;15736:4;15753:20;15776:24;15795:4;15776:18;:24::i;:::-;15753:47;;15858:5;15836:19;;15818:15;:37;;;;:::i;:::-;:45;;;;:::i;:::-;15811:52;15677:194;-1:-1:-1;;;15677:194:0:o;22044:105::-;22093:48;22110:10;22122;22134:6;22093:16;:48::i;:::-;22044:105;:::o;8909:312::-;4138:3;;-1:-1:-1;;;;;4138:3:0;4124:10;:17;4116:61;;;;-1:-1:-1;;;4116:61:0;;;;;;;:::i;:::-;9061:1:::2;9034:24;:28;:84;;;;;9113:5;9093:17;;9066:24;:44;;;;:::i;:::-;:52;9034:84;9026:126;;;::::0;-1:-1:-1;;;9026:126:0;;9552:2:1;9026:126:0::2;::::0;::::2;9534:21:1::0;9591:2;9571:18;;;9564:30;9630:31;9610:18;;;9603:59;9679:18;;9026:126:0::2;9350:353:1::0;9026:126:0::2;9163:23;:50:::0;;;4264:19:::1;::::0;:23;4261:305:::1;;4303:31;4399:19;;4370:17;;4390:5;4370:25;;;;:::i;:::-;4346:19;::::0;4338:27:::1;::::0;:5:::1;:27;:::i;:::-;4337:59;;;;:::i;:::-;:81;;;;:::i;:::-;4303:115;;4467:26;4441:23;;:52;4433:121;;;::::0;-1:-1:-1;;;4433:121:0;;9910:2:1;4433:121:0::1;::::0;::::1;9892:21:1::0;9949:2;9929:18;;;9922:30;9988:34;9968:18;;;9961:62;10059:25;10039:18;;;10032:53;10102:19;;4433:121:0::1;9708:419:1::0;22756:1250:0;22893:15;22881:8;:27;;22873:56;;;;-1:-1:-1;;;22873:56:0;;5053:2:1;22873:56:0;;;5035:21:1;5092:2;5072:18;;;5065:30;-1:-1:-1;;;5111:18:1;;;5104:46;5167:18;;22873:56:0;4851:340:1;22873:56:0;22965:24;22992:838;23132:18;:16;:18::i;:::-;-1:-1:-1;;;;;23598:12:0;;;;;;:6;:12;;;;;;;;;:14;;;;;;;;23217:469;;23262:176;23217:469;;;5483:25:1;23473:10:0;5562:18:1;;;5555:43;5614:18;;;5607:43;;;;5666:18;;;5659:34;;;5709:19;;;5702:35;5753:19;;;;5746:35;;;23217:469:0;;;;;;;;;;5455:19:1;;;23217:469:0;;;23177:536;;;;;-1:-1:-1;;;23052:684:0;;;6050:27:1;6093:11;;;6086:27;;;;6129:12;;;6122:28;;;;6166:12;;23052:684:0;;;-1:-1:-1;;23052:684:0;;;;;;;;;23020:735;;23052:684;23020:735;;;;22992:838;;;;;;;;;6416:25:1;6489:4;6477:17;;6457:18;;;6450:45;6511:18;;;6504:34;;;6554:18;;;6547:34;;;6388:19;;22992:838:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22992:838:0;;-1:-1:-1;;22992:838:0;;;-1:-1:-1;;;;;;;23853:30:0;;;;;;:58;;;23907:4;-1:-1:-1;;;;;23887:24:0;:16;-1:-1:-1;;;;;23887:24:0;;23853:58;23845:85;;;;-1:-1:-1;;;23845:85:0;;6794:2:1;23845:85:0;;;6776:21:1;6833:2;6813:18;;;6806:30;-1:-1:-1;;;6852:18:1;;;6845:44;6906:18;;23845:85:0;6592:338:1;23845:85:0;23945:42;23962:4;23968:10;23980:6;23945:16;:42::i;4581:179::-;4638:7;4682:16;4665:13;:33;:87;;-1:-1:-1;5062:19:0;;;;;;;;;;;-1:-1:-1;;;5062:19:0;;;;;4901:309;;4934:95;4901:309;;;17648:25:1;5052:30:0;17689:18:1;;;17682:34;5105:14:0;17732:18:1;;;17725:34;5142:13:0;17775:18:1;;;17768:34;5186:4:0;17818:19:1;;;;17811:61;;;;4901:309:0;;;;;;;;;;17620:19:1;;;;4901:309:0;;;4873:352;;;;;;4581:179::o;4665:87::-;-1:-1:-1;4701:24:0;;4581:179::o;6234:72::-;4138:3;;-1:-1:-1;;;;;4138:3:0;4124:10;:17;4116:61;;;;-1:-1:-1;;;4116:61:0;;;;;;;:::i;:::-;6287:6:::1;:16:::0;;-1:-1:-1;;;;;;6287:16:0::1;-1:-1:-1::0;;;;;6287:16:0;;;::::1;::::0;;;::::1;::::0;;6234:72::o;13129:291::-;13191:14;13208:15;13218:4;13208:9;:15::i;:::-;13234:60;;-1:-1:-1;;;13234:60:0;;13191:32;;-1:-1:-1;;;;;;13234:10:0;:23;;;;:60;;13258:10;;13191:32;;13287:6;;13234:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13308:21;13305:71;;;13346:6;-1:-1:-1;;;;;13346:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13305:71;13399:4;-1:-1:-1;;;;;13391:21:0;;13405:6;13391:21;;;;2045:25:1;;2033:2;2018:18;;1899:177;13391:21:0;;;;;;;;13180:240;13129:291;;:::o;6499:100::-;4138:3;;-1:-1:-1;;;;;4138:3:0;4124:10;:17;4116:61;;;;-1:-1:-1;;;4116:61:0;;;;;;;:::i;:::-;6566:13:::1;:30:::0;;-1:-1:-1;;;;;;6566:30:0::1;-1:-1:-1::0;;;;;6566:30:0;;;::::1;::::0;;;::::1;::::0;;6499:100::o;13709:770::-;13981:4;13975:11;-1:-1:-1;;;14000:79:0;;13822:20;14120:4;14116:25;;;14109:4;14100:14;;14093:49;-1:-1:-1;;;14172:4:0;14163:14;;14156:90;13880:4;14283:19;;14276:4;14267:14;;14260:43;14333:4;14324:14;;14317:28;;;;14397:4;14382:20;;;14375:4;14366:14;;14359:44;14456:4;14440:14;;14430:31;;13709:770::o;24144:73::-;24196:10;24189:18;;;;:6;:18;;;;;:20;;;;;;:::i;:::-;;;;;;24144:73::o;26067:810::-;26151:19;;-1:-1:-1;;;26151:19:0;;-1:-1:-1;;;;;566:32:1;;;26151:19:0;;;548:51:1;26136:12:0;;26151:3;:13;;;;;;521:18:1;;26151:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26136:34;;26199:1;26189:7;:11;26181:38;;;;-1:-1:-1;;;26181:38:0;;10474:2:1;26181:38:0;;;10456:21:1;10513:2;10493:18;;;10486:30;-1:-1:-1;;;10532:18:1;;;10525:44;10586:18;;26181:38:0;10272:338:1;26181:38:0;26249:6;26238:7;:17;;26230:46;;;;-1:-1:-1;;;26230:46:0;;10817:2:1;26230:46:0;;;10799:21:1;10856:2;10836:18;;;10829:30;-1:-1:-1;;;10875:18:1;;;10868:46;10931:18;;26230:46:0;10615:340:1;26230:46:0;26287:22;26351:5;26321:3;-1:-1:-1;;;;;26321:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26312:36;;:6;:36;:::i;:::-;:44;;;;:::i;:::-;26287:69;;26367:22;26440:5;26412:25;;26392:17;:45;;;;:::i;:::-;:53;;;;:::i;:::-;-1:-1:-1;;;;;26456:11:0;;;;;;:5;:11;;;;;:32;;26367:78;;-1:-1:-1;26471:17:0;;26456:11;;;:32;;26471:17;;26456:32;:::i;:::-;;;;-1:-1:-1;;26592:17:0;;26566:23;;26499:20;;26613:5;;26558:31;;26613:5;26558:31;:::i;:::-;:51;;;;:::i;:::-;26522:32;26549:4;26522:26;:32::i;:::-;:88;;;;:::i;:::-;:96;;;;:::i;:::-;-1:-1:-1;;;;;26656:11:0;;;;;;:5;:11;;;;;;26499:119;;-1:-1:-1;26637:30:0;;;26629:68;;;;-1:-1:-1;;;26629:68:0;;11162:2:1;26629:68:0;;;11144:21:1;11201:2;11181:18;;;11174:30;11240:27;11220:18;;;11213:55;11285:18;;26629:68:0;10960:349:1;26629:68:0;26721:17;26708:9;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;26749:65:0;;-1:-1:-1;;;26749:65:0;;-1:-1:-1;;;;;11601:15:1;;;26749:65:0;;;11583:34:1;26776:10:0;11633:18:1;;;11626:43;11685:18;;;11678:34;;;11728:18;;;11721:34;;;26749:3:0;:20;;;;11517:19:1;;26749:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26825:44:0;;-1:-1:-1;;;26825:44:0;;-1:-1:-1;;;;;26825:4:0;:13;;-1:-1:-1;26825:13:0;;-1:-1:-1;26825:44:0;;26839:10;;26851:17;;26825:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;8233:281::-;4138:3;;-1:-1:-1;;;;;4138:3:0;4124:10;:17;4116:61;;;;-1:-1:-1;;;4116:61:0;;;;;;;:::i;:::-;8366:1:::1;8337:26;:30;:68;;;;;8400:5;8371:26;:34;8337:68;8329:112;;;::::0;-1:-1:-1;;;8329:112:0;;11968:2:1;8329:112:0::1;::::0;::::1;11950:21:1::0;12007:2;11987:18;;;11980:30;12046:33;12026:18;;;12019:61;12097:18;;8329:112:0::1;11766:355:1::0;8329:112:0::1;8452:25;:54:::0;8233:281::o;6902:236::-;4138:3;;-1:-1:-1;;;;;4138:3:0;4124:10;:17;4116:61;;;;-1:-1:-1;;;4116:61:0;;;;;;;:::i;:::-;7042:5:::2;7019:20;:28;7011:66;;;::::0;-1:-1:-1;;;7011:66:0;;12328:2:1;7011:66:0::2;::::0;::::2;12310:21:1::0;12367:2;12347:18;;;12340:30;12406:27;12386:18;;;12379:55;12451:18;;7011:66:0::2;12126:349:1::0;7011:66:0::2;7088:19;:42:::0;;;4264:23;;4261:305:::1;;4303:31;4399:19;;4370:17;;4390:5;4370:25;;;;:::i;5405:72::-:0;4138:3;;-1:-1:-1;;;;;4138:3:0;4124:10;:17;4116:61;;;;-1:-1:-1;;;4116:61:0;;;;;;;:::i;:::-;5458:6:::1;:16:::0;;-1:-1:-1;;;;;;5458:16:0::1;-1:-1:-1::0;;;;;5458:16:0;;;::::1;::::0;;;::::1;::::0;;5405:72::o;10013:154::-;10082:6;;-1:-1:-1;;;;;10082:6:0;10068:10;:20;10060:55;;;;-1:-1:-1;;;10060:55:0;;12682:2:1;10060:55:0;;;12664:21:1;12721:2;12701:18;;;12694:30;-1:-1:-1;;;12740:18:1;;;12733:52;12802:18;;10060:55:0;12480:346:1;10060:55:0;10126:33;;-1:-1:-1;;;10126:33:0;;-1:-1:-1;;;;;10126:4:0;:13;;;;:33;;10140:10;;10152:6;;10126:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9594:276::-;4138:3;;-1:-1:-1;;;;;4138:3:0;4124:10;:17;4116:61;;;;-1:-1:-1;;;4116:61:0;;;;;;;:::i;:::-;9728:1:::2;9707:18;:22;:78;;;;;9780:5;9754:23;;9733:18;:44;;;;:::i;:::-;:52;9707:78;9699:114;;;::::0;-1:-1:-1;;;9699:114:0;;13033:2:1;9699:114:0::2;::::0;::::2;13015:21:1::0;13072:2;13052:18;;;13045:30;13111:25;13091:18;;;13084:53;13154:18;;9699:114:0::2;12831:347:1::0;9699:114:0::2;9824:17;:38:::0;;;4264:19:::1;::::0;:23;4261:305:::1;;4303:31;4399:19;;4370:17;;4390:5;4370:25;;;;:::i;14649:282::-:0;14712:4;14729:14;14746:19;14760:4;14746:13;:19::i;:::-;14729:36;;14776:22;14801:6;-1:-1:-1;;;;;14801:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14855:6;;;14893:19;;14855:58;;-1:-1:-1;;;14855:58:0;;14776:41;;-1:-1:-1;14916:7:0;;-1:-1:-1;;;;;14855:6:0;;;;:16;;:58;;14880:10;;14893:19;;14855:58;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14835:78;;:17;:78;:::i;:::-;:88;;;;:::i;:::-;14828:95;14649:282;-1:-1:-1;;;;14649:282:0:o;12424:83::-;12472:27;12480:10;12492:6;12472:7;:27::i;12717:144::-;12800:22;12808:13;12800:7;:22::i;:::-;12833:20;12840:12;12833:6;:20::i;27770:1291::-;27859:1;27846:10;:14;27838:51;;;;-1:-1:-1;;;27838:51:0;;13385:2:1;27838:51:0;;;13367:21:1;13424:2;13404:18;;;13397:30;13463:26;13443:18;;;13436:54;13507:18;;27838:51:0;13183:348:1;27838:51:0;-1:-1:-1;;;;;27912:11:0;;27900:9;27912:11;;;:5;:11;;;;;;;27942:28;27918:4;27942:22;:28::i;:::-;:35;27934:68;;;;-1:-1:-1;;;27934:68:0;;13738:2:1;27934:68:0;;;13720:21:1;13777:2;13757:18;;;13750:30;-1:-1:-1;;;13796:18:1;;;13789:50;13856:18;;27934:68:0;13536:344:1;27934:68:0;28065:5;28042:20;;28035:4;:27;;;;:::i;:::-;:35;;;;:::i;:::-;28021:10;:49;;28013:89;;;;-1:-1:-1;;;28013:89:0;;14087:2:1;28013:89:0;;;14069:21:1;14126:2;14106:18;;;14099:30;14165:29;14145:18;;;14138:57;14212:18;;28013:89:0;13885:351:1;28013:89:0;28126:6;;;28163:19;;28126:57;;-1:-1:-1;;;28126:57:0;;28113:10;;-1:-1:-1;;;;;28126:6:0;;;;:15;;:57;;28150:10;;28126:57;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28113:70;-1:-1:-1;28194:21:0;28113:70;28218:20;:10;28231:7;28218:20;:::i;:::-;:28;;;;:::i;:::-;28194:52;;28322:5;28296:23;;28277:16;:42;;;;:::i;:::-;:50;;;;:::i;:::-;28257:70;;;;:::i;:::-;-1:-1:-1;;;;;28338:11:0;;;;;;:5;:11;;;;;:25;;28257:70;;-1:-1:-1;28353:10:0;;28338:11;;;:25;;28353:10;;28338:25;:::i;:::-;;;;;;;;28387:10;28374:9;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;;28408:29:0;;-1:-1:-1;;;28408:29:0;;-1:-1:-1;;;;;28408:3:0;:11;;;;:29;;28420:4;;28426:10;;28408:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28448:56:0;;-1:-1:-1;;;28448:56:0;;-1:-1:-1;;;;;28448:4:0;:17;;-1:-1:-1;28448:17:0;;-1:-1:-1;28448:56:0;;28466:10;;28486:4;;28493:10;;28448:56;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28515:14;28532:19;28546:4;28532:13;:19::i;:::-;28562:40;;-1:-1:-1;;;28562:40:0;;28515:36;;-1:-1:-1;;;;;;28562:10:0;;;;;:40;;28573:10;;28585:16;;28562:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28636:1;28616:17;;:21;28613:368;;;28654:19;28727:5;28707:17;;28699:5;28676:10;28689:7;28676:20;;;;:::i;:::-;:28;;;;:::i;:::-;:48;;;;:::i;:::-;:56;;;;:::i;:::-;28654:78;;28747:12;28762:6;-1:-1:-1;;;;;28762:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28747:31;;28807:14;28796:7;:25;28793:177;;28853:3;;28842:31;;-1:-1:-1;;;28842:31:0;;-1:-1:-1;;;;;28842:10:0;;;;;;:31;;28853:3;;;;28858:14;;28842:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28793:177;;;28898:11;;28895:75;;28941:3;;28930:24;;-1:-1:-1;;;28930:24:0;;-1:-1:-1;;;;;28930:10:0;;;;;;:24;;28941:3;;;;28946:7;;28930:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28895:75;28639:342;;28613:368;28996:57;;;14415:25:1;;;14471:2;14456:18;;14449:34;;;29012:10:0;;-1:-1:-1;;;;;28996:57:0;;;;;14388:18:1;28996:57:0;;;;;;;27827:1234;;;;27770:1291;;:::o;19251:101::-;19298:46;19313:10;19325;19337:6;19298:14;:46::i;17462:611::-;17525:4;17542:14;17559:19;17573:4;17559:13;:19::i;:::-;17542:36;;17589:22;17614:6;-1:-1:-1;;;;;17614:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17589:41;;17644:17;17665:1;17644:22;17641:35;;-1:-1:-1;17675:1:0;;17462:611;-1:-1:-1;;;17462:611:0:o;17641:35::-;-1:-1:-1;;;;;17699:11:0;;17687:9;17699:11;;;:5;:11;;;;;;;17724:9;;;17721:38;;-1:-1:-1;17742:17:0;17462:611;-1:-1:-1;;;17462:611:0:o;17721:38::-;17773:19;;17796:1;17773:24;17770:37;;-1:-1:-1;17806:1:0;;17462:611;-1:-1:-1;;;;17462:611:0:o;17770:37::-;17929:19;;17860:6;;;:58;;-1:-1:-1;;;17860:58:0;;17818:22;;17929:19;-1:-1:-1;;;;;17860:6:0;;;;:16;;:58;;17885:10;;17929:19;;17860:58;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17843:14;:4;17850:7;17843:14;:::i;:::-;:75;;;;:::i;:::-;:83;;17921:5;17843:83;:::i;:::-;:105;;;;:::i;:::-;17818:130;;17983:17;17962;:38;17959:51;;-1:-1:-1;18009:1:0;;17462:611;-1:-1:-1;;;;;17462:611:0:o;17959:51::-;18028:37;18048:17;18028;:37;:::i;:::-;18021:44;17462:611;-1:-1:-1;;;;;;17462:611:0:o;10430:324::-;10486:6;10483:232;;;10531:13;;-1:-1:-1;;;;;10531:13:0;10517:10;:27;;:48;;-1:-1:-1;10562:3:0;;-1:-1:-1;;;;;10562:3:0;10548:10;:17;10517:48;10509:104;;;;-1:-1:-1;;;10509:104:0;;14696:2:1;10509:104:0;;;14678:21:1;14735:2;14715:18;;;14708:30;14774:34;14754:18;;;14747:62;-1:-1:-1;;;14825:18:1;;;14818:41;14876:19;;10509:104:0;14494:407:1;10509:104:0;10483:232;;;10668:3;;-1:-1:-1;;;;;10668:3:0;10654:10;:17;10646:57;;;;-1:-1:-1;;;10646:57:0;;15108:2:1;10646:57:0;;;15090:21:1;15147:2;15127:18;;;15120:30;15186:29;15166:18;;;15159:57;15233:18;;10646:57:0;14906:351:1;10646:57:0;10725:12;:21;;-1:-1:-1;;10725:21:0;;;;;;;;;;10430:324::o;5971:60::-;4138:3;;-1:-1:-1;;;;;4138:3:0;4124:10;:17;4116:61;;;;-1:-1:-1;;;4116:61:0;;;;;;;:::i;:::-;6018:3:::1;:10:::0;;-1:-1:-1;;;;;;6018:10:0::1;-1:-1:-1::0;;;;;6018:10:0;;;::::1;::::0;;;::::1;::::0;;5971:60::o;7588:248::-;4138:3;;-1:-1:-1;;;;;4138:3:0;4124:10;:17;4116:61;;;;-1:-1:-1;;;4116:61:0;;;;;;;:::i;:::-;7707:1:::1;7683:21;:25;:59;;;;;7737:5;7712:21;:30;;7683:59;7675:98;;;::::0;-1:-1:-1;;;7675:98:0;;15464:2:1;7675:98:0::1;::::0;::::1;15446:21:1::0;15503:2;15483:18;;;15476:30;15542:28;15522:18;;;15515:56;15588:18;;7675:98:0::1;15262:350:1::0;7675:98:0::1;7784:20;:44:::0;7588:248::o;25381:156::-;25464:30;25470:10;25482:11;25464:5;:30::i;:::-;25505:24;25514:14;25505:8;:24::i;18453:641::-;18549:12;;;;18548:13;18540:45;;;;-1:-1:-1;;;18540:45:0;;15819:2:1;18540:45:0;;;15801:21:1;15858:2;15838:18;;;15831:30;-1:-1:-1;;;15877:18:1;;;15870:49;15936:18;;18540:45:0;15617:343:1;18540:45:0;18599:16;;-1:-1:-1;;;;;18599:16:0;:49;18596:181;;18673:16;;:60;;-1:-1:-1;;;18673:60:0;;-1:-1:-1;;;;;18673:16:0;;;;:30;;:60;;18704:10;;18716:8;;18726:6;;18673:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18665:100;;;;-1:-1:-1;;;18665:100:0;;16167:2:1;18665:100:0;;;16149:21:1;16206:2;16186:18;;;16179:30;16245:29;16225:18;;;16218:57;16292:18;;18665:100:0;15965:351:1;18665:100:0;18787:11;18801:32;18824:8;18801:22;:32::i;:::-;-1:-1:-1;;;;;18844:15:0;;;;;;:5;:15;;;;;:25;;18787:46;;-1:-1:-1;18863:6:0;;18844:15;;;:25;;18863:6;;18844:25;:::i;:::-;;;;-1:-1:-1;;;;;;;18898:15:0;;;;;;:5;:15;;;;;;18888:25;;;18880:59;;;;-1:-1:-1;;;18880:59:0;;16523:2:1;18880:59:0;;;16505:21:1;16562:2;16542:18;;;16535:30;-1:-1:-1;;;16581:18:1;;;16574:51;16642:18;;18880:59:0;16321:345:1;18880:59:0;18963:6;18950:9;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;18980:30:0;;-1:-1:-1;;;18980:30:0;;-1:-1:-1;;;;;18980:3:0;:12;;;;:30;;18993:8;;19003:6;;18980:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19021:25:0;;-1:-1:-1;;;19021:25:0;;-1:-1:-1;;;;;19021:4:0;:13;;-1:-1:-1;19021:13:0;;-1:-1:-1;19021:25:0;;19035:2;;19039:6;;19021:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;19069:8;-1:-1:-1;;;;;19062:24:0;;19079:6;19062:24;;;;2045:25:1;;2033:2;2018:18;;1899:177;19062:24:0;;;;;;;;18529:565;18453:641;;;:::o;21524:403::-;21609:10;21622:32;21649:4;21622:26;:32::i;:::-;21609:45;;21682:6;21673:5;:15;;21665:57;;;;-1:-1:-1;;;21665:57:0;;16873:2:1;21665:57:0;;;16855:21:1;16912:2;16892:18;;;16885:30;16951:31;16931:18;;;16924:59;17000:18;;21665:57:0;16671:353:1;21665:57:0;21741:19;;-1:-1:-1;;;21741:19:0;;-1:-1:-1;;;;;566:32:1;;;21741:19:0;;;548:51:1;21741:3:0;:13;;;;521:18:1;;21741:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:24;21733:68;;;;-1:-1:-1;;;21733:68:0;;17231:2:1;21733:68:0;;;17213:21:1;17270:2;17250:18;;;17243:30;17309:33;17289:18;;;17282:61;17360:18;;21733:68:0;17029:355:1;21733:68:0;21812:14;21829:15;21839:4;21829:9;:15::i;:::-;21855:22;;-1:-1:-1;;;21855:22:0;;21812:32;;-1:-1:-1;;;;;;21855:10:0;;;;;:22;;21866:2;;21870:6;;21855:22;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21908:2;-1:-1:-1;;;;;21893:26:0;21902:4;-1:-1:-1;;;;;21893:26:0;;21912:6;21893:26;;;;2045:25:1;;2033:2;2018:18;;1899:177;21893:26:0;;;;;;;;21598:329;;21524:403;;;:::o;11938:289::-;-1:-1:-1;;;;;12012:13:0;;;11989:7;12012:13;;;:7;:13;;;;;;11989:7;;12012:13;:36;12009:61;;-1:-1:-1;;;;;;12057:13:0;;;;;;;:7;:13;;;;;;;;11938:289::o;12009:61::-;12081:14;12098:18;12111:4;12098:12;:18::i;:::-;12127:35;;-1:-1:-1;;;12127:35:0;;-1:-1:-1;;;;;12145:10:0;18126:15:1;;12127:35:0;;;18108:34:1;18178:15;;;18158:18;;;18151:43;12081:35:0;;-1:-1:-1;12127:17:0;;;;;;18043:18:1;;12127:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;12173:13:0;;;;;;;:7;:13;;;;;:22;;-1:-1:-1;;;;;;12173:22:0;;;;;;;;;;;-1:-1:-1;12173:22:0;11938:289::o;15178:286::-;15246:4;15263:14;15280:19;15294:4;15280:13;:19::i;:::-;15263:36;;15310:22;15335:6;-1:-1:-1;;;;;15335:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15389:6;;;15426:19;;15389:57;;-1:-1:-1;;;15389:57:0;;15310:41;;-1:-1:-1;15449:7:0;;-1:-1:-1;;;;;15389:6:0;;;;:15;;:57;;15413:10;;15426:19;;15389:57;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;16120:207;16184:4;16201:20;16224:32;16251:4;16224:26;:32::i;16604:615::-;16672:4;16689:14;16706:19;16720:4;16706:13;:19::i;:::-;16689:36;;16736:22;16761:6;-1:-1:-1;;;;;16761:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16736:41;;16791:17;16812:1;16791:22;16788:35;;-1:-1:-1;16822:1:0;;16604:615;-1:-1:-1;;;16604:615:0:o;16788:35::-;-1:-1:-1;;;;;16846:11:0;;16834:9;16846:11;;;:5;:11;;;;;;;16871:9;;;16868:38;;-1:-1:-1;16889:17:0;16604:615;-1:-1:-1;;;16604:615:0:o;16868:38::-;16920:19;;16943:1;16920:24;16917:37;;-1:-1:-1;16953:1:0;;16604:615;-1:-1:-1;;;;16604:615:0:o;16917:37::-;17075:19;;17007:6;;;:57;;-1:-1:-1;;;17007:57:0;;16965:22;;17075:19;-1:-1:-1;;;;;17007:6:0;;;;:15;;:57;;17031:10;;17075:19;;17007:57;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;11026:691;11250:4;11244:11;-1:-1:-1;;;11269:79:0;;11134:20;11389:4;11385:25;;;11378:4;11369:14;;11362:49;-1:-1:-1;;;11441:4:0;11432:14;;11425:90;11080:16;;11563:4;11557;11244:11;11080:16;11541:27;11529:39;-1:-1:-1;;;;;;;11597:31:0;;11589:67;;;;-1:-1:-1;;;11589:67:0;;18407:2:1;11589:67:0;;;18389:21:1;18446:2;18426:18;;;18419:30;18485:25;18465:18;;;18458:53;18528:18;;11589:67:0;18205:347:1;11589:67:0;11672:37;;-1:-1:-1;;;;;566:32:1;;;548:51;;11672:37:0;;;;;536:2:1;521:18;11672:37:0;;;;;;;11098:619;11026:691;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:247;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;610:687::-;712:6;720;728;736;744;752;805:3;793:9;784:7;780:23;776:33;773:53;;;822:1;819;812:12;773:53;861:9;848:23;880:31;905:5;880:31;:::i;:::-;930:5;-1:-1:-1;982:2:1;967:18;;954:32;;-1:-1:-1;1033:2:1;1018:18;;1005:32;;-1:-1:-1;1089:2:1;1074:18;;1061:32;1137:4;1124:18;;1112:31;;1102:59;;1157:1;1154;1147:12;1102:59;610:687;;;;-1:-1:-1;610:687:1;;1234:3;1219:19;;1206:33;;1286:3;1271:19;;;1258:33;;-1:-1:-1;610:687:1;-1:-1:-1;;610:687:1:o;1302:315::-;1370:6;1378;1431:2;1419:9;1410:7;1406:23;1402:32;1399:52;;;1447:1;1444;1437:12;1399:52;1486:9;1473:23;1505:31;1530:5;1505:31;:::i;:::-;1555:5;1607:2;1592:18;;;;1579:32;;-1:-1:-1;;;1302:315:1:o;2081:180::-;2140:6;2193:2;2181:9;2172:7;2168:23;2164:32;2161:52;;;2209:1;2206;2199:12;2161:52;-1:-1:-1;2232:23:1;;2081:180;-1:-1:-1;2081:180:1:o;3158:248::-;3226:6;3234;3287:2;3275:9;3266:7;3262:23;3258:32;3255:52;;;3303:1;3300;3293:12;3255:52;-1:-1:-1;;3326:23:1;;;3396:2;3381:18;;;3368:32;;-1:-1:-1;3158:248:1:o;3839:118::-;3925:5;3918:13;3911:21;3904:5;3901:32;3891:60;;3947:1;3944;3937:12;3962:241;4018:6;4071:2;4059:9;4050:7;4046:23;4042:32;4039:52;;;4087:1;4084;4077:12;4039:52;4126:9;4113:23;4145:28;4167:5;4145:28;:::i;4662:184::-;4732:6;4785:2;4773:9;4764:7;4760:23;4756:32;4753:52;;;4801:1;4798;4791:12;4753:52;-1:-1:-1;4824:16:1;;4662:184;-1:-1:-1;4662:184:1:o;7291:127::-;7352:10;7347:3;7343:20;7340:1;7333:31;7383:4;7380:1;7373:15;7407:4;7404:1;7397:15;7423:125;7463:4;7491:1;7488;7485:8;7482:34;;;7496:18;;:::i;:::-;-1:-1:-1;7533:9:1;;7423:125::o;7553:274::-;-1:-1:-1;;;;;7745:32:1;;;;7727:51;;7809:2;7794:18;;7787:34;7715:2;7700:18;;7553:274::o;7832:375::-;-1:-1:-1;;;;;8090:15:1;;;8072:34;;8142:15;;;;8137:2;8122:18;;8115:43;8189:2;8174:18;;8167:34;;;;8022:2;8007:18;;7832:375::o;8212:245::-;8279:6;8332:2;8320:9;8311:7;8307:23;8303:32;8300:52;;;8348:1;8345;8338:12;8300:52;8380:9;8374:16;8399:28;8421:5;8399:28;:::i;8462:355::-;8664:2;8646:21;;;8703:2;8683:18;;;8676:30;8742:33;8737:2;8722:18;;8715:61;8808:2;8793:18;;8462:355::o;8822:168::-;8862:7;8928:1;8924;8920:6;8916:14;8913:1;8910:21;8905:1;8898:9;8891:17;8887:45;8884:71;;;8935:18;;:::i;:::-;-1:-1:-1;8975:9:1;;8822:168::o;8995:217::-;9035:1;9061;9051:132;;9105:10;9100:3;9096:20;9093:1;9086:31;9140:4;9137:1;9130:15;9168:4;9165:1;9158:15;9051:132;-1:-1:-1;9197:9:1;;8995:217::o;9217:128::-;9257:3;9288:1;9284:6;9281:1;9278:13;9275:39;;;9294:18;;:::i;:::-;-1:-1:-1;9330:9:1;;9217:128::o;10132:135::-;10171:3;10192:17;;;10189:43;;10212:18;;:::i;:::-;-1:-1:-1;10259:1:1;10248:13;;10132:135::o

Swarm Source

ipfs://fdc33928d89e3c6803f662a349bdcc537c9a4b1b6dc9e58a68074748bc89730d

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

Borrow DOLA using WETH as collateral on Inverse Finance's FiRM fixed rate lending market

Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.