Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 30 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Adjust Trove | 21351412 | 20 days ago | IN | 0 ETH | 0.00404697 | ||||
Adjust Trove | 21249307 | 34 days ago | IN | 0 ETH | 0.00297432 | ||||
Adjust Trove | 21248473 | 35 days ago | IN | 0 ETH | 0.00313177 | ||||
Adjust Trove | 21168434 | 46 days ago | IN | 0 ETH | 0.00640478 | ||||
Adjust Trove | 21159206 | 47 days ago | IN | 0 ETH | 0.00879823 | ||||
Adjust Trove | 21153633 | 48 days ago | IN | 0 ETH | 0.00351809 | ||||
Adjust Trove | 21149150 | 48 days ago | IN | 0 ETH | 0.00290635 | ||||
Adjust Trove | 21013632 | 67 days ago | IN | 0 ETH | 0.0020323 | ||||
Adjust Trove | 20849751 | 90 days ago | IN | 0 ETH | 0.00209189 | ||||
Adjust Trove | 20849701 | 90 days ago | IN | 0 ETH | 0.00212738 | ||||
Claim Collateral | 14422207 | 1013 days ago | IN | 0 ETH | 0.00068373 | ||||
Close Trove | 14352788 | 1024 days ago | IN | 0 ETH | 0.00470132 | ||||
Close Trove | 14352712 | 1024 days ago | IN | 0 ETH | 0.00522223 | ||||
Adjust Trove | 14191175 | 1049 days ago | IN | 0 ETH | 0.00949738 | ||||
Adjust Trove | 14068744 | 1068 days ago | IN | 0 ETH | 0.05561735 | ||||
Adjust Trove | 14055860 | 1070 days ago | IN | 0 ETH | 0.03238801 | ||||
Claim Collateral | 13987632 | 1081 days ago | IN | 0 ETH | 0.01429859 | ||||
Adjust Trove | 13983543 | 1081 days ago | IN | 0 ETH | 0.06036519 | ||||
Adjust Trove | 13983522 | 1081 days ago | IN | 0 ETH | 0.0433351 | ||||
Open Trove | 13841659 | 1103 days ago | IN | 0 ETH | 0.01719512 | ||||
Adjust Trove | 13798336 | 1110 days ago | IN | 0 ETH | 0.03635422 | ||||
Adjust Trove | 13773647 | 1114 days ago | IN | 0 ETH | 0.01595836 | ||||
Open Trove | 13761734 | 1116 days ago | IN | 0 ETH | 0.04805782 | ||||
Open Trove | 13759048 | 1116 days ago | IN | 0 ETH | 0.03630106 | ||||
Adjust Trove | 13756353 | 1117 days ago | IN | 0 ETH | 0.02853346 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
BorrowerOperations
Compiler Version
v0.6.11+commit.5ef660b1
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-07 */ // Sources flattened with hardhat v2.1.1 https://hardhat.org // File contracts/Interfaces/IBorrowerOperations.sol // SPDX-License-Identifier: MIT pragma solidity 0.6.11; // Common interface for the Trove Manager. interface IBorrowerOperations { // --- Events --- event TroveManagerAddressChanged(address _newTroveManagerAddress); event ActivePoolAddressChanged(address _activePoolAddress); event DefaultPoolAddressChanged(address _defaultPoolAddress); event StabilityPoolAddressChanged(address _stabilityPoolAddress); event GasPoolAddressChanged(address _gasPoolAddress); event CollSurplusPoolAddressChanged(address _collSurplusPoolAddress); event PriceFeedAddressChanged(address _newPriceFeedAddress); event SortedTrovesAddressChanged(address _sortedTrovesAddress); event WETHTokenAddressChanged(address _wethTokenAddress); event FeeAdminAddressChanged(address _feeAdminAddress); event BorrowingFeePoolAddressChanged(address _borrowingFeePoolAddress); event TroveCreated(address indexed _borrower, uint arrayIndex); event TroveUpdated(address indexed _borrower, uint _debt, uint _coll, uint stake, uint8 operation); event LUSDBorrowingFeePaid(address indexed _borrower, uint _LUSDFee); // --- Functions --- function setAddresses( address _troveManagerAddress, address _activePoolAddress, address _defaultPoolAddress, address _stabilityPoolAddress, address _gasPoolAddress, address _collSurplusPoolAddress, address _priceFeedAddress, address _sortedTrovesAddress, address _lusdTokenAddress, address _wethTokenAddress, uint collDecimalAdjustment ) external; function setBorrowingFeePoolAddress(address _borrowingFeePoolAddress) external; function openTrove(uint _maxFee, uint _LUSDAmount, uint _WETHAmount, address _upperHint, address _lowerHint) external; function addColl(uint _WETHAmount, address _upperHint, address _lowerHint) external; function moveETHGainToTrove(address _user, uint _WETHAmount, address _upperHint, address _lowerHint) external; function withdrawColl(uint _amount, address _upperHint, address _lowerHint) external; function withdrawLUSD(uint _maxFee, uint _amount, address _upperHint, address _lowerHint) external; function repayLUSD(uint _amount, address _upperHint, address _lowerHint) external; function closeTrove() external; function adjustTrove(uint _maxFee, uint _WETHAmount, uint _collWithdrawal, uint _debtChange, bool isDebtIncrease, address _upperHint, address _lowerHint) external; function claimCollateral() external; function getCompositeDebt(uint _debt) external pure returns (uint); } // File contracts/Interfaces/IPriceFeed.sol interface IPriceFeed { // --- Events --- event LastGoodPriceUpdated(uint _lastGoodPrice); // --- Function --- function fetchPrice() external returns (uint); } // File contracts/Interfaces/ILiquityBase.sol interface ILiquityBase { function priceFeed() external view returns (IPriceFeed); } // File contracts/Interfaces/IStabilityPool.sol /* * The Stability Pool holds LUSD tokens deposited by Stability Pool depositors. * * When a trove is liquidated, then depending on system conditions, some of its LUSD debt gets offset with * LUSD in the Stability Pool: that is, the offset debt evaporates, and an equal amount of LUSD tokens in the Stability Pool is burned. * * Thus, a liquidation causes each depositor to receive a LUSD loss, in proportion to their deposit as a share of total deposits. * They also receive an ETH gain, as the ETH collateral of the liquidated trove is distributed among Stability depositors, * in the same proportion. * * When a liquidation occurs, it depletes every deposit by the same fraction: for example, a liquidation that depletes 40% * of the total LUSD in the Stability Pool, depletes 40% of each deposit. * * A deposit that has experienced a series of liquidations is termed a "compounded deposit": each liquidation depletes the deposit, * multiplying it by some factor in range ]0,1[ * * Please see the implementation spec in the proof document, which closely follows on from the compounded deposit / ETH gain derivations: * https://github.com/liquity/liquity/blob/master/papers/Scalable_Reward_Distribution_with_Compounding_Stakes.pdf * * --- LQTY ISSUANCE TO STABILITY POOL DEPOSITORS --- * * An LQTY issuance event occurs at every deposit operation, and every liquidation. * * Each deposit is tagged with the address of the front end through which it was made. * * All deposits earn a share of the issued LQTY in proportion to the deposit as a share of total deposits. The LQTY earned * by a given deposit, is split between the depositor and the front end through which the deposit was made, based on the front end's kickbackRate. * * Please see the system Readme for an overview: * https://github.com/liquity/dev/blob/main/README.md#lqty-issuance-to-stability-providers */ interface IStabilityPool { // --- Events --- event StabilityPoolETHBalanceUpdated(uint _newBalance); event StabilityPoolLUSDBalanceUpdated(uint _newBalance); event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event TroveManagerAddressChanged(address _newTroveManagerAddress); event ActivePoolAddressChanged(address _newActivePoolAddress); event DefaultPoolAddressChanged(address _newDefaultPoolAddress); event LUSDTokenAddressChanged(address _newLUSDTokenAddress); event CollAddressChanged(address _collTokenAddress); event SortedTrovesAddressChanged(address _newSortedTrovesAddress); event PriceFeedAddressChanged(address _newPriceFeedAddress); event CommunityIssuanceAddressChanged(address _newCommunityIssuanceAddress); event P_Updated(uint _P); event S_Updated(uint _S, uint128 _epoch, uint128 _scale); event G_Updated(uint _G, uint128 _epoch, uint128 _scale); event EpochUpdated(uint128 _currentEpoch); event ScaleUpdated(uint128 _currentScale); event FrontEndRegistered(address indexed _frontEnd, uint _kickbackRate); event FrontEndTagSet(address indexed _depositor, address indexed _frontEnd); event DepositSnapshotUpdated(address indexed _depositor, uint _P, uint _S, uint _G); event FrontEndSnapshotUpdated(address indexed _frontEnd, uint _P, uint _G); event UserDepositChanged(address indexed _depositor, uint _newDeposit); event FrontEndStakeChanged(address indexed _frontEnd, uint _newFrontEndStake, address _depositor); event ETHGainWithdrawn(address indexed _depositor, uint _ETH, uint _LUSDLoss); event LQTYPaidToDepositor(address indexed _depositor, uint _LQTY); event LQTYPaidToFrontEnd(address indexed _frontEnd, uint _LQTY); event EtherSent(address _to, uint _amount); // --- Functions --- /* * Called only once on init, to set addresses of other Liquity contracts * Callable only by owner, renounces ownership at the end */ function setAddresses( address _borrowerOperationsAddress, address _troveManagerAddress, address _activePoolAddress, address _LUSDTokenAddress, address _sortedTrovesAddress, address _priceFeedAddress, address _communityIssuanceAddress, address _collTokenAddress, uint _collDecimalAdjustment ) external; /* * Initial checks: * - Frontend is registered or zero address * - Sender is not a registered frontend * - _amount is not zero * --- * - Triggers a LQTY issuance, based on time passed since the last issuance. The LQTY issuance is shared between *all* depositors and front ends * - Tags the deposit with the provided front end tag param, if it's a new deposit * - Sends depositor's accumulated gains (LQTY, ETH) to depositor * - Sends the tagged front end's accumulated LQTY gains to the tagged front end * - Increases deposit and tagged front end's stake, and takes new snapshots for each. */ function provideToSP(uint _amount, address _frontEndTag) external; /* * Initial checks: * - _amount is zero or there are no under collateralized troves left in the system * - User has a non zero deposit * --- * - Triggers a LQTY issuance, based on time passed since the last issuance. The LQTY issuance is shared between *all* depositors and front ends * - Removes the deposit's front end tag if it is a full withdrawal * - Sends all depositor's accumulated gains (LQTY, ETH) to depositor * - Sends the tagged front end's accumulated LQTY gains to the tagged front end * - Decreases deposit and tagged front end's stake, and takes new snapshots for each. * * If _amount > userDeposit, the user withdraws all of their compounded deposit. */ function withdrawFromSP(uint _amount) external; /* * Initial checks: * - User has a non zero deposit * - User has an open trove * - User has some ETH gain * --- * - Triggers a LQTY issuance, based on time passed since the last issuance. The LQTY issuance is shared between *all* depositors and front ends * - Sends all depositor's LQTY gain to depositor * - Sends all tagged front end's LQTY gain to the tagged front end * - Transfers the depositor's entire ETH gain from the Stability Pool to the caller's trove * - Leaves their compounded deposit in the Stability Pool * - Updates snapshots for deposit and tagged front end stake */ function withdrawETHGainToTrove(address _upperHint, address _lowerHint) external; /* * Initial checks: * - Frontend (sender) not already registered * - User (sender) has no deposit * - _kickbackRate is in the range [0, 100%] * --- * Front end makes a one-time selection of kickback rate upon registering */ function registerFrontEnd(uint _kickbackRate) external; /* * Initial checks: * - Caller is TroveManager * --- * Cancels out the specified debt against the LUSD contained in the Stability Pool (as far as possible) * and transfers the Trove's ETH collateral from ActivePool to StabilityPool. * Only called by liquidation functions in the TroveManager. */ function offset(uint _debt, uint _coll) external; /* * Returns the total amount of ETH held by the pool, accounted in an internal variable instead of `balance`, * to exclude edge cases like ETH received from a self-destruct. */ function getETH() external view returns (uint); /* * Returns LUSD held in the pool. Changes when users deposit/withdraw, and when Trove debt is offset. */ function getTotalLUSDDeposits() external view returns (uint); /* * Calculates the ETH gain earned by the deposit since its last snapshots were taken. */ function getDepositorETHGain(address _depositor) external view returns (uint); /* * Calculate the LQTY gain earned by a deposit since its last snapshots were taken. * If not tagged with a front end, the depositor gets a 100% cut of what their deposit earned. * Otherwise, their cut of the deposit's earnings is equal to the kickbackRate, set by the front end through * which they made their deposit. */ function getDepositorLQTYGain(address _depositor) external view returns (uint); /* * Return the LQTY gain earned by the front end. */ function getFrontEndLQTYGain(address _frontEnd) external view returns (uint); /* * Return the user's compounded deposit. */ function getCompoundedLUSDDeposit(address _depositor) external view returns (uint); /* * Return the front end's compounded stake. * * The front end's compounded stake is equal to the sum of its depositors' compounded deposits. */ function getCompoundedFrontEndStake(address _frontEnd) external view returns (uint); function depositColl(uint _amount) external; /* * Fallback function * Only callable by Active Pool, it just accounts for ETH received * receive() external payable; */ } // File contracts/Dependencies/IERC20.sol /** * Based on the OpenZeppelin IER20 interface: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol * * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); function increaseAllowance(address spender, uint256 addedValue) external returns (bool); function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/Dependencies/IERC2612.sol /** * @dev Interface of the ERC2612 standard as defined in the EIP. * * Adds the {permit} method, which can be used to change one's * {IERC20-allowance} without having to send a transaction, by signing a * message. This allows users to spend tokens without having to hold Ether. * * See https://eips.ethereum.org/EIPS/eip-2612. * * Code adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237/ */ interface IERC2612 { /** * @dev Sets `amount` as the allowance of `spender` over `owner`'s tokens, * given `owner`'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit(address owner, address spender, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; /** * @dev Returns the current ERC2612 nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases `owner`'s nonce by one. This * prevents a signature from being used multiple times. * * `owner` can limit the time a Permit is valid for by setting `deadline` to * a value in the near future. The deadline argument can be set to uint(-1) to * create Permits that effectively never expire. */ function nonces(address owner) external view returns (uint256); function version() external view returns (string memory); function permitTypeHash() external view returns (bytes32); function domainSeparator() external view returns (bytes32); } // File contracts/Interfaces/ILUSDToken.sol interface ILUSDToken is IERC20, IERC2612 { // --- Events --- event LUSDTokenBalanceUpdated(address _user, uint256 _amount); event CollateralAdded( address _troveManagerAddress, address _stabilityPoolAddress, address _borrowerOperationsAddress ); event ColllateralRemoved( address _troveManagerAddress, address _stabilityPoolAddress, address _borrowerOperationsAddress ); // --- Functions --- function addAddressesForColl( address _troveManagerAddress, address _stabilityPoolAddress, address _borrowerOperationsAddress ) external; function removeAddressesForColl( address _troveManagerAddress, address _stabilityPoolAddress, address _borrowerOperationsAddress ) external; function mint(address _account, uint256 _amount) external; function burn(address _account, uint256 _amount) external; function sendToPool( address _sender, address poolAddress, uint256 _amount ) external; function returnFromPool( address poolAddress, address user, uint256 _amount ) external; } // File contracts/Interfaces/ILQTYToken.sol interface ILQTYToken is IERC20, IERC2612 { // --- Events --- event CommunityIssuanceAddressSet(address _communityIssuanceAddress); event LockupContractFactoryAddressSet(address _lockupContractFactoryAddress); // --- Functions --- function getDeploymentStartTime() external view returns (uint256); function getLpRewardsEntitlement() external view returns (uint256); } // File contracts/Interfaces/ITroveManager.sol // Common interface for the Trove Manager. interface ITroveManager is ILiquityBase { // --- Events --- event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event PriceFeedAddressChanged(address _newPriceFeedAddress); event LUSDTokenAddressChanged(address _newLUSDTokenAddress); event ActivePoolAddressChanged(address _activePoolAddress); event DefaultPoolAddressChanged(address _defaultPoolAddress); event StabilityPoolAddressChanged(address _stabilityPoolAddress); event GasPoolAddressChanged(address _gasPoolAddress); event CollSurplusPoolAddressChanged(address _collSurplusPoolAddress); event SortedTrovesAddressChanged(address _sortedTrovesAddress); event LQTYTokenAddressChanged(address _lqtyTokenAddress); event RedemptionFeePoolParamsChanged(address _redemptionFeePoolAddress, uint _redemptionFeePoolRate); event FeeAdminAddressChanged(address _feeAdminAddress); event Liquidation(uint _liquidatedDebt, uint _liquidatedColl, uint _collGasCompensation, uint _LUSDGasCompensation); event Redemption(uint _attemptedLUSDAmount, uint _actualLUSDAmount, uint _ETHSent, uint _ETHFee); event TroveUpdated(address indexed _borrower, uint _debt, uint _coll, uint stake, uint8 operation); event TroveLiquidated(address indexed _borrower, uint _debt, uint _coll, uint8 operation); event BaseRateUpdated(uint _baseRate); event LastFeeOpTimeUpdated(uint _lastFeeOpTime); event TotalStakesUpdated(uint _newTotalStakes); event SystemSnapshotsUpdated(uint _totalStakesSnapshot, uint _totalCollateralSnapshot); event LTermsUpdated(uint _L_ETH, uint _L_LUSDDebt); event TroveSnapshotsUpdated(uint _L_ETH, uint _L_LUSDDebt); event TroveIndexUpdated(address _borrower, uint _newIndex); // --- Functions --- function setAddresses( address _borrowerOperationsAddress, address _activePoolAddress, address _defaultPoolAddress, address _stabilityPoolAddress, address _gasPoolAddress, address _collSurplusPoolAddress, address _priceFeedAddress, address _lusdTokenAddress, address _sortedTrovesAddress, address _lqtyTokenAddress, address _collTokenAddress, uint collDecimalAdjustment ) external; function stabilityPool() external view returns (IStabilityPool); function lusdToken() external view returns (ILUSDToken); function lqtyToken() external view returns (ILQTYToken); function getTroveOwnersCount() external view returns (uint); function getTroveFromTroveOwnersArray(uint _index) external view returns (address); function getNominalICR(address _borrower) external view returns (uint); function getCurrentICR(address _borrower, uint _price) external view returns (uint); function liquidate(address _borrower) external; function liquidateTroves(uint _n) external; function batchLiquidateTroves(address[] calldata _troveArray) external; function redeemCollateral( uint _LUSDAmount, address _firstRedemptionHint, address _upperPartialRedemptionHint, address _lowerPartialRedemptionHint, uint _partialRedemptionHintNICR, uint _maxIterations, uint _maxFee ) external; function updateStakeAndTotalStakes(address _borrower) external returns (uint); function updateTroveRewardSnapshots(address _borrower) external; function addTroveOwnerToArray(address _borrower) external returns (uint index); function applyPendingRewards(address _borrower) external; function getPendingETHReward(address _borrower) external view returns (uint); function getPendingLUSDDebtReward(address _borrower) external view returns (uint); function hasPendingRewards(address _borrower) external view returns (bool); function getEntireDebtAndColl(address _borrower) external view returns ( uint debt, uint coll, uint pendingLUSDDebtReward, uint pendingETHReward ); function closeTrove(address _borrower) external; function removeStake(address _borrower) external; function getRedemptionRate() external view returns (uint); function getRedemptionRateWithDecay() external view returns (uint); function getRedemptionFeeWithDecay(uint _ETHDrawn) external view returns (uint); function getBorrowingRate() external view returns (uint); function getBorrowingRateWithDecay() external view returns (uint); function getBorrowingFee(uint LUSDDebt) external view returns (uint); function getBorrowingFeeWithDecay(uint _LUSDDebt) external view returns (uint); function getDebtCeiling() external view returns (uint); function decayBaseRateFromBorrowing() external; function getTroveStatus(address _borrower) external view returns (uint); function getTroveStake(address _borrower) external view returns (uint); function getTroveDebt(address _borrower) external view returns (uint); function getTroveColl(address _borrower) external view returns (uint); function setTroveStatus(address _borrower, uint num) external; function increaseTroveColl(address _borrower, uint _collIncrease) external returns (uint); function decreaseTroveColl(address _borrower, uint _collDecrease) external returns (uint); function increaseTroveDebt(address _borrower, uint _debtIncrease) external returns (uint); function decreaseTroveDebt(address _borrower, uint _collDecrease) external returns (uint); function getTCR(uint _price) external view returns (uint); function checkRecoveryMode(uint _price) external view returns (bool); } // File contracts/Interfaces/ICollSurplusPool.sol interface ICollSurplusPool { // --- Events --- event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event TroveManagerAddressChanged(address _newTroveManagerAddress); event ActivePoolAddressChanged(address _newActivePoolAddress); event CollTokenAddressChanged(address _collTokenAddress); event CollBalanceUpdated(address indexed _account, uint _newBalance); event EtherSent(address _to, uint _amount); // --- Contract setters --- function setAddresses( address _borrowerOperationsAddress, address _troveManagerAddress, address _activePoolAddress, address _collTokenAddress ) external; function getETH() external view returns (uint); function getCollateral(address _account) external view returns (uint); function accountSurplus(address _account, uint _amount) external; function claimColl(address _account) external; function depositColl(uint _amount) external; } // File contracts/Interfaces/ISortedTroves.sol // Common interface for the SortedTroves Doubly Linked List. interface ISortedTroves { // --- Events --- event SortedTrovesAddressChanged(address _sortedDoublyLLAddress); event BorrowerOperationsAddressChanged(address _borrowerOperationsAddress); event NodeAdded(address _id, uint _NICR); event NodeRemoved(address _id); // --- Functions --- function setParams(uint256 _size, address _TroveManagerAddress, address _borrowerOperationsAddress) external; function insert(address _id, uint256 _ICR, address _prevId, address _nextId) external; function remove(address _id) external; function reInsert(address _id, uint256 _newICR, address _prevId, address _nextId) external; function contains(address _id) external view returns (bool); function isFull() external view returns (bool); function isEmpty() external view returns (bool); function getSize() external view returns (uint256); function getMaxSize() external view returns (uint256); function getFirst() external view returns (address); function getLast() external view returns (address); function getNext(address _id) external view returns (address); function getPrev(address _id) external view returns (address); function validInsertPosition(uint256 _ICR, address _prevId, address _nextId) external view returns (bool); function findInsertPosition(uint256 _ICR, address _prevId, address _nextId) external view returns (address, address); } // File contracts/Dependencies/BaseMath.sol contract BaseMath { uint constant public DECIMAL_PRECISION = 1e18; } // File contracts/Dependencies/SafeMath.sol /** * Based on OpenZeppelin's SafeMath: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol * * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File contracts/Dependencies/console.sol // Buidler's helper contract for console logging library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function log() internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log()")); ignored; } function logInt(int p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(int)", p0)); ignored; } function logUint(uint p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint)", p0)); ignored; } function logString(string memory p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string)", p0)); ignored; } function logBool(bool p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool)", p0)); ignored; } function logAddress(address p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address)", p0)); ignored; } function logBytes(bytes memory p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes)", p0)); ignored; } function logByte(byte p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(byte)", p0)); ignored; } function logBytes1(bytes1 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes1)", p0)); ignored; } function logBytes2(bytes2 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes2)", p0)); ignored; } function logBytes3(bytes3 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes3)", p0)); ignored; } function logBytes4(bytes4 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes4)", p0)); ignored; } function logBytes5(bytes5 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes5)", p0)); ignored; } function logBytes6(bytes6 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes6)", p0)); ignored; } function logBytes7(bytes7 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes7)", p0)); ignored; } function logBytes8(bytes8 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes8)", p0)); ignored; } function logBytes9(bytes9 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes9)", p0)); ignored; } function logBytes10(bytes10 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes10)", p0)); ignored; } function logBytes11(bytes11 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes11)", p0)); ignored; } function logBytes12(bytes12 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes12)", p0)); ignored; } function logBytes13(bytes13 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes13)", p0)); ignored; } function logBytes14(bytes14 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes14)", p0)); ignored; } function logBytes15(bytes15 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes15)", p0)); ignored; } function logBytes16(bytes16 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes16)", p0)); ignored; } function logBytes17(bytes17 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes17)", p0)); ignored; } function logBytes18(bytes18 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes18)", p0)); ignored; } function logBytes19(bytes19 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes19)", p0)); ignored; } function logBytes20(bytes20 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes20)", p0)); ignored; } function logBytes21(bytes21 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes21)", p0)); ignored; } function logBytes22(bytes22 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes22)", p0)); ignored; } function logBytes23(bytes23 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes23)", p0)); ignored; } function logBytes24(bytes24 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes24)", p0)); ignored; } function logBytes25(bytes25 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes25)", p0)); ignored; } function logBytes26(bytes26 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes26)", p0)); ignored; } function logBytes27(bytes27 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes27)", p0)); ignored; } function logBytes28(bytes28 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes28)", p0)); ignored; } function logBytes29(bytes29 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes29)", p0)); ignored; } function logBytes30(bytes30 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes30)", p0)); ignored; } function logBytes31(bytes31 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes31)", p0)); ignored; } function logBytes32(bytes32 p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bytes32)", p0)); ignored; } function log(uint p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint)", p0)); ignored; } function log(string memory p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string)", p0)); ignored; } function log(bool p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool)", p0)); ignored; } function log(address p0) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address)", p0)); ignored; } function log(uint p0, uint p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint)", p0, p1)); ignored; } function log(uint p0, string memory p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string)", p0, p1)); ignored; } function log(uint p0, bool p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool)", p0, p1)); ignored; } function log(uint p0, address p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address)", p0, p1)); ignored; } function log(string memory p0, uint p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint)", p0, p1)); ignored; } function log(string memory p0, string memory p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string)", p0, p1)); ignored; } function log(string memory p0, bool p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool)", p0, p1)); ignored; } function log(string memory p0, address p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address)", p0, p1)); ignored; } function log(bool p0, uint p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint)", p0, p1)); ignored; } function log(bool p0, string memory p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string)", p0, p1)); ignored; } function log(bool p0, bool p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool)", p0, p1)); ignored; } function log(bool p0, address p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address)", p0, p1)); ignored; } function log(address p0, uint p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint)", p0, p1)); ignored; } function log(address p0, string memory p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string)", p0, p1)); ignored; } function log(address p0, bool p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool)", p0, p1)); ignored; } function log(address p0, address p1) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address)", p0, p1)); ignored; } function log(uint p0, uint p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); ignored; } function log(uint p0, uint p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); ignored; } function log(uint p0, uint p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); ignored; } function log(uint p0, uint p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); ignored; } function log(uint p0, string memory p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); ignored; } function log(uint p0, string memory p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); ignored; } function log(uint p0, string memory p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); ignored; } function log(uint p0, string memory p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); ignored; } function log(uint p0, bool p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); ignored; } function log(uint p0, bool p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); ignored; } function log(uint p0, bool p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); ignored; } function log(uint p0, bool p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); ignored; } function log(uint p0, address p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); ignored; } function log(uint p0, address p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); ignored; } function log(uint p0, address p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); ignored; } function log(uint p0, address p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); ignored; } function log(string memory p0, uint p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); ignored; } function log(string memory p0, uint p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); ignored; } function log(string memory p0, uint p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); ignored; } function log(string memory p0, uint p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); ignored; } function log(string memory p0, string memory p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); ignored; } function log(string memory p0, string memory p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); ignored; } function log(string memory p0, string memory p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); ignored; } function log(string memory p0, string memory p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); ignored; } function log(string memory p0, bool p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); ignored; } function log(string memory p0, bool p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); ignored; } function log(string memory p0, bool p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); ignored; } function log(string memory p0, bool p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); ignored; } function log(string memory p0, address p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); ignored; } function log(string memory p0, address p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); ignored; } function log(string memory p0, address p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); ignored; } function log(string memory p0, address p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); ignored; } function log(bool p0, uint p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); ignored; } function log(bool p0, uint p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); ignored; } function log(bool p0, uint p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); ignored; } function log(bool p0, uint p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); ignored; } function log(bool p0, string memory p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); ignored; } function log(bool p0, string memory p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); ignored; } function log(bool p0, string memory p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); ignored; } function log(bool p0, string memory p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); ignored; } function log(bool p0, bool p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); ignored; } function log(bool p0, bool p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); ignored; } function log(bool p0, bool p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); ignored; } function log(bool p0, bool p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); ignored; } function log(bool p0, address p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); ignored; } function log(bool p0, address p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); ignored; } function log(bool p0, address p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); ignored; } function log(bool p0, address p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); ignored; } function log(address p0, uint p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); ignored; } function log(address p0, uint p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); ignored; } function log(address p0, uint p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); ignored; } function log(address p0, uint p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); ignored; } function log(address p0, string memory p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); ignored; } function log(address p0, string memory p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); ignored; } function log(address p0, string memory p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); ignored; } function log(address p0, string memory p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); ignored; } function log(address p0, bool p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); ignored; } function log(address p0, bool p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); ignored; } function log(address p0, bool p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); ignored; } function log(address p0, bool p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); ignored; } function log(address p0, address p1, uint p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); ignored; } function log(address p0, address p1, string memory p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); ignored; } function log(address p0, address p1, bool p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); ignored; } function log(address p0, address p1, address p2) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); ignored; } function log(uint p0, uint p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, uint p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, string memory p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, bool p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); ignored; } function log(uint p0, address p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, uint p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, string memory p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, bool p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); ignored; } function log(string memory p0, address p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, uint p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, string memory p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, bool p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); ignored; } function log(bool p0, address p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, uint p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, string memory p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, bool p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, uint p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, uint p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, uint p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, uint p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, string memory p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, string memory p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, string memory p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, string memory p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, bool p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, bool p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, bool p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, bool p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, address p2, uint p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, address p2, string memory p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, address p2, bool p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); ignored; } function log(address p0, address p1, address p2, address p3) internal view { (bool ignored, ) = CONSOLE_ADDRESS.staticcall(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); ignored; } } // File contracts/Dependencies/LiquityMath.sol library LiquityMath { using SafeMath for uint; uint internal constant DECIMAL_PRECISION = 1e18; /* Precision for Nominal ICR (independent of price). Rationale for the value: * * - Making it “too high” could lead to overflows. * - Making it “too low” could lead to an ICR equal to zero, due to truncation from Solidity floor division. * * This value of 1e20 is chosen for safety: the NICR will only overflow for numerator > ~1e39 ETH, * and will only truncate to 0 if the denominator is at least 1e20 times greater than the numerator. * */ uint internal constant NICR_PRECISION = 1e20; function _min(uint _a, uint _b) internal pure returns (uint) { return (_a < _b) ? _a : _b; } function _max(uint _a, uint _b) internal pure returns (uint) { return (_a >= _b) ? _a : _b; } /* * Multiply two decimal numbers and use normal rounding rules: * -round product up if 19'th mantissa digit >= 5 * -round product down if 19'th mantissa digit < 5 * * Used only inside the exponentiation, _decPow(). */ function decMul(uint x, uint y) internal pure returns (uint decProd) { uint prod_xy = x.mul(y); decProd = prod_xy.add(DECIMAL_PRECISION / 2).div(DECIMAL_PRECISION); } /* * _decPow: Exponentiation function for 18-digit decimal base, and integer exponent n. * * Uses the efficient "exponentiation by squaring" algorithm. O(log(n)) complexity. * * Called by two functions that represent time in units of minutes: * 1) TroveManager._calcDecayedBaseRate * 2) CommunityIssuance._getCumulativeIssuanceFraction * * The exponent is capped to avoid reverting due to overflow. The cap 525600000 equals * "minutes in 1000 years": 60 * 24 * 365 * 1000 * * If a period of > 1000 years is ever used as an exponent in either of the above functions, the result will be * negligibly different from just passing the cap, since: * * In function 1), the decayed base rate will be 0 for 1000 years or > 1000 years * In function 2), the difference in tokens issued at 1000 years and any time > 1000 years, will be negligible */ function _decPow(uint _base, uint _minutes) internal pure returns (uint) { if (_minutes > 525600000) {_minutes = 525600000;} // cap to avoid overflow if (_minutes == 0) {return DECIMAL_PRECISION;} uint y = DECIMAL_PRECISION; uint x = _base; uint n = _minutes; // Exponentiation-by-squaring while (n > 1) { if (n % 2 == 0) { x = decMul(x, x); n = n.div(2); } else { // if (n % 2 != 0) y = decMul(x, y); x = decMul(x, x); n = (n.sub(1)).div(2); } } return decMul(x, y); } function _getAbsoluteDifference(uint _a, uint _b) internal pure returns (uint) { return (_a >= _b) ? _a.sub(_b) : _b.sub(_a); } function _computeNominalCR(uint _coll, uint _debt, uint _collDecimalAdjustment) internal pure returns (uint) { if (_debt > 0) { return _coll.mul(_collDecimalAdjustment).mul(NICR_PRECISION).div(_debt); } // Return the maximal value for uint256 if the Trove has a debt of 0. Represents "infinite" CR. else { // if (_debt == 0) return 2**256 - 1; } } function _computeCR(uint _coll, uint _debt, uint _price, uint _collDecimalAdjustment) internal pure returns (uint) { if (_debt > 0) { uint newCollRatio = _coll.mul(_collDecimalAdjustment).mul(_price).div(_debt); return newCollRatio; } // Return the maximal value for uint256 if the Trove has a debt of 0. Represents "infinite" CR. else { // if (_debt == 0) return 2**256 - 1; } } } // File contracts/Interfaces/IPool.sol // Common interface for the Pools. interface IPool { // --- Events --- event ETHBalanceUpdated(uint _newBalance); event LUSDBalanceUpdated(uint _newBalance); event ActivePoolAddressChanged(address _newActivePoolAddress); event DefaultPoolAddressChanged(address _newDefaultPoolAddress); event StabilityPoolAddressChanged(address _newStabilityPoolAddress); event EtherSent(address _to, uint _amount); // --- Functions --- function getETH() external view returns (uint); function getLUSDDebt() external view returns (uint); function increaseLUSDDebt(uint _amount) external; function depositColl(uint _amount) external; function decreaseLUSDDebt(uint _amount) external; } // File contracts/Interfaces/IActivePool.sol interface IActivePool is IPool { // --- Events --- event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress); event TroveManagerAddressChanged(address _newTroveManagerAddress); event ActivePoolLUSDDebtUpdated(uint _LUSDDebt); event ActivePoolETHBalanceUpdated(uint _ETH); event CollAddressChanged(address _wethTokenAddress); // --- Functions --- function sendETH(address _account, uint _amount) external; function notifyFee(address _feeForwarderAddress, uint _amount) external; } // File contracts/Interfaces/IStableCollActivePool.sol interface IStableCollActivePool is IPool { // --- Events --- event StableCollBorrowerOperationsAddressChanged(address _newStableCollBorrowerOperationsAddress); event StableCollTroveManagerAddressChanged(address _newStableCollTroveManagerAddress); event StableCollActivePoolLUSDDebtUpdated(uint _LUSDDebt); event StableCollActivePoolETHBalanceUpdated(uint _ETH); event CollAddressChanged(address _collTokenAddress); // --- Functions --- function sendETH(address _account, uint _amount) external; } // File contracts/Interfaces/IDefaultPool.sol interface IDefaultPool is IPool { // --- Events --- event TroveManagerAddressChanged(address _newTroveManagerAddress); event DefaultPoolLUSDDebtUpdated(uint _LUSDDebt); event DefaultPoolETHBalanceUpdated(uint _ETH); event CollTokenAddressUpdated(address _collTokenAddress); // --- Functions --- function sendETHToActivePool(uint _amount) external; } // File contracts/Dependencies/LiquityBase.sol /* * Base contract for TroveManager, BorrowerOperations and StabilityPool. Contains global system constants and * common functions. */ contract LiquityBase is BaseMath, ILiquityBase { using SafeMath for uint; uint constant public _100pct = 1000000000000000000; // 1e18 == 100% // Minimum collateral ratio for individual troves uint constant public MCR = 1100000000000000000; // 110% // Minimum stablecoin collateral ratio for individual troves uint constant public MSCR = 1000000000000000000; // 100% // Critical system collateral ratio. If the system's total collateral ratio (TCR) falls below the CCR, Recovery Mode is triggered. uint constant public CCR = 1500000000000000000; // 150% // Amount of LUSD to be locked in gas pool on opening troves uint constant public LUSD_GAS_COMPENSATION = 400e18; // Minimum amount of net LUSD debt a trove must have uint constant public MIN_NET_DEBT = 2000e18; uint constant public PERCENT_DIVISOR = 200; // dividing by 200 yields 0.5% uint constant public STABLE_COLL_BORROWING_RATE = DECIMAL_PRECISION / 100; // 1% uint constant public STABLE_COLL_COLLATERAL_RARIO = 1010000000000000000; // 101% uint constant public STABLE_COLL_COLLATERAL_RARIO_DIVIDEND = 101; uint constant public STABLE_COLL_COLLATERAL_RARIO_DIVISOR = 100; uint constant public STABLE_COLL_DEBT_CEILING = DECIMAL_PRECISION * 1e4; // 10,000 uint constant public COLL_DEBT_CEILING = DECIMAL_PRECISION * 1e4; // 10,000 uint constant public BORROWING_FEE_FLOOR = DECIMAL_PRECISION / 1000 * 4; // 0.4% IActivePool public activePool; IStableCollActivePool public stableCollActivePool; IDefaultPool public defaultPool; IPriceFeed public override priceFeed; // --- Gas compensation functions --- // Returns the composite debt (drawn debt + gas compensation) of a trove, for the purpose of ICR calculation function _getCompositeDebt(uint _debt) internal pure returns (uint) { return _debt.add(LUSD_GAS_COMPENSATION); } function _getNetDebt(uint _debt) internal pure returns (uint) { return _debt.sub(LUSD_GAS_COMPENSATION); } // Return the amount of ETH to be drawn from a trove's collateral and sent as gas compensation. function _getCollGasCompensation(uint _entireColl) internal pure returns (uint) { return _entireColl / PERCENT_DIVISOR; } function getEntireSystemColl() public view returns (uint) { uint activeColl = activePool.getETH(); uint liquidatedColl = defaultPool.getETH(); return activeColl.add(liquidatedColl); } function getEntireSystemStableColl() public view returns (uint) { return stableCollActivePool.getETH(); } function getEntireSystemDebt() public view returns (uint) { uint activeDebt = activePool.getLUSDDebt(); uint closedDebt = defaultPool.getLUSDDebt(); return activeDebt.add(closedDebt); } function getEntireSystemStableDebt() public view returns (uint) { return stableCollActivePool.getLUSDDebt(); } function _getTCR(uint _price, uint _collDecimalAdjustment) internal view returns (uint) { uint entireSystemColl = getEntireSystemColl(); uint entireSystemDebt = getEntireSystemDebt(); uint TCR = LiquityMath._computeCR(entireSystemColl, entireSystemDebt, _price, _collDecimalAdjustment); return TCR; } function _checkRecoveryMode(uint _price, uint _collDecimalAdjustment) internal view returns (bool) { uint TCR = _getTCR(_price, _collDecimalAdjustment); return TCR < CCR; } function _requireUserAcceptsFee(uint _fee, uint _amount, uint _maxFeePercentage) internal pure { uint feePercentage = _fee.mul(DECIMAL_PRECISION).div(_amount); require(feePercentage <= _maxFeePercentage, "Fee exceeded provided maximum"); } } // File contracts/Dependencies/Ownable.sol /** * Based on OpenZeppelin's Ownable contract: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol * * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. * * NOTE: This function is not safe, as it doesn’t check owner is calling it. * Make sure you check it before calling it. */ function _renounceOwnership() internal { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } } // File contracts/Dependencies/CheckContract.sol contract CheckContract { /** * Check that the account is an already deployed non-destroyed contract. * See: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol#L12 */ function checkContract(address _account) internal view { require(_account != address(0), "Account cannot be zero address"); uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(_account) } require(size > 0, "Account code size cannot be zero"); } } // File contracts/BorrowerOperations.sol contract BorrowerOperations is LiquityBase, Ownable, CheckContract, IBorrowerOperations { string constant public NAME = "BorrowerOperations"; // --- Connected contract declarations --- ITroveManager public troveManager; address public stabilityPoolAddress; address public gasPoolAddress; ICollSurplusPool public collSurplusPool; ILUSDToken public LUSDToken; IERC20 public collToken; address public borrowingFeePoolAddress; // A doubly linked list of Troves, sorted by their collateral ratios ISortedTroves public sortedTroves; uint internal _collDecimalAdjustment; bool isAddressesSet = false; /* --- Variable container structs --- Used to hold, return and assign variables inside a function, in order to avoid the error: "CompilerError: Stack too deep". */ struct LocalVariables_adjustTrove { uint price; uint collChange; uint netDebtChange; bool isCollIncrease; uint debt; uint coll; uint oldICR; uint newICR; uint newTCR; uint LUSDFee; uint newDebt; uint newColl; uint stake; uint debtCeiling; } struct LocalVariables_openTrove { uint price; uint LUSDFee; uint netDebt; uint compositeDebt; uint ICR; uint NICR; uint stake; uint arrayIndex; uint debtCeiling; } struct ContractsCache { ITroveManager troveManager; IActivePool activePool; ILUSDToken LUSDToken; } enum BorrowerOperation { openTrove, closeTrove, adjustTrove } enum Functions { SET_ADDRESS, SET_BORROWING_FEE_POOL } uint256 private constant _TIMELOCK = 2 days; mapping(Functions => uint256) public timelock; event TroveManagerAddressChanged(address _newTroveManagerAddress); event ActivePoolAddressChanged(address _activePoolAddress); event DefaultPoolAddressChanged(address _defaultPoolAddress); event StabilityPoolAddressChanged(address _stabilityPoolAddress); event GasPoolAddressChanged(address _gasPoolAddress); event CollSurplusPoolAddressChanged(address _collSurplusPoolAddress); event PriceFeedAddressChanged(address _newPriceFeedAddress); event SortedTrovesAddressChanged(address _sortedTrovesAddress); event CollTokenAddressChanged(address _collTokenAddress); event BorrowingFeePoolAddressChanged(address _borrowingFeePoolAddress); event FeeAdminAddressChanged(address _feeAdminAddress); event TroveCreated(address indexed _borrower, uint arrayIndex); event TroveUpdated(address indexed _borrower, uint _debt, uint _coll, uint stake, BorrowerOperation operation); event LUSDBorrowingFeePaid(address indexed _borrower, uint _LUSDFee); // --- Time lock modifier notLocked(Functions _fn) { require( timelock[_fn] != 1 && timelock[_fn] <= block.timestamp, "Function is timelocked" ); _; } //unlock timelock function unlockFunction(Functions _fn) public onlyOwner { timelock[_fn] = block.timestamp + _TIMELOCK; } //lock timelock function lockFunction(Functions _fn) public onlyOwner { timelock[_fn] = 1; } // --- Dependency setters --- function setAddresses( address _troveManagerAddress, address _activePoolAddress, address _defaultPoolAddress, address _stabilityPoolAddress, address _gasPoolAddress, address _collSurplusPoolAddress, address _priceFeedAddress, address _sortedTrovesAddress, address _LUSDTokenAddress, address _collTokenAddress, uint collDecimalAdjustment ) external override onlyOwner notLocked(Functions.SET_ADDRESS) { require(!isAddressesSet, "BorrowerOperations: Addresses are already set!"); isAddressesSet = true; // This makes impossible to open a trove with zero withdrawn LUSD require(MIN_NET_DEBT > 0, "Minimum net debt amount must be larger than zero."); checkContract(_troveManagerAddress); checkContract(_activePoolAddress); checkContract(_defaultPoolAddress); checkContract(_stabilityPoolAddress); checkContract(_gasPoolAddress); checkContract(_collSurplusPoolAddress); checkContract(_priceFeedAddress); checkContract(_sortedTrovesAddress); checkContract(_LUSDTokenAddress); checkContract(_collTokenAddress); troveManager = ITroveManager(_troveManagerAddress); activePool = IActivePool(_activePoolAddress); defaultPool = IDefaultPool(_defaultPoolAddress); stabilityPoolAddress = _stabilityPoolAddress; gasPoolAddress = _gasPoolAddress; collSurplusPool = ICollSurplusPool(_collSurplusPoolAddress); priceFeed = IPriceFeed(_priceFeedAddress); sortedTroves = ISortedTroves(_sortedTrovesAddress); LUSDToken = ILUSDToken(_LUSDTokenAddress); collToken = IERC20(_collTokenAddress); _collDecimalAdjustment = collDecimalAdjustment; emit TroveManagerAddressChanged(_troveManagerAddress); emit ActivePoolAddressChanged(_activePoolAddress); emit DefaultPoolAddressChanged(_defaultPoolAddress); emit StabilityPoolAddressChanged(_stabilityPoolAddress); emit GasPoolAddressChanged(_gasPoolAddress); emit CollSurplusPoolAddressChanged(_collSurplusPoolAddress); emit PriceFeedAddressChanged(_priceFeedAddress); emit SortedTrovesAddressChanged(_sortedTrovesAddress); emit CollTokenAddressChanged(_collTokenAddress); timelock[Functions.SET_ADDRESS] = 1; } function setBorrowingFeePoolAddress(address _borrowingFeePoolAddress) external onlyOwner override notLocked(Functions.SET_BORROWING_FEE_POOL) { borrowingFeePoolAddress = _borrowingFeePoolAddress; emit BorrowingFeePoolAddressChanged(_borrowingFeePoolAddress); timelock[Functions.SET_BORROWING_FEE_POOL] = 1; } // --- Borrower Trove Operations --- function openTrove(uint _maxFeePercentage, uint _LUSDAmount, uint _collAmount, address _upperHint, address _lowerHint) external override { // Replace payable with an explicit token transfer. require(collToken.transferFrom(msg.sender, address(this), _collAmount), "BorrowerOps: Collateral transfer failed on openTrove"); ContractsCache memory contractsCache = ContractsCache(troveManager, activePool, LUSDToken); LocalVariables_openTrove memory vars; vars.price = priceFeed.fetchPrice(); bool isRecoveryMode = _checkRecoveryMode(vars.price, _collDecimalAdjustment); _requireValidMaxFeePercentage(_maxFeePercentage, isRecoveryMode); _requireTroveisNotActive(contractsCache.troveManager, msg.sender); vars.LUSDFee; vars.netDebt = _LUSDAmount; vars.debtCeiling = contractsCache.troveManager.getDebtCeiling(); if (!isRecoveryMode) { vars.LUSDFee = _triggerBorrowingFee(contractsCache.troveManager, contractsCache.LUSDToken, _LUSDAmount, _maxFeePercentage); vars.netDebt = vars.netDebt.add(vars.LUSDFee); } _requireAtLeastMinNetDebt(vars.netDebt); _requireActivePoolDebtBelowDebtCeiling(vars.netDebt, getEntireSystemDebt(), vars.debtCeiling); // ICR is based on the composite debt, i.e. the requested LUSD amount + LUSD borrowing fee + LUSD gas comp. vars.compositeDebt = _getCompositeDebt(vars.netDebt); require(vars.compositeDebt > 0, "Debt must be larger than zero."); vars.ICR = LiquityMath._computeCR(_collAmount, vars.compositeDebt, vars.price, _collDecimalAdjustment); vars.NICR = LiquityMath._computeNominalCR(_collAmount, vars.compositeDebt, _collDecimalAdjustment); if (isRecoveryMode) { _requireICRisAboveCCR(vars.ICR); } else { _requireICRisAboveMCR(vars.ICR); uint newTCR = _getNewTCRFromTroveChange(_collAmount, true, vars.compositeDebt, true, vars.price); // bools: coll increase, debt increase _requireNewTCRisAboveCCR(newTCR); } // Set the trove struct's properties contractsCache.troveManager.setTroveStatus(msg.sender, 1); contractsCache.troveManager.increaseTroveColl(msg.sender, _collAmount); contractsCache.troveManager.increaseTroveDebt(msg.sender, vars.compositeDebt); contractsCache.troveManager.updateTroveRewardSnapshots(msg.sender); vars.stake = contractsCache.troveManager.updateStakeAndTotalStakes(msg.sender); sortedTroves.insert(msg.sender, vars.NICR, _upperHint, _lowerHint); vars.arrayIndex = contractsCache.troveManager.addTroveOwnerToArray(msg.sender); emit TroveCreated(msg.sender, vars.arrayIndex); // Move the ether to the Active Pool, and mint the LUSDAmount to the borrower _activePoolAddColl(contractsCache.activePool, _collAmount); _withdrawLUSD(contractsCache.activePool, contractsCache.LUSDToken, msg.sender, _LUSDAmount, vars.netDebt); // Move the LUSD gas compensation to the Gas Pool _withdrawLUSD(contractsCache.activePool, contractsCache.LUSDToken, gasPoolAddress, LUSD_GAS_COMPENSATION, LUSD_GAS_COMPENSATION); emit TroveUpdated(msg.sender, vars.compositeDebt, _collAmount, vars.stake, BorrowerOperation.openTrove); emit LUSDBorrowingFeePaid(msg.sender, vars.LUSDFee); } // Send ETH as collateral to a trove function addColl(uint _collAmount, address _upperHint, address _lowerHint) external override { // Replace payable with an explicit token transfer. require(collToken.transferFrom(msg.sender, address(this), _collAmount), "BorrowerOps: Collateral transfer failed on addColl"); _adjustTrove(msg.sender, _collAmount, 0, 0, false, _upperHint, _lowerHint, 0); } // Send ETH as collateral to a trove. Called by only the Stability Pool. function moveETHGainToTrove(address _borrower, uint _collAmount, address _upperHint, address _lowerHint) external override { _requireCallerIsStabilityPool(); // Replace payable with an explicit token transfer. require(collToken.transferFrom(msg.sender, address(this), _collAmount), "BorrowerOps: Collateral transfer failed on moveETHGainToTrove"); _adjustTrove(_borrower, _collAmount, 0, 0, false, _upperHint, _lowerHint, 0); } // Withdraw ETH collateral from a trove function withdrawColl(uint _collWithdrawal, address _upperHint, address _lowerHint) external override { _adjustTrove(msg.sender, 0, _collWithdrawal, 0, false, _upperHint, _lowerHint, 0); } // Withdraw LUSD tokens from a trove: mint new LUSD tokens to the owner, and increase the trove's debt accordingly function withdrawLUSD(uint _maxFeePercentage, uint _LUSDAmount, address _upperHint, address _lowerHint) external override { _adjustTrove(msg.sender, 0, 0, _LUSDAmount, true, _upperHint, _lowerHint, _maxFeePercentage); } // Repay LUSD tokens to a Trove: Burn the repaid LUSD tokens, and reduce the trove's debt accordingly function repayLUSD(uint _LUSDAmount, address _upperHint, address _lowerHint) external override { _adjustTrove(msg.sender, 0, 0, _LUSDAmount, false, _upperHint, _lowerHint, 0); } function adjustTrove(uint _maxFeePercentage, uint _collAmount, uint _collWithdrawal, uint _LUSDChange, bool _isDebtIncrease, address _upperHint, address _lowerHint) external override { // Replace payable with an explicit token transfer. require(collToken.transferFrom(msg.sender, address(this), _collAmount), "BorrowerOps: Collateral transfer failed on adjustTrove"); _adjustTrove(msg.sender, _collAmount, _collWithdrawal, _LUSDChange, _isDebtIncrease, _upperHint, _lowerHint, _maxFeePercentage); } /* * _adjustTrove(): Alongside a debt change, this function can perform either a collateral top-up or a collateral withdrawal. * * It therefore expects either a positive _collAmount, or a positive _collWithdrawal argument. * * If both are positive, it will revert. */ function _adjustTrove(address _borrower, uint _collAmount, uint _collWithdrawal, uint _LUSDChange, bool _isDebtIncrease, address _upperHint, address _lowerHint, uint _maxFeePercentage) internal { ContractsCache memory contractsCache = ContractsCache(troveManager, activePool, LUSDToken); LocalVariables_adjustTrove memory vars; vars.price = priceFeed.fetchPrice(); bool isRecoveryMode = _checkRecoveryMode(vars.price, _collDecimalAdjustment); if (_isDebtIncrease) { _requireValidMaxFeePercentage(_maxFeePercentage, isRecoveryMode); _requireNonZeroDebtChange(_LUSDChange); } _requireSingularCollChange(_collAmount, _collWithdrawal); _requireNonZeroAdjustment(_collAmount, _collWithdrawal, _LUSDChange); _requireTroveisActive(contractsCache.troveManager, _borrower); // Confirm the operation is either a borrower adjusting their own trove, or a pure ETH transfer from the Stability Pool to a trove require(msg.sender == _borrower || (msg.sender == stabilityPoolAddress && _collAmount > 0 && _LUSDChange == 0), "Adjust trove check failed."); contractsCache.troveManager.applyPendingRewards(_borrower); // Get the collChange based on whether or not ETH was sent in the transaction (vars.collChange, vars.isCollIncrease) = _getCollChange(_collAmount, _collWithdrawal); vars.debtCeiling = contractsCache.troveManager.getDebtCeiling(); vars.netDebtChange = _LUSDChange; // If the adjustment incorporates a debt increase and system is in Normal Mode, then trigger a borrowing fee if (_isDebtIncrease && !isRecoveryMode) { vars.LUSDFee = _triggerBorrowingFee(contractsCache.troveManager, contractsCache.LUSDToken, _LUSDChange, _maxFeePercentage); vars.netDebtChange = vars.netDebtChange.add(vars.LUSDFee); // The raw debt change includes the fee _requireActivePoolDebtBelowDebtCeiling(vars.netDebtChange, getEntireSystemDebt(), vars.debtCeiling); } vars.debt = contractsCache.troveManager.getTroveDebt(_borrower); vars.coll = contractsCache.troveManager.getTroveColl(_borrower); // Get the trove's old ICR before the adjustment, and what its new ICR will be after the adjustment vars.oldICR = LiquityMath._computeCR(vars.coll, vars.debt, vars.price, _collDecimalAdjustment); vars.newICR = _getNewICRFromTroveChange(vars.coll, vars.debt, vars.collChange, vars.isCollIncrease, vars.netDebtChange, _isDebtIncrease, vars.price); require(_collWithdrawal <= vars.coll, "Collateral withdrawn amount must be less than trove balance."); // Check the adjustment satisfies all conditions for the current system mode _requireValidAdjustmentInCurrentMode(isRecoveryMode, _collWithdrawal, _isDebtIncrease, vars); // When the adjustment is a debt repayment, check it's a valid amount and that the caller has enough LUSD if (!_isDebtIncrease && _LUSDChange > 0) { _requireAtLeastMinNetDebt(_getNetDebt(vars.debt).sub(vars.netDebtChange)); _requireValidLUSDRepayment(vars.debt, vars.netDebtChange); _requireSufficientLUSDBalance(contractsCache.LUSDToken, _borrower, vars.netDebtChange); } (vars.newColl, vars.newDebt) = _updateTroveFromAdjustment(contractsCache.troveManager, _borrower, vars.collChange, vars.isCollIncrease, vars.netDebtChange, _isDebtIncrease); vars.stake = contractsCache.troveManager.updateStakeAndTotalStakes(_borrower); // Re-insert trove in to the sorted list uint newNICR = _getNewNominalICRFromTroveChange(vars.coll, vars.debt, vars.collChange, vars.isCollIncrease, vars.netDebtChange, _isDebtIncrease); sortedTroves.reInsert(_borrower, newNICR, _upperHint, _lowerHint); emit TroveUpdated(_borrower, vars.newDebt, vars.newColl, vars.stake, BorrowerOperation.adjustTrove); emit LUSDBorrowingFeePaid(msg.sender, vars.LUSDFee); // Use the unmodified _LUSDChange here, as we don't send the fee to the user _moveTokensAndETHfromAdjustment( contractsCache.activePool, contractsCache.LUSDToken, msg.sender, vars.collChange, vars.isCollIncrease, _LUSDChange, _isDebtIncrease, vars.netDebtChange ); } function closeTrove() external override { ITroveManager troveManagerCached = troveManager; IActivePool activePoolCached = activePool; ILUSDToken LUSDTokenCached = LUSDToken; _requireTroveisActive(troveManagerCached, msg.sender); uint price = priceFeed.fetchPrice(); _requireNotInRecoveryMode(price); troveManagerCached.applyPendingRewards(msg.sender); uint coll = troveManagerCached.getTroveColl(msg.sender); uint debt = troveManagerCached.getTroveDebt(msg.sender); _requireSufficientLUSDBalance(LUSDTokenCached, msg.sender, debt.sub(LUSD_GAS_COMPENSATION)); uint newTCR = _getNewTCRFromTroveChange(coll, false, debt, false, price); _requireNewTCRisAboveCCR(newTCR); troveManagerCached.removeStake(msg.sender); troveManagerCached.closeTrove(msg.sender); emit TroveUpdated(msg.sender, 0, 0, 0, BorrowerOperation.closeTrove); // Burn the repaid LUSD from the user's balance and the gas compensation from the Gas Pool _repayLUSD(activePoolCached, LUSDTokenCached, msg.sender, debt.sub(LUSD_GAS_COMPENSATION)); _repayLUSD(activePoolCached, LUSDTokenCached, gasPoolAddress, LUSD_GAS_COMPENSATION); // Send the collateral back to the user activePoolCached.sendETH(msg.sender, coll); } /** * Claim remaining collateral from a redemption or from a liquidation with ICR > MCR in Recovery Mode */ function claimCollateral() external override { // send ETH from CollSurplus Pool to owner collSurplusPool.claimColl(msg.sender); } // --- Helper functions --- function _triggerBorrowingFee(ITroveManager _troveManager, ILUSDToken _LUSDToken, uint _LUSDAmount, uint _maxFeePercentage) internal returns (uint) { _troveManager.decayBaseRateFromBorrowing(); // decay the baseRate state variable uint LUSDFee = _troveManager.getBorrowingFee(_LUSDAmount); _requireUserAcceptsFee(LUSDFee, _LUSDAmount, _maxFeePercentage); // Send fee to borrowingFeePoolAddress _LUSDToken.mint(borrowingFeePoolAddress, LUSDFee); return LUSDFee; } function _getUSDValue(uint _coll, uint _price) internal pure returns (uint) { uint usdValue = _price.mul(_coll).div(DECIMAL_PRECISION); return usdValue; } function _getCollChange( uint _collReceived, uint _requestedCollWithdrawal ) internal pure returns(uint collChange, bool isCollIncrease) { if (_collReceived != 0) { collChange = _collReceived; isCollIncrease = true; } else { collChange = _requestedCollWithdrawal; } } // Update trove's coll and debt based on whether they increase or decrease function _updateTroveFromAdjustment ( ITroveManager _troveManager, address _borrower, uint _collChange, bool _isCollIncrease, uint _debtChange, bool _isDebtIncrease ) internal returns (uint, uint) { uint newColl = (_isCollIncrease) ? _troveManager.increaseTroveColl(_borrower, _collChange) : _troveManager.decreaseTroveColl(_borrower, _collChange); uint newDebt = (_isDebtIncrease) ? _troveManager.increaseTroveDebt(_borrower, _debtChange) : _troveManager.decreaseTroveDebt(_borrower, _debtChange); return (newColl, newDebt); } function _moveTokensAndETHfromAdjustment ( IActivePool _activePool, ILUSDToken _LUSDToken, address _borrower, uint _collChange, bool _isCollIncrease, uint _LUSDChange, bool _isDebtIncrease, uint _netDebtChange ) internal { if (_isDebtIncrease) { _withdrawLUSD(_activePool, _LUSDToken, _borrower, _LUSDChange, _netDebtChange); } else { _repayLUSD(_activePool, _LUSDToken, _borrower, _LUSDChange); } if (_isCollIncrease) { _activePoolAddColl(_activePool, _collChange); } else { _activePool.sendETH(_borrower, _collChange); } } // Send ETH to Active Pool and increase its recorded ETH balance function _activePoolAddColl(IActivePool _activePool, uint _amount) internal { uint256 allowance = collToken.allowance(address(this), address(_activePool)); if (allowance < _amount) { bool success = collToken.approve(address(_activePool), type(uint256).max); require(success, "BorrowerOperations: Cannot approve ActivePool to spend collateral"); } _activePool.depositColl(_amount); } // Issue the specified amount of LUSD to _account and increases the total active debt (_netDebtIncrease potentially includes a LUSDFee) function _withdrawLUSD(IActivePool _activePool, ILUSDToken _LUSDToken, address _account, uint _LUSDAmount, uint _netDebtIncrease) internal { _activePool.increaseLUSDDebt(_netDebtIncrease); _LUSDToken.mint(_account, _LUSDAmount); } // Burn the specified amount of LUSD from _account and decreases the total active debt function _repayLUSD(IActivePool _activePool, ILUSDToken _LUSDToken, address _account, uint _LUSD) internal { _activePool.decreaseLUSDDebt(_LUSD); _LUSDToken.burn(_account, _LUSD); } // --- 'Require' wrapper functions --- function _requireSingularCollChange(uint _collAmount, uint _collWithdrawal) internal view { require(_collAmount == 0 || _collWithdrawal == 0, "BorrowerOperations: Cannot withdraw and add coll"); } function _requireCallerIsBorrower(address _borrower) internal view { require(msg.sender == _borrower, "BorrowerOps: Caller must be the borrower for a withdrawal"); } function _requireNonZeroAdjustment(uint _collAmount, uint _collWithdrawal, uint _LUSDChange) internal view { require(_collAmount != 0 || _collWithdrawal != 0 || _LUSDChange != 0, "BorrowerOps: There must be either a collateral change or a debt change"); } function _requireTroveisActive(ITroveManager _troveManager, address _borrower) internal view { uint status = _troveManager.getTroveStatus(_borrower); require(status == 1, "BorrowerOps: Trove does not exist or is closed"); } function _requireTroveisNotActive(ITroveManager _troveManager, address _borrower) internal view { uint status = _troveManager.getTroveStatus(_borrower); require(status != 1, "BorrowerOps: Trove is active"); } function _requireNonZeroDebtChange(uint _LUSDChange) internal pure { require(_LUSDChange > 0, "BorrowerOps: Debt increase requires non-zero debtChange"); } function _requireNotInRecoveryMode(uint _price) internal view { require(!_checkRecoveryMode(_price, _collDecimalAdjustment), "BorrowerOps: Operation not permitted during Recovery Mode"); } function _requireNoCollWithdrawal(uint _collWithdrawal) internal pure { require(_collWithdrawal == 0, "BorrowerOps: Collateral withdrawal not permitted Recovery Mode"); } function _requireValidAdjustmentInCurrentMode ( bool _isRecoveryMode, uint _collWithdrawal, bool _isDebtIncrease, LocalVariables_adjustTrove memory _vars ) internal view { /* *In Recovery Mode, only allow: * * - Pure collateral top-up * - Pure debt repayment * - Collateral top-up with debt repayment * - A debt increase combined with a collateral top-up which makes the ICR >= 150% and improves the ICR (and by extension improves the TCR). * * In Normal Mode, ensure: * * - The new ICR is above MCR * - The adjustment won't pull the TCR below CCR */ if (_isRecoveryMode) { _requireNoCollWithdrawal(_collWithdrawal); if (_isDebtIncrease) { _requireICRisAboveCCR(_vars.newICR); _requireNewICRisAboveOldICR(_vars.newICR, _vars.oldICR); } } else { // if Normal Mode _requireICRisAboveMCR(_vars.newICR); _vars.newTCR = _getNewTCRFromTroveChange(_vars.collChange, _vars.isCollIncrease, _vars.netDebtChange, _isDebtIncrease, _vars.price); _requireNewTCRisAboveCCR(_vars.newTCR); } } function _requireICRisAboveMCR(uint _newICR) internal pure { require(_newICR >= MCR, "BorrowerOps: An operation that would result in ICR < MCR is not permitted"); } function _requireICRisAboveCCR(uint _newICR) internal pure { require(_newICR >= CCR, "BorrowerOps: Operation must leave trove with ICR >= CCR"); } function _requireNewICRisAboveOldICR(uint _newICR, uint _oldICR) internal pure { require(_newICR >= _oldICR, "BorrowerOps: Cannot decrease your Trove's ICR in Recovery Mode"); } function _requireNewTCRisAboveCCR(uint _newTCR) internal pure { require(_newTCR >= CCR, "BorrowerOps: An operation that would result in TCR < CCR is not permitted"); } function _requireAtLeastMinNetDebt(uint _netDebt) internal pure { require (_netDebt >= MIN_NET_DEBT, "BorrowerOps: Trove's net debt must be greater than minimum"); } function _requireActivePoolDebtBelowDebtCeiling(uint _netDebt, uint _activePoolLUSDDebt, uint _debtCeiling) internal pure { require (_netDebt.add(_activePoolLUSDDebt) <= _debtCeiling, "BorrowerOps: Trove's net debt must be less than debt ceiling"); } function _requireValidLUSDRepayment(uint _currentDebt, uint _debtRepayment) internal pure { require(_debtRepayment <= _currentDebt.sub(LUSD_GAS_COMPENSATION), "BorrowerOps: Amount repaid must not be larger than the Trove's debt"); } function _requireCallerIsStabilityPool() internal view { require(msg.sender == stabilityPoolAddress, "BorrowerOps: Caller is not Stability Pool"); } function _requireSufficientLUSDBalance(ILUSDToken _LUSDToken, address _borrower, uint _debtRepayment) internal view { require(_LUSDToken.balanceOf(_borrower) >= _debtRepayment, "BorrowerOps: Caller doesnt have enough LUSD to make repayment"); } function _requireValidMaxFeePercentage(uint _maxFeePercentage, bool _isRecoveryMode) internal pure { if (_isRecoveryMode) { require(_maxFeePercentage <= DECIMAL_PRECISION, "Max fee percentage must less than or equal to 100%"); } else { require(_maxFeePercentage >= BORROWING_FEE_FLOOR && _maxFeePercentage <= DECIMAL_PRECISION, "Max fee percentage must be between 0.5% and 100%"); } } // --- ICR and TCR getters --- // Compute the new collateral ratio, considering the change in coll and debt. Assumes 0 pending rewards. function _getNewNominalICRFromTroveChange ( uint _coll, uint _debt, uint _collChange, bool _isCollIncrease, uint _debtChange, bool _isDebtIncrease ) view internal returns (uint) { (uint newColl, uint newDebt) = _getNewTroveAmounts(_coll, _debt, _collChange, _isCollIncrease, _debtChange, _isDebtIncrease); uint newNICR = LiquityMath._computeNominalCR(newColl, newDebt, _collDecimalAdjustment); return newNICR; } // Compute the new collateral ratio, considering the change in coll and debt. Assumes 0 pending rewards. function _getNewICRFromTroveChange ( uint _coll, uint _debt, uint _collChange, bool _isCollIncrease, uint _debtChange, bool _isDebtIncrease, uint _price ) view internal returns (uint) { (uint newColl, uint newDebt) = _getNewTroveAmounts(_coll, _debt, _collChange, _isCollIncrease, _debtChange, _isDebtIncrease); uint newICR = LiquityMath._computeCR(newColl, newDebt, _price, _collDecimalAdjustment); return newICR; } function _getNewTroveAmounts( uint _coll, uint _debt, uint _collChange, bool _isCollIncrease, uint _debtChange, bool _isDebtIncrease ) internal pure returns (uint, uint) { uint newColl = _coll; uint newDebt = _debt; newColl = _isCollIncrease ? _coll.add(_collChange) : _coll.sub(_collChange); newDebt = _isDebtIncrease ? _debt.add(_debtChange) : _debt.sub(_debtChange); return (newColl, newDebt); } function _getNewTCRFromTroveChange ( uint _collChange, bool _isCollIncrease, uint _debtChange, bool _isDebtIncrease, uint _price ) internal view returns (uint) { uint totalColl = getEntireSystemColl(); uint totalDebt = getEntireSystemDebt(); totalColl = _isCollIncrease ? totalColl.add(_collChange) : totalColl.sub(_collChange); totalDebt = _isDebtIncrease ? totalDebt.add(_debtChange) : totalDebt.sub(_debtChange); uint newTCR = LiquityMath._computeCR(totalColl, totalDebt, _price, _collDecimalAdjustment); return newTCR; } function getCompositeDebt(uint _debt) external pure override returns (uint) { return _getCompositeDebt(_debt); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_activePoolAddress","type":"address"}],"name":"ActivePoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_borrowingFeePoolAddress","type":"address"}],"name":"BorrowingFeePoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_collSurplusPoolAddress","type":"address"}],"name":"CollSurplusPoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_collTokenAddress","type":"address"}],"name":"CollTokenAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_defaultPoolAddress","type":"address"}],"name":"DefaultPoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_feeAdminAddress","type":"address"}],"name":"FeeAdminAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_gasPoolAddress","type":"address"}],"name":"GasPoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"_LUSDFee","type":"uint256"}],"name":"LUSDBorrowingFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newPriceFeedAddress","type":"address"}],"name":"PriceFeedAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_sortedTrovesAddress","type":"address"}],"name":"SortedTrovesAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_stabilityPoolAddress","type":"address"}],"name":"StabilityPoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"arrayIndex","type":"uint256"}],"name":"TroveCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newTroveManagerAddress","type":"address"}],"name":"TroveManagerAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_borrower","type":"address"},{"indexed":false,"internalType":"uint256","name":"_debt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_coll","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stake","type":"uint256"},{"indexed":false,"internalType":"enum BorrowerOperations.BorrowerOperation","name":"operation","type":"uint8"}],"name":"TroveUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_wethTokenAddress","type":"address"}],"name":"WETHTokenAddressChanged","type":"event"},{"inputs":[],"name":"BORROWING_FEE_FLOOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CCR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLL_DEBT_CEILING","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DECIMAL_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LUSDToken","outputs":[{"internalType":"contract ILUSDToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LUSD_GAS_COMPENSATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MCR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_NET_DEBT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MSCR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERCENT_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STABLE_COLL_BORROWING_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STABLE_COLL_COLLATERAL_RARIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STABLE_COLL_COLLATERAL_RARIO_DIVIDEND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STABLE_COLL_COLLATERAL_RARIO_DIVISOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STABLE_COLL_DEBT_CEILING","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_100pct","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activePool","outputs":[{"internalType":"contract IActivePool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"addColl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_collAmount","type":"uint256"},{"internalType":"uint256","name":"_collWithdrawal","type":"uint256"},{"internalType":"uint256","name":"_LUSDChange","type":"uint256"},{"internalType":"bool","name":"_isDebtIncrease","type":"bool"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"adjustTrove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"borrowingFeePoolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeTrove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collSurplusPool","outputs":[{"internalType":"contract ICollSurplusPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultPool","outputs":[{"internalType":"contract IDefaultPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasPoolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debt","type":"uint256"}],"name":"getCompositeDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getEntireSystemColl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEntireSystemDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEntireSystemStableColl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEntireSystemStableDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum BorrowerOperations.Functions","name":"_fn","type":"uint8"}],"name":"lockFunction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_borrower","type":"address"},{"internalType":"uint256","name":"_collAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"moveETHGainToTrove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_LUSDAmount","type":"uint256"},{"internalType":"uint256","name":"_collAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"openTrove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceFeed","outputs":[{"internalType":"contract IPriceFeed","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_LUSDAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"repayLUSD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_troveManagerAddress","type":"address"},{"internalType":"address","name":"_activePoolAddress","type":"address"},{"internalType":"address","name":"_defaultPoolAddress","type":"address"},{"internalType":"address","name":"_stabilityPoolAddress","type":"address"},{"internalType":"address","name":"_gasPoolAddress","type":"address"},{"internalType":"address","name":"_collSurplusPoolAddress","type":"address"},{"internalType":"address","name":"_priceFeedAddress","type":"address"},{"internalType":"address","name":"_sortedTrovesAddress","type":"address"},{"internalType":"address","name":"_LUSDTokenAddress","type":"address"},{"internalType":"address","name":"_collTokenAddress","type":"address"},{"internalType":"uint256","name":"collDecimalAdjustment","type":"uint256"}],"name":"setAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_borrowingFeePoolAddress","type":"address"}],"name":"setBorrowingFeePoolAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sortedTroves","outputs":[{"internalType":"contract ISortedTroves","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stabilityPoolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stableCollActivePool","outputs":[{"internalType":"contract IStableCollActivePool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum BorrowerOperations.Functions","name":"","type":"uint8"}],"name":"timelock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"troveManager","outputs":[{"internalType":"contract ITroveManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum BorrowerOperations.Functions","name":"_fn","type":"uint8"}],"name":"unlockFunction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collWithdrawal","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"withdrawColl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxFeePercentage","type":"uint256"},{"internalType":"uint256","name":"_LUSDAmount","type":"uint256"},{"internalType":"address","name":"_upperHint","type":"address"},{"internalType":"address","name":"_lowerHint","type":"address"}],"name":"withdrawLUSD","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600e805460ff1916905534801561001a57600080fd5b50600480546001600160a01b031916339081179091556040516000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36144208061006a6000396000f3fe608060405234801561001057600080fd5b50600436106102ab5760003560e01c8063795d26c311610172578063b4fa3b98116100d9578063cda775f911610092578063cda775f914610658578063d56d6bbe14610660578063d71f779114610694578063dd92690b1461069c578063e091d2fc146106a4578063f92d34331461071e578063fe9d032314610726576102ab565b8063b4fa3b98146105f8578063b5cc996c14610618578063b9186f4314610620578063c17bae2a14610628578063c4dfcaea14610648578063cab8b4fe14610650576102ab565b80638f32d59b1161012b5780638f32d59b146105115780639284af2c1461052d578063a20baee614610376578063a3f4df7e14610553578063aa53099d146105d0578063ae918754146105f0576102ab565b8063795d26c3146104755780637f7dde4a1461047d578063887105d31461048557806389fdcb391461048d5780638da5cb5b146104c95780638f09162b146104d1576102ab565b8063434124e3116102165780635da8b1c3116101cf5780635da8b1c31461040f5780636364a1b9146103665780636f0b0c1c1461045d57806372fe25aa14610376578063741bef1a14610465578063794e57241461046d576102ab565b8063434124e31461039e57806343490056146103a65780634870dd9a146103ae5780634ff81443146103b65780635530273c146103d35780635733d58f14610407576102ab565b80631bf43555116102685780631bf435551461036e578063247aed96146103765780632e86bbd81461037e57806331b8c946146103865780633cc742251461038e5780633d83908a14610396576102ab565b806304491fa7146102b05780630b622ab2146102e65780630e704d501461030a5780631184e5f814610312578063155d47651461034c57806318baf9a414610366575b600080fd5b6102e4600480360360608110156102c657600080fd5b508035906001600160a01b036020820135811691604001351661072e565b005b6102ee610746565b604080516001600160a01b039092168252519081900360200190f35b6102e4610755565b6102e46004803603608081101561032857600080fd5b508035906020810135906001600160a01b0360408201358116916060013516610b50565b610354610b68565b60408051918252519081900360200190f35b610354610b73565b610354610b81565b610354610b8e565b610354610b9a565b6102ee610ba7565b6102ee610bb6565b6102ee610bc5565b610354610bd4565b6102ee610bd9565b610354610be8565b610354600480360360208110156103cc57600080fd5b5035610bed565b6102e4600480360360608110156103e957600080fd5b508035906001600160a01b0360208201358116916040013516610bfe565b610354610c11565b6102e4600480360360e081101561042557600080fd5b5080359060208101359060408101359060608101359060808101351515906001600160a01b0360a082013581169160c0013516610c1d565b6102e4610cf7565b6102ee610d57565b610354610d66565b610354610d72565b6102ee610e73565b610354610e82565b6102e4600480360360808110156104a357600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516610f3e565b6102ee61101a565b6102e4600480360360a08110156104e757600080fd5b508035906020810135906040810135906001600160a01b0360608201358116916080013516611029565b610519611804565b604080519115158252519081900360200190f35b6102e46004803603602081101561054357600080fd5b50356001600160a01b0316611815565b61055b61198f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561059557818101518382015260200161057d565b50505050905090810190601f1680156105c25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102e4600480360360208110156105e657600080fd5b503560ff166119bd565b6102ee611a39565b6102e46004803603602081101561060e57600080fd5b503560ff16611a48565b6102ee611aa1565b610354611ab0565b6103546004803603602081101561063e57600080fd5b503560ff16611ab5565b610354611ac7565b610354611b3d565b6102ee611b82565b6102e46004803603606081101561067657600080fd5b508035906001600160a01b0360208201358116916040013516611b91565b610354611c65565b6102ee611c71565b6102e460048036036101608110156106bb57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a081013582169160c082013581169160e0810135821691610100820135811691610120810135909116906101400135611c80565b610354612103565b6102ee61210e565b610741336000808660008787600061211d565b505050565b6006546001600160a01b031681565b6005546000546009546001600160a01b039283169291821691166107798333612881565b60035460408051630fdb11cf60e01b815290516000926001600160a01b031691630fdb11cf91600480830192602092919082900301818787803b1580156107bf57600080fd5b505af11580156107d3573d6000803e3d6000fd5b505050506040513d60208110156107e957600080fd5b505190506107f681612946565b60408051630b07655760e01b815233600482015290516001600160a01b03861691630b07655791602480830192600092919082900301818387803b15801561083d57600080fd5b505af1158015610851573d6000803e3d6000fd5b5050604080516309019aaf60e31b81523360048201529051600093506001600160a01b038816925063480cd57891602480820192602092909190829003018186803b15801561089f57600080fd5b505afa1580156108b3573d6000803e3d6000fd5b505050506040513d60208110156108c957600080fd5b50516040805163d66a255360e01b815233600482015290519192506000916001600160a01b0388169163d66a2553916024808301926020929190829003018186803b15801561091757600080fd5b505afa15801561092b573d6000803e3d6000fd5b505050506040513d602081101561094157600080fd5b505190506109688433610963846815af1d78b58c40000063ffffffff61299116565b6129da565b600061097983600084600088612a9a565b905061098481612b28565b60408051631fc5750960e31b815233600482015290516001600160a01b0389169163fe2ba84891602480830192600092919082900301818387803b1580156109cb57600080fd5b505af11580156109df573d6000803e3d6000fd5b5050604080516365e89c5760e11b815233600482015290516001600160a01b038b16935063cbd138ae9250602480830192600092919082900301818387803b158015610a2a57600080fd5b505af1158015610a3e573d6000803e3d6000fd5b50505050336001600160a01b031660008051602061415a8339815191526000806000600160405180858152602001848152602001838152602001826002811115610a8457fe5b60ff16815260200194505050505060405180910390a2610abe868633610ab9866815af1d78b58c40000063ffffffff61299116565b612b6f565b600754610ae190879087906001600160a01b03166815af1d78b58c400000612b6f565b604080516364a197f360e01b81523360048201526024810185905290516001600160a01b038816916364a197f391604480830192600092919082900301818387803b158015610b2f57600080fd5b505af1158015610b43573d6000803e3d6000fd5b5050505050505050505050565b610b623360008086600187878b61211d565b50505050565b662386f26fc1000081565b69021e19e0c9bab240000081565b686c6b935b8bbd40000081565b670de0b6b3a764000081565b6815af1d78b58c40000081565b600a546001600160a01b031681565b6002546001600160a01b031681565b6005546001600160a01b031681565b606581565b6009546001600160a01b031681565b60c881565b6000610bf882612c4b565b92915050565b610741336000856000808787600061211d565b6714d1120d7b16000081565b600a54604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610c7757600080fd5b505af1158015610c8b573d6000803e3d6000fd5b505050506040513d6020811015610ca157600080fd5b5051610cde5760405162461bcd60e51b8152600401808060200182810382526036815260200180613e2c6036913960400191505060405180910390fd5b610cee338787878787878e61211d565b50505050505050565b6008546040805163b32beb5b60e01b815233600482015290516001600160a01b039092169163b32beb5b9160248082019260009290919082900301818387803b158015610d4357600080fd5b505af1158015610b62573d6000803e3d6000fd5b6003546001600160a01b031681565b670f43fc2c04ee000081565b6000805460408051632f5a97e560e11b8152905183926001600160a01b031691635eb52fca916004808301926020929190829003018186803b158015610db757600080fd5b505afa158015610dcb573d6000803e3d6000fd5b505050506040513d6020811015610de157600080fd5b505160025460408051632f5a97e560e11b815290519293506000926001600160a01b0390921691635eb52fca91600480820192602092909190829003018186803b158015610e2e57600080fd5b505afa158015610e42573d6000803e3d6000fd5b505050506040513d6020811015610e5857600080fd5b50519050610e6c828263ffffffff612c6616565b9250505090565b6000546001600160a01b031681565b6000805460408051630a7b61df60e11b8152905183926001600160a01b0316916314f6c3be916004808301926020929190829003018186803b158015610ec757600080fd5b505afa158015610edb573d6000803e3d6000fd5b505050506040513d6020811015610ef157600080fd5b505160025460408051630a7b61df60e11b815290519293506000926001600160a01b03909216916314f6c3be91600480820192602092909190829003018186803b158015610e2e57600080fd5b610f46612cc0565b600a54604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610fa057600080fd5b505af1158015610fb4573d6000803e3d6000fd5b505050506040513d6020811015610fca57600080fd5b50516110075760405162461bcd60e51b815260040180806020018281038252603d815260200180613f0c603d913960400191505060405180910390fd5b610b62848460008060008787600061211d565b6004546001600160a01b031690565b600a54604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561108357600080fd5b505af1158015611097573d6000803e3d6000fd5b505050506040513d60208110156110ad57600080fd5b50516110ea5760405162461bcd60e51b81526004018080602001828103825260348152602001806141b86034913960400191505060405180910390fd5b6110f2613d4e565b50604080516060810182526005546001600160a01b03908116825260005481166020830152600954169181019190915261112a613d6e565b600360009054906101000a90046001600160a01b03166001600160a01b0316630fdb11cf6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561117a57600080fd5b505af115801561118e573d6000803e3d6000fd5b505050506040513d60208110156111a457600080fd5b5051808252600d546000916111b891612d0b565b90506111c48882612d2a565b82516111d09033612dda565b6040808301889052835181516394cd4ba760e01b815291516001600160a01b03909116916394cd4ba7916004808301926020929190829003018186803b15801561121957600080fd5b505afa15801561122d573d6000803e3d6000fd5b505050506040513d602081101561124357600080fd5b5051610100830152806112855761126483600001518460400151898b612eb6565b60208301819052604083015161127f9163ffffffff612c6616565b60408301525b6112928260400151613003565b6112ad82604001516112a2610d72565b84610100015161304b565b6112ba8260400151612c4b565b60608301819052611312576040805162461bcd60e51b815260206004820152601e60248201527f44656274206d757374206265206c6172676572207468616e207a65726f2e0000604482015290519081900360640190fd5b6113288683606001518460000151600d54613099565b60808301526060820151600d546113409188916130e5565b60a0830152801561135d576113588260800151613120565b611390565b61136a8260800151613167565b6000611383876001856060015160018760000151612a9a565b905061138e81612b28565b505b825160408051635d6b480f60e01b81523360048201526001602482015290516001600160a01b0390921691635d6b480f9160448082019260009290919082900301818387803b1580156113e257600080fd5b505af11580156113f6573d6000803e3d6000fd5b50508451604080516372423c1760e01b8152336004820152602481018b905290516001600160a01b0390921693506372423c1792506044808201926020929091908290030181600087803b15801561144d57600080fd5b505af1158015611461573d6000803e3d6000fd5b505050506040513d602081101561147757600080fd5b50508251606083015160408051639976cf4560e01b81523360048201526024810192909252516001600160a01b0390921691639976cf45916044808201926020929091908290030181600087803b1580156114d157600080fd5b505af11580156114e5573d6000803e3d6000fd5b505050506040513d60208110156114fb57600080fd5b50508251604080516382fe3eb960e01b815233600482015290516001600160a01b03909216916382fe3eb99160248082019260009290919082900301818387803b15801561154857600080fd5b505af115801561155c573d6000803e3d6000fd5b5050845160408051630c7940bd60e11b815233600482015290516001600160a01b0390921693506318f2817a92506024808201926020929091908290030181600087803b1580156115ac57600080fd5b505af11580156115c0573d6000803e3d6000fd5b505050506040513d60208110156115d657600080fd5b505160c0830152600c5460a0830151604080516346f7cf8760e01b815233600482015260248101929092526001600160a01b038881166044840152878116606484015290519216916346f7cf879160848082019260009290919082900301818387803b15801561164557600080fd5b505af1158015611659573d6000803e3d6000fd5b50508451604080516315d549f160e01b815233600482015290516001600160a01b0390921693506315d549f192506024808201926020929091908290030181600087803b1580156116a957600080fd5b505af11580156116bd573d6000803e3d6000fd5b505050506040513d60208110156116d357600080fd5b505160e08301819052604080519182525133917f59cfd0cd754bc5748b6770e94a4ffa5f678d885cb899dcfadc5734edb97c67ab919081900360200190a261171f8360200151876131ae565b61173883602001518460400151338a866040015161335b565b602083015160408401516007546117649291906001600160a01b03166815af1d78b58c4000008061335b565b336001600160a01b031660008051602061415a8339815191528360600151888560c001516000604051808581526020018481526020018381526020018260028111156117ac57fe5b60ff16815260200194505050505060405180910390a2602080830151604080519182525133927fa55c5f48fd29482ad55f4b59bf070cd1ac1a7132a31f7a136ebe8877ae37e1ff928290030190a25050505050505050565b6004546001600160a01b0316331490565b61181d611804565b61185c576040805162461bcd60e51b8152602060048201819052602482015260008051602061410c833981519152604482015290519081900360640190fd5b60016000819052600f6020527f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f5481148015906118c2575042600f60008360018111156118a557fe5b60018111156118b057fe5b81526020019081526020016000205411155b61190c576040805162461bcd60e51b8152602060048201526016602482015275119d5b98dd1a5bdb881a5cc81d1a5b595b1bd8dad95960521b604482015290519081900360640190fd5b600b80546001600160a01b0384166001600160a01b0319909116811790915560408051918252517f464b3fecfa0a372d7cb418a572e9fedd7e2a099c7a92f6ed351f47e5aa1802739181900360200190a1505060016000819052600f6020527f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f55565b60405180604001604052806012815260200171426f72726f7765724f7065726174696f6e7360701b81525081565b6119c5611804565b611a04576040805162461bcd60e51b8152602060048201819052602482015260008051602061410c833981519152604482015290519081900360640190fd5b6202a3004201600f6000836001811115611a1a57fe5b6001811115611a2557fe5b815260208101919091526040016000205550565b600c546001600160a01b031681565b611a50611804565b611a8f576040805162461bcd60e51b8152602060048201819052602482015260008051602061410c833981519152604482015290519081900360640190fd5b6001600f6000836001811115611a1a57fe5b600b546001600160a01b031681565b606481565b600f6020526000908152604090205481565b60015460408051630a7b61df60e11b815290516000926001600160a01b0316916314f6c3be916004808301926020929190829003018186803b158015611b0c57600080fd5b505afa158015611b20573d6000803e3d6000fd5b505050506040513d6020811015611b3657600080fd5b5051905090565b60015460408051632f5a97e560e11b815290516000926001600160a01b031691635eb52fca916004808301926020929190829003018186803b158015611b0c57600080fd5b6008546001600160a01b031681565b600a54604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611beb57600080fd5b505af1158015611bff573d6000803e3d6000fd5b505050506040513d6020811015611c1557600080fd5b5051611c525760405162461bcd60e51b8152600401808060200182810382526032815260200180613f496032913960400191505060405180910390fd5b610741338460008060008787600061211d565b670e043da61725000081565b6001546001600160a01b031681565b611c88611804565b611cc7576040805162461bcd60e51b8152602060048201819052602482015260008051602061410c833981519152604482015290519081900360640190fd5b6000808052600f6020527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37554600114801590611d2c575042600f6000836001811115611d0f57fe5b6001811115611d1a57fe5b81526020019081526020016000205411155b611d76576040805162461bcd60e51b8152602060048201526016602482015275119d5b98dd1a5bdb881a5cc81d1a5b595b1bd8dad95960521b604482015290519081900360640190fd5b600e5460ff1615611db85760405162461bcd60e51b815260040180806020018281038252602e815260200180614229602e913960400191505060405180910390fd5b600e805460ff19166001179055611dce8c613438565b611dd78b613438565b611de08a613438565b611de989613438565b611df288613438565b611dfb87613438565b611e0486613438565b611e0d85613438565b611e1684613438565b611e1f83613438565b600580546001600160a01b03199081166001600160a01b038f81169182179093556000805483168f85161790556002805483168e85161790556006805483168d85161790556007805483168c85161790556008805483168b85161790556003805483168a8516179055600c80548316898516179055600980548316888516179055600a8054909216928616929092179055600d83905560408051918252517f143219c9e69b09e07e095fcc889b43d8f46ca892bba65f08dc3a0050869a5678916020908290030190a1604080516001600160a01b038d16815290517f78f058b189175430c48dc02699e3a0031ea4ff781536dc2fab847de4babdd8829181900360200190a1604080516001600160a01b038c16815290517f5ee0cae2f063ed938bb55046f6a932fb6ae792bf43624806bb90abe68a50be9b9181900360200190a1604080516001600160a01b038b16815290517f82966d27eea39b038ee0fa30cd16532bb24f6e65d31cb58fb227aa5766cdcc7f9181900360200190a1604080516001600160a01b038a16815290517fcfb07d791fcafc032b35837b50eb84b74df518cf4cc287e8084f47630fa70fa09181900360200190a1604080516001600160a01b038916815290517fe67f36a6e961157d6eff83b91f3af5a62131ceb6f04954ef74f51c1c05e7f88d9181900360200190a1604080516001600160a01b038816815290517f8c537274438aa850a330284665d81a85dd38267d09e4050d416bfc94142db2649181900360200190a1604080516001600160a01b038716815290517f65f4cf077bc01e4742eb5ad98326f6e95b63548ea24b17f8d5e823111fe788009181900360200190a1604080516001600160a01b038516815290517f8adeca1d26ce63eb9fb5b9362155b69fbb631209bfc0dddb3d75d96735eae23b9181900360200190a15050600080525050600f602052505060017ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37555505050505050565b660e35fa931a000081565b6007546001600160a01b031681565b612125613d4e565b50604080516060810182526005546001600160a01b03908116825260005481166020830152600954169181019190915261215d613dba565b600360009054906101000a90046001600160a01b03166001600160a01b0316630fdb11cf6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156121ad57600080fd5b505af11580156121c1573d6000803e3d6000fd5b505050506040513d60208110156121d757600080fd5b5051808252600d546000916121eb91612d0b565b90508615612206576121fd8482612d2a565b612206886134e7565b6122108a8a613526565b61221b8a8a8a61356c565b8251612227908c612881565b336001600160a01b038c16148061225d57506006546001600160a01b031633148015612253575060008a115b801561225d575087155b6122ae576040805162461bcd60e51b815260206004820152601a60248201527f41646a7573742074726f766520636865636b206661696c65642e000000000000604482015290519081900360640190fd5b82600001516001600160a01b0316630b0765578c6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561230a57600080fd5b505af115801561231e573d6000803e3d6000fd5b5050505061232c8a8a6135be565b151560608401526020808401919091528351604080516394cd4ba760e01b815290516001600160a01b03909216926394cd4ba792600480840193829003018186803b15801561237a57600080fd5b505afa15801561238e573d6000803e3d6000fd5b505050506040513d60208110156123a457600080fd5b50516101a0830152604082018890528680156123be575080155b15612411576123d7836000015184604001518a87612eb6565b610120830181905260408301516123f39163ffffffff612c6616565b6040830181905261241190612406610d72565b846101a0015161304b565b82600001516001600160a01b031663d66a25538c6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561246b57600080fd5b505afa15801561247f573d6000803e3d6000fd5b505050506040513d602081101561249557600080fd5b505160808301528251604080516309019aaf60e31b81526001600160a01b038e811660048301529151919092169163480cd578916024808301926020929190829003018186803b1580156124e857600080fd5b505afa1580156124fc573d6000803e3d6000fd5b505050506040513d602081101561251257600080fd5b505160a0830181905260808301518351600d5461253193929190613099565b8260c00181815250506125618260a0015183608001518460200151856060015186604001518c88600001516135dd565b60e083015260a08201518911156125a95760405162461bcd60e51b815260040180806020018281038252603c815260200180614066603c913960400191505060405180910390fd5b6125b5818a8985613613565b861580156125c35750600088115b15612616576125f16125ec83604001516125e08560800151613687565b9063ffffffff61299116565b613003565b612603826080015183604001516136a2565b61261683604001518c84604001516129da565b61263483600001518c8460200151856060015186604001518c6136f9565b610140840152610160830152825160408051630c7940bd60e11b81526001600160a01b038e81166004830152915191909216916318f2817a9160248083019260209291908290030181600087803b15801561268e57600080fd5b505af11580156126a2573d6000803e3d6000fd5b505050506040513d60208110156126b857600080fd5b505161018083015260a082015160808301516020840151606085015160408601516000946126ec949093909290918d613959565b9050600c60009054906101000a90046001600160a01b03166001600160a01b0316632be212608d838a8a6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001848152602001836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b03168152602001945050505050600060405180830381600087803b15801561279757600080fd5b505af11580156127ab573d6000803e3d6000fd5b505050508b6001600160a01b031660008051602061415a8339815191528461014001518561016001518661018001516002604051808581526020018481526020018381526020018260028111156127fe57fe5b60ff16815260200194505050505060405180910390a2610120830151604080519182525133917fa55c5f48fd29482ad55f4b59bf070cd1ac1a7132a31f7a136ebe8877ae37e1ff919081900360200190a26128738460200151856040015133866020015187606001518e8e8a6040015161398d565b505050505050505050505050565b6000826001600160a01b03166321e37801836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156128d957600080fd5b505afa1580156128ed573d6000803e3d6000fd5b505050506040513d602081101561290357600080fd5b50519050600181146107415760405162461bcd60e51b815260040180806020018281038252602e81526020018061412c602e913960400191505060405180910390fd5b61295281600d54612d0b565b1561298e5760405162461bcd60e51b8152600401808060200182810382526039815260200180613ed36039913960400191505060405180910390fd5b50565b60006129d383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a3a565b9392505050565b80836001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612a3157600080fd5b505afa158015612a45573d6000803e3d6000fd5b505050506040513d6020811015612a5b57600080fd5b505110156107415760405162461bcd60e51b815260040180806020018281038252603d8152602001806141ec603d913960400191505060405180910390fd5b600080612aa5610e82565b90506000612ab1610d72565b905086612acd57612ac8828963ffffffff61299116565b612add565b612add828963ffffffff612c6616565b915084612af957612af4818763ffffffff61299116565b612b09565b612b09818763ffffffff612c6616565b90506000612b1b838387600d54613099565b9998505050505050505050565b6714d1120d7b16000081101561298e5760405162461bcd60e51b81526004018080602001828103825260498152602001806140c36049913960600191505060405180910390fd5b836001600160a01b03166338d995a8826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612bb557600080fd5b505af1158015612bc9573d6000803e3d6000fd5b50505050826001600160a01b0316639dc29fac83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612c2d57600080fd5b505af1158015612c41573d6000803e3d6000fd5b5050505050505050565b6000610bf8826815af1d78b58c40000063ffffffff612c6616565b6000828201838110156129d3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6006546001600160a01b03163314612d095760405162461bcd60e51b815260040180806020018281038252602981526020018061431d6029913960400191505060405180910390fd5b565b600080612d188484613ad1565b6714d1120d7b16000011949350505050565b8015612d7c57670de0b6b3a7640000821115612d775760405162461bcd60e51b8152600401808060200182810382526032815260200180613fee6032913960400191505060405180910390fd5b612dd6565b660e35fa931a00008210801590612d9b5750670de0b6b3a76400008211155b612dd65760405162461bcd60e51b81526004018080602001828103825260308152602001806143466030913960400191505060405180910390fd5b5050565b6000826001600160a01b03166321e37801836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612e3257600080fd5b505afa158015612e46573d6000803e3d6000fd5b505050506040513d6020811015612e5c57600080fd5b505190506001811415610741576040805162461bcd60e51b815260206004820152601c60248201527f426f72726f7765724f70733a2054726f76652069732061637469766500000000604482015290519081900360640190fd5b6000846001600160a01b0316635dba4c4a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612ef357600080fd5b505af1158015612f07573d6000803e3d6000fd5b505050506000856001600160a01b031663631203b0856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612f5157600080fd5b505afa158015612f65573d6000803e3d6000fd5b505050506040513d6020811015612f7b57600080fd5b50519050612f8a818585613b02565b600b54604080516340c10f1960e01b81526001600160a01b039283166004820152602481018490529051918716916340c10f199160448082019260009290919082900301818387803b158015612fdf57600080fd5b505af1158015612ff3573d6000803e3d6000fd5b509293505050505b949350505050565b686c6b935b8bbd40000081101561298e5760405162461bcd60e51b815260040180806020018281038252603a8152602001806142a0603a913960400191505060405180910390fd5b8061305c848463ffffffff612c6616565b11156107415760405162461bcd60e51b815260040180806020018281038252603c815260200180613f7b603c913960400191505060405180910390fd5b600083156130dc5760006130d3856130c7866130bb8a8863ffffffff613b7716565b9063ffffffff613b7716565b9063ffffffff613bd016565b9150612ffb9050565b50600019612ffb565b600082156131155761310e836130c768056bc75e2d631000006130bb888763ffffffff613b7716565b90506129d3565b506000199392505050565b6714d1120d7b16000081101561298e5760405162461bcd60e51b8152600401808060200182810382526037815260200180613fb76037913960400191505060405180910390fd5b670f43fc2c04ee000081101561298e5760405162461bcd60e51b81526004018080602001828103825260498152602001806142576049913960600191505060405180910390fd5b600a5460408051636eb1769f60e11b81523060048201526001600160a01b0385811660248301529151600093929092169163dd62ed3e91604480820192602092909190829003018186803b15801561320557600080fd5b505afa158015613219573d6000803e3d6000fd5b505050506040513d602081101561322f57600080fd5b505190508181101561330157600a546040805163095ea7b360e01b81526001600160a01b03868116600483015260001960248301529151600093929092169163095ea7b39160448082019260209290919082900301818787803b15801561329557600080fd5b505af11580156132a9573d6000803e3d6000fd5b505050506040513d60208110156132bf57600080fd5b50519050806132ff5760405162461bcd60e51b8152600401808060200182810382526041815260200180613e626041913960600191505060405180910390fd5b505b826001600160a01b031663c39bb11d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561334757600080fd5b505af1158015610cee573d6000803e3d6000fd5b846001600160a01b031663cfb9329a826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156133a157600080fd5b505af11580156133b5573d6000803e3d6000fd5b50505050836001600160a01b03166340c10f1984846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561341957600080fd5b505af115801561342d573d6000803e3d6000fd5b505050505050505050565b6001600160a01b038116613493576040805162461bcd60e51b815260206004820152601e60248201527f4163636f756e742063616e6e6f74206265207a65726f20616464726573730000604482015290519081900360640190fd5b803b80612dd6576040805162461bcd60e51b815260206004820181905260248201527f4163636f756e7420636f64652073697a652063616e6e6f74206265207a65726f604482015290519081900360640190fd5b6000811161298e5760405162461bcd60e51b81526004018080602001828103825260378152602001806143766037913960400191505060405180910390fd5b811580613531575080155b612dd65760405162461bcd60e51b8152600401808060200182810382526030815260200180613ea36030913960400191505060405180910390fd5b8215158061357957508115155b8061358357508015155b6107415760405162461bcd60e51b81526004018080602001828103825260468152602001806140206046913960600191505060405180910390fd5b60008083156135d2575082905060016135d6565b8291505b9250929050565b60008060006135f08a8a8a8a8a8a613c12565b915091506000613604838387600d54613099565b9b9a5050505050505050505050565b831561364c5761362283613c6d565b8115613647576136358160e00151613120565b6136478160e001518260c00151613caa565b610b62565b6136598160e00151613167565b613676816020015182606001518360400151858560000151612a9a565b6101008201819052610b6290612b28565b6000610bf8826815af1d78b58c40000063ffffffff61299116565b6136bb826815af1d78b58c40000063ffffffff61299116565b811115612dd65760405162461bcd60e51b81526004018080602001828103825260438152602001806142da6043913960600191505060405180910390fd5b60008060008561379457886001600160a01b031663d3d6f84389896040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561376357600080fd5b505af1158015613777573d6000803e3d6000fd5b505050506040513d602081101561378d57600080fd5b5051613821565b886001600160a01b03166372423c1789896040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156137f457600080fd5b505af1158015613808573d6000803e3d6000fd5b505050506040513d602081101561381e57600080fd5b50515b90506000846138bb57896001600160a01b03166312610e928a886040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561388a57600080fd5b505af115801561389e573d6000803e3d6000fd5b505050506040513d60208110156138b457600080fd5b5051613948565b896001600160a01b0316639976cf458a886040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561391b57600080fd5b505af115801561392f573d6000803e3d6000fd5b505050506040513d602081101561394557600080fd5b50515b919a91995090975050505050505050565b600080600061396c898989898989613c12565b91509150600061397f8383600d546130e5565b9a9950505050505050505050565b81156139a5576139a0888888868561335b565b6139b1565b6139b188888886612b6f565b83156139c6576139c188866131ae565b612c41565b876001600160a01b03166364a197f387876040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015613a2657600080fd5b505af1158015612873573d6000803e3d6000fd5b60008184841115613ac95760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a8e578181015183820152602001613a76565b50505050905090810190601f168015613abb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080613adc610e82565b90506000613ae8610d72565b90506000613af883838888613099565b9695505050505050565b6000613b20836130c786670de0b6b3a764000063ffffffff613b7716565b905081811115610b62576040805162461bcd60e51b815260206004820152601d60248201527f4665652065786365656465642070726f7669646564206d6178696d756d000000604482015290519081900360640190fd5b600082613b8657506000610bf8565b82820282848281613b9357fe5b04146129d35760405162461bcd60e51b81526004018080602001828103825260218152602001806140a26021913960400191505060405180910390fd5b60006129d383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ce9565b600080878786613c3157613c2c8a8963ffffffff61299116565b613c41565b613c418a8963ffffffff612c6616565b915084613c5d57613c58898763ffffffff61299116565b613948565b613948898763ffffffff612c6616565b801561298e5760405162461bcd60e51b815260040180806020018281038252603e81526020018061417a603e913960400191505060405180910390fd5b80821015612dd65760405162461bcd60e51b815260040180806020018281038252603e8152602001806143ad603e913960400191505060405180910390fd5b60008183613d385760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613a8e578181015183820152602001613a76565b506000838581613d4457fe5b0495945050505050565b604080516060810182526000808252602082018190529181019190915290565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101c0016040528060008152602001600081526020016000815260200160001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509056fe426f72726f7765724f70733a20436f6c6c61746572616c207472616e73666572206661696c6564206f6e2061646a75737454726f7665426f72726f7765724f7065726174696f6e733a2043616e6e6f7420617070726f766520416374697665506f6f6c20746f207370656e6420636f6c6c61746572616c426f72726f7765724f7065726174696f6e733a2043616e6e6f7420776974686472617720616e642061646420636f6c6c426f72726f7765724f70733a204f7065726174696f6e206e6f74207065726d697474656420647572696e67205265636f76657279204d6f6465426f72726f7765724f70733a20436f6c6c61746572616c207472616e73666572206661696c6564206f6e206d6f76654554484761696e546f54726f7665426f72726f7765724f70733a20436f6c6c61746572616c207472616e73666572206661696c6564206f6e20616464436f6c6c426f72726f7765724f70733a2054726f76652773206e65742064656274206d757374206265206c657373207468616e2064656274206365696c696e67426f72726f7765724f70733a204f7065726174696f6e206d757374206c656176652074726f7665207769746820494352203e3d204343524d6178206665652070657263656e74616765206d757374206c657373207468616e206f7220657175616c20746f2031303025426f72726f7765724f70733a205468657265206d75737420626520656974686572206120636f6c6c61746572616c206368616e6765206f7220612064656274206368616e6765436f6c6c61746572616c2077697468647261776e20616d6f756e74206d757374206265206c657373207468616e2074726f76652062616c616e63652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77426f72726f7765724f70733a20416e206f7065726174696f6e207468617420776f756c6420726573756c7420696e20544352203c20434352206973206e6f74207065726d69747465644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572426f72726f7765724f70733a2054726f766520646f6573206e6f74206578697374206f7220697320636c6f736564c3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b426f72726f7765724f70733a20436f6c6c61746572616c207769746864726177616c206e6f74207065726d6974746564205265636f76657279204d6f6465426f72726f7765724f70733a20436f6c6c61746572616c207472616e73666572206661696c6564206f6e206f70656e54726f7665426f72726f7765724f70733a2043616c6c657220646f65736e74206861766520656e6f756768204c55534420746f206d616b652072657061796d656e74426f72726f7765724f7065726174696f6e733a204164647265737365732061726520616c72656164792073657421426f72726f7765724f70733a20416e206f7065726174696f6e207468617420776f756c6420726573756c7420696e20494352203c204d4352206973206e6f74207065726d6974746564426f72726f7765724f70733a2054726f76652773206e65742064656274206d7573742062652067726561746572207468616e206d696e696d756d426f72726f7765724f70733a20416d6f756e7420726570616964206d757374206e6f74206265206c6172676572207468616e207468652054726f766527732064656274426f72726f7765724f70733a2043616c6c6572206973206e6f742053746162696c69747920506f6f6c4d6178206665652070657263656e74616765206d757374206265206265747765656e20302e352520616e642031303025426f72726f7765724f70733a204465627420696e637265617365207265717569726573206e6f6e2d7a65726f20646562744368616e6765426f72726f7765724f70733a2043616e6e6f7420646563726561736520796f75722054726f766527732049435220696e205265636f76657279204d6f6465a26469706673582212205f455190268213c9cfd879bd8faae5ed54a0ebe93cc67aea9b7a32faa8933bbb64736f6c634300060b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102ab5760003560e01c8063795d26c311610172578063b4fa3b98116100d9578063cda775f911610092578063cda775f914610658578063d56d6bbe14610660578063d71f779114610694578063dd92690b1461069c578063e091d2fc146106a4578063f92d34331461071e578063fe9d032314610726576102ab565b8063b4fa3b98146105f8578063b5cc996c14610618578063b9186f4314610620578063c17bae2a14610628578063c4dfcaea14610648578063cab8b4fe14610650576102ab565b80638f32d59b1161012b5780638f32d59b146105115780639284af2c1461052d578063a20baee614610376578063a3f4df7e14610553578063aa53099d146105d0578063ae918754146105f0576102ab565b8063795d26c3146104755780637f7dde4a1461047d578063887105d31461048557806389fdcb391461048d5780638da5cb5b146104c95780638f09162b146104d1576102ab565b8063434124e3116102165780635da8b1c3116101cf5780635da8b1c31461040f5780636364a1b9146103665780636f0b0c1c1461045d57806372fe25aa14610376578063741bef1a14610465578063794e57241461046d576102ab565b8063434124e31461039e57806343490056146103a65780634870dd9a146103ae5780634ff81443146103b65780635530273c146103d35780635733d58f14610407576102ab565b80631bf43555116102685780631bf435551461036e578063247aed96146103765780632e86bbd81461037e57806331b8c946146103865780633cc742251461038e5780633d83908a14610396576102ab565b806304491fa7146102b05780630b622ab2146102e65780630e704d501461030a5780631184e5f814610312578063155d47651461034c57806318baf9a414610366575b600080fd5b6102e4600480360360608110156102c657600080fd5b508035906001600160a01b036020820135811691604001351661072e565b005b6102ee610746565b604080516001600160a01b039092168252519081900360200190f35b6102e4610755565b6102e46004803603608081101561032857600080fd5b508035906020810135906001600160a01b0360408201358116916060013516610b50565b610354610b68565b60408051918252519081900360200190f35b610354610b73565b610354610b81565b610354610b8e565b610354610b9a565b6102ee610ba7565b6102ee610bb6565b6102ee610bc5565b610354610bd4565b6102ee610bd9565b610354610be8565b610354600480360360208110156103cc57600080fd5b5035610bed565b6102e4600480360360608110156103e957600080fd5b508035906001600160a01b0360208201358116916040013516610bfe565b610354610c11565b6102e4600480360360e081101561042557600080fd5b5080359060208101359060408101359060608101359060808101351515906001600160a01b0360a082013581169160c0013516610c1d565b6102e4610cf7565b6102ee610d57565b610354610d66565b610354610d72565b6102ee610e73565b610354610e82565b6102e4600480360360808110156104a357600080fd5b506001600160a01b03813581169160208101359160408201358116916060013516610f3e565b6102ee61101a565b6102e4600480360360a08110156104e757600080fd5b508035906020810135906040810135906001600160a01b0360608201358116916080013516611029565b610519611804565b604080519115158252519081900360200190f35b6102e46004803603602081101561054357600080fd5b50356001600160a01b0316611815565b61055b61198f565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561059557818101518382015260200161057d565b50505050905090810190601f1680156105c25780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102e4600480360360208110156105e657600080fd5b503560ff166119bd565b6102ee611a39565b6102e46004803603602081101561060e57600080fd5b503560ff16611a48565b6102ee611aa1565b610354611ab0565b6103546004803603602081101561063e57600080fd5b503560ff16611ab5565b610354611ac7565b610354611b3d565b6102ee611b82565b6102e46004803603606081101561067657600080fd5b508035906001600160a01b0360208201358116916040013516611b91565b610354611c65565b6102ee611c71565b6102e460048036036101608110156106bb57600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a081013582169160c082013581169160e0810135821691610100820135811691610120810135909116906101400135611c80565b610354612103565b6102ee61210e565b610741336000808660008787600061211d565b505050565b6006546001600160a01b031681565b6005546000546009546001600160a01b039283169291821691166107798333612881565b60035460408051630fdb11cf60e01b815290516000926001600160a01b031691630fdb11cf91600480830192602092919082900301818787803b1580156107bf57600080fd5b505af11580156107d3573d6000803e3d6000fd5b505050506040513d60208110156107e957600080fd5b505190506107f681612946565b60408051630b07655760e01b815233600482015290516001600160a01b03861691630b07655791602480830192600092919082900301818387803b15801561083d57600080fd5b505af1158015610851573d6000803e3d6000fd5b5050604080516309019aaf60e31b81523360048201529051600093506001600160a01b038816925063480cd57891602480820192602092909190829003018186803b15801561089f57600080fd5b505afa1580156108b3573d6000803e3d6000fd5b505050506040513d60208110156108c957600080fd5b50516040805163d66a255360e01b815233600482015290519192506000916001600160a01b0388169163d66a2553916024808301926020929190829003018186803b15801561091757600080fd5b505afa15801561092b573d6000803e3d6000fd5b505050506040513d602081101561094157600080fd5b505190506109688433610963846815af1d78b58c40000063ffffffff61299116565b6129da565b600061097983600084600088612a9a565b905061098481612b28565b60408051631fc5750960e31b815233600482015290516001600160a01b0389169163fe2ba84891602480830192600092919082900301818387803b1580156109cb57600080fd5b505af11580156109df573d6000803e3d6000fd5b5050604080516365e89c5760e11b815233600482015290516001600160a01b038b16935063cbd138ae9250602480830192600092919082900301818387803b158015610a2a57600080fd5b505af1158015610a3e573d6000803e3d6000fd5b50505050336001600160a01b031660008051602061415a8339815191526000806000600160405180858152602001848152602001838152602001826002811115610a8457fe5b60ff16815260200194505050505060405180910390a2610abe868633610ab9866815af1d78b58c40000063ffffffff61299116565b612b6f565b600754610ae190879087906001600160a01b03166815af1d78b58c400000612b6f565b604080516364a197f360e01b81523360048201526024810185905290516001600160a01b038816916364a197f391604480830192600092919082900301818387803b158015610b2f57600080fd5b505af1158015610b43573d6000803e3d6000fd5b5050505050505050505050565b610b623360008086600187878b61211d565b50505050565b662386f26fc1000081565b69021e19e0c9bab240000081565b686c6b935b8bbd40000081565b670de0b6b3a764000081565b6815af1d78b58c40000081565b600a546001600160a01b031681565b6002546001600160a01b031681565b6005546001600160a01b031681565b606581565b6009546001600160a01b031681565b60c881565b6000610bf882612c4b565b92915050565b610741336000856000808787600061211d565b6714d1120d7b16000081565b600a54604080516323b872dd60e01b81523360048201523060248201526044810189905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610c7757600080fd5b505af1158015610c8b573d6000803e3d6000fd5b505050506040513d6020811015610ca157600080fd5b5051610cde5760405162461bcd60e51b8152600401808060200182810382526036815260200180613e2c6036913960400191505060405180910390fd5b610cee338787878787878e61211d565b50505050505050565b6008546040805163b32beb5b60e01b815233600482015290516001600160a01b039092169163b32beb5b9160248082019260009290919082900301818387803b158015610d4357600080fd5b505af1158015610b62573d6000803e3d6000fd5b6003546001600160a01b031681565b670f43fc2c04ee000081565b6000805460408051632f5a97e560e11b8152905183926001600160a01b031691635eb52fca916004808301926020929190829003018186803b158015610db757600080fd5b505afa158015610dcb573d6000803e3d6000fd5b505050506040513d6020811015610de157600080fd5b505160025460408051632f5a97e560e11b815290519293506000926001600160a01b0390921691635eb52fca91600480820192602092909190829003018186803b158015610e2e57600080fd5b505afa158015610e42573d6000803e3d6000fd5b505050506040513d6020811015610e5857600080fd5b50519050610e6c828263ffffffff612c6616565b9250505090565b6000546001600160a01b031681565b6000805460408051630a7b61df60e11b8152905183926001600160a01b0316916314f6c3be916004808301926020929190829003018186803b158015610ec757600080fd5b505afa158015610edb573d6000803e3d6000fd5b505050506040513d6020811015610ef157600080fd5b505160025460408051630a7b61df60e11b815290519293506000926001600160a01b03909216916314f6c3be91600480820192602092909190829003018186803b158015610e2e57600080fd5b610f46612cc0565b600a54604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015610fa057600080fd5b505af1158015610fb4573d6000803e3d6000fd5b505050506040513d6020811015610fca57600080fd5b50516110075760405162461bcd60e51b815260040180806020018281038252603d815260200180613f0c603d913960400191505060405180910390fd5b610b62848460008060008787600061211d565b6004546001600160a01b031690565b600a54604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561108357600080fd5b505af1158015611097573d6000803e3d6000fd5b505050506040513d60208110156110ad57600080fd5b50516110ea5760405162461bcd60e51b81526004018080602001828103825260348152602001806141b86034913960400191505060405180910390fd5b6110f2613d4e565b50604080516060810182526005546001600160a01b03908116825260005481166020830152600954169181019190915261112a613d6e565b600360009054906101000a90046001600160a01b03166001600160a01b0316630fdb11cf6040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561117a57600080fd5b505af115801561118e573d6000803e3d6000fd5b505050506040513d60208110156111a457600080fd5b5051808252600d546000916111b891612d0b565b90506111c48882612d2a565b82516111d09033612dda565b6040808301889052835181516394cd4ba760e01b815291516001600160a01b03909116916394cd4ba7916004808301926020929190829003018186803b15801561121957600080fd5b505afa15801561122d573d6000803e3d6000fd5b505050506040513d602081101561124357600080fd5b5051610100830152806112855761126483600001518460400151898b612eb6565b60208301819052604083015161127f9163ffffffff612c6616565b60408301525b6112928260400151613003565b6112ad82604001516112a2610d72565b84610100015161304b565b6112ba8260400151612c4b565b60608301819052611312576040805162461bcd60e51b815260206004820152601e60248201527f44656274206d757374206265206c6172676572207468616e207a65726f2e0000604482015290519081900360640190fd5b6113288683606001518460000151600d54613099565b60808301526060820151600d546113409188916130e5565b60a0830152801561135d576113588260800151613120565b611390565b61136a8260800151613167565b6000611383876001856060015160018760000151612a9a565b905061138e81612b28565b505b825160408051635d6b480f60e01b81523360048201526001602482015290516001600160a01b0390921691635d6b480f9160448082019260009290919082900301818387803b1580156113e257600080fd5b505af11580156113f6573d6000803e3d6000fd5b50508451604080516372423c1760e01b8152336004820152602481018b905290516001600160a01b0390921693506372423c1792506044808201926020929091908290030181600087803b15801561144d57600080fd5b505af1158015611461573d6000803e3d6000fd5b505050506040513d602081101561147757600080fd5b50508251606083015160408051639976cf4560e01b81523360048201526024810192909252516001600160a01b0390921691639976cf45916044808201926020929091908290030181600087803b1580156114d157600080fd5b505af11580156114e5573d6000803e3d6000fd5b505050506040513d60208110156114fb57600080fd5b50508251604080516382fe3eb960e01b815233600482015290516001600160a01b03909216916382fe3eb99160248082019260009290919082900301818387803b15801561154857600080fd5b505af115801561155c573d6000803e3d6000fd5b5050845160408051630c7940bd60e11b815233600482015290516001600160a01b0390921693506318f2817a92506024808201926020929091908290030181600087803b1580156115ac57600080fd5b505af11580156115c0573d6000803e3d6000fd5b505050506040513d60208110156115d657600080fd5b505160c0830152600c5460a0830151604080516346f7cf8760e01b815233600482015260248101929092526001600160a01b038881166044840152878116606484015290519216916346f7cf879160848082019260009290919082900301818387803b15801561164557600080fd5b505af1158015611659573d6000803e3d6000fd5b50508451604080516315d549f160e01b815233600482015290516001600160a01b0390921693506315d549f192506024808201926020929091908290030181600087803b1580156116a957600080fd5b505af11580156116bd573d6000803e3d6000fd5b505050506040513d60208110156116d357600080fd5b505160e08301819052604080519182525133917f59cfd0cd754bc5748b6770e94a4ffa5f678d885cb899dcfadc5734edb97c67ab919081900360200190a261171f8360200151876131ae565b61173883602001518460400151338a866040015161335b565b602083015160408401516007546117649291906001600160a01b03166815af1d78b58c4000008061335b565b336001600160a01b031660008051602061415a8339815191528360600151888560c001516000604051808581526020018481526020018381526020018260028111156117ac57fe5b60ff16815260200194505050505060405180910390a2602080830151604080519182525133927fa55c5f48fd29482ad55f4b59bf070cd1ac1a7132a31f7a136ebe8877ae37e1ff928290030190a25050505050505050565b6004546001600160a01b0316331490565b61181d611804565b61185c576040805162461bcd60e51b8152602060048201819052602482015260008051602061410c833981519152604482015290519081900360640190fd5b60016000819052600f6020527f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f5481148015906118c2575042600f60008360018111156118a557fe5b60018111156118b057fe5b81526020019081526020016000205411155b61190c576040805162461bcd60e51b8152602060048201526016602482015275119d5b98dd1a5bdb881a5cc81d1a5b595b1bd8dad95960521b604482015290519081900360640190fd5b600b80546001600160a01b0384166001600160a01b0319909116811790915560408051918252517f464b3fecfa0a372d7cb418a572e9fedd7e2a099c7a92f6ed351f47e5aa1802739181900360200190a1505060016000819052600f6020527f169f97de0d9a84d840042b17d3c6b9638b3d6fd9024c9eb0c7a306a17b49f88f55565b60405180604001604052806012815260200171426f72726f7765724f7065726174696f6e7360701b81525081565b6119c5611804565b611a04576040805162461bcd60e51b8152602060048201819052602482015260008051602061410c833981519152604482015290519081900360640190fd5b6202a3004201600f6000836001811115611a1a57fe5b6001811115611a2557fe5b815260208101919091526040016000205550565b600c546001600160a01b031681565b611a50611804565b611a8f576040805162461bcd60e51b8152602060048201819052602482015260008051602061410c833981519152604482015290519081900360640190fd5b6001600f6000836001811115611a1a57fe5b600b546001600160a01b031681565b606481565b600f6020526000908152604090205481565b60015460408051630a7b61df60e11b815290516000926001600160a01b0316916314f6c3be916004808301926020929190829003018186803b158015611b0c57600080fd5b505afa158015611b20573d6000803e3d6000fd5b505050506040513d6020811015611b3657600080fd5b5051905090565b60015460408051632f5a97e560e11b815290516000926001600160a01b031691635eb52fca916004808301926020929190829003018186803b158015611b0c57600080fd5b6008546001600160a01b031681565b600a54604080516323b872dd60e01b81523360048201523060248201526044810186905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611beb57600080fd5b505af1158015611bff573d6000803e3d6000fd5b505050506040513d6020811015611c1557600080fd5b5051611c525760405162461bcd60e51b8152600401808060200182810382526032815260200180613f496032913960400191505060405180910390fd5b610741338460008060008787600061211d565b670e043da61725000081565b6001546001600160a01b031681565b611c88611804565b611cc7576040805162461bcd60e51b8152602060048201819052602482015260008051602061410c833981519152604482015290519081900360640190fd5b6000808052600f6020527ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37554600114801590611d2c575042600f6000836001811115611d0f57fe5b6001811115611d1a57fe5b81526020019081526020016000205411155b611d76576040805162461bcd60e51b8152602060048201526016602482015275119d5b98dd1a5bdb881a5cc81d1a5b595b1bd8dad95960521b604482015290519081900360640190fd5b600e5460ff1615611db85760405162461bcd60e51b815260040180806020018281038252602e815260200180614229602e913960400191505060405180910390fd5b600e805460ff19166001179055611dce8c613438565b611dd78b613438565b611de08a613438565b611de989613438565b611df288613438565b611dfb87613438565b611e0486613438565b611e0d85613438565b611e1684613438565b611e1f83613438565b600580546001600160a01b03199081166001600160a01b038f81169182179093556000805483168f85161790556002805483168e85161790556006805483168d85161790556007805483168c85161790556008805483168b85161790556003805483168a8516179055600c80548316898516179055600980548316888516179055600a8054909216928616929092179055600d83905560408051918252517f143219c9e69b09e07e095fcc889b43d8f46ca892bba65f08dc3a0050869a5678916020908290030190a1604080516001600160a01b038d16815290517f78f058b189175430c48dc02699e3a0031ea4ff781536dc2fab847de4babdd8829181900360200190a1604080516001600160a01b038c16815290517f5ee0cae2f063ed938bb55046f6a932fb6ae792bf43624806bb90abe68a50be9b9181900360200190a1604080516001600160a01b038b16815290517f82966d27eea39b038ee0fa30cd16532bb24f6e65d31cb58fb227aa5766cdcc7f9181900360200190a1604080516001600160a01b038a16815290517fcfb07d791fcafc032b35837b50eb84b74df518cf4cc287e8084f47630fa70fa09181900360200190a1604080516001600160a01b038916815290517fe67f36a6e961157d6eff83b91f3af5a62131ceb6f04954ef74f51c1c05e7f88d9181900360200190a1604080516001600160a01b038816815290517f8c537274438aa850a330284665d81a85dd38267d09e4050d416bfc94142db2649181900360200190a1604080516001600160a01b038716815290517f65f4cf077bc01e4742eb5ad98326f6e95b63548ea24b17f8d5e823111fe788009181900360200190a1604080516001600160a01b038516815290517f8adeca1d26ce63eb9fb5b9362155b69fbb631209bfc0dddb3d75d96735eae23b9181900360200190a15050600080525050600f602052505060017ff4803e074bd026baaf6ed2e288c9515f68c72fb7216eebdd7cae1718a53ec37555505050505050565b660e35fa931a000081565b6007546001600160a01b031681565b612125613d4e565b50604080516060810182526005546001600160a01b03908116825260005481166020830152600954169181019190915261215d613dba565b600360009054906101000a90046001600160a01b03166001600160a01b0316630fdb11cf6040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156121ad57600080fd5b505af11580156121c1573d6000803e3d6000fd5b505050506040513d60208110156121d757600080fd5b5051808252600d546000916121eb91612d0b565b90508615612206576121fd8482612d2a565b612206886134e7565b6122108a8a613526565b61221b8a8a8a61356c565b8251612227908c612881565b336001600160a01b038c16148061225d57506006546001600160a01b031633148015612253575060008a115b801561225d575087155b6122ae576040805162461bcd60e51b815260206004820152601a60248201527f41646a7573742074726f766520636865636b206661696c65642e000000000000604482015290519081900360640190fd5b82600001516001600160a01b0316630b0765578c6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561230a57600080fd5b505af115801561231e573d6000803e3d6000fd5b5050505061232c8a8a6135be565b151560608401526020808401919091528351604080516394cd4ba760e01b815290516001600160a01b03909216926394cd4ba792600480840193829003018186803b15801561237a57600080fd5b505afa15801561238e573d6000803e3d6000fd5b505050506040513d60208110156123a457600080fd5b50516101a0830152604082018890528680156123be575080155b15612411576123d7836000015184604001518a87612eb6565b610120830181905260408301516123f39163ffffffff612c6616565b6040830181905261241190612406610d72565b846101a0015161304b565b82600001516001600160a01b031663d66a25538c6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b15801561246b57600080fd5b505afa15801561247f573d6000803e3d6000fd5b505050506040513d602081101561249557600080fd5b505160808301528251604080516309019aaf60e31b81526001600160a01b038e811660048301529151919092169163480cd578916024808301926020929190829003018186803b1580156124e857600080fd5b505afa1580156124fc573d6000803e3d6000fd5b505050506040513d602081101561251257600080fd5b505160a0830181905260808301518351600d5461253193929190613099565b8260c00181815250506125618260a0015183608001518460200151856060015186604001518c88600001516135dd565b60e083015260a08201518911156125a95760405162461bcd60e51b815260040180806020018281038252603c815260200180614066603c913960400191505060405180910390fd5b6125b5818a8985613613565b861580156125c35750600088115b15612616576125f16125ec83604001516125e08560800151613687565b9063ffffffff61299116565b613003565b612603826080015183604001516136a2565b61261683604001518c84604001516129da565b61263483600001518c8460200151856060015186604001518c6136f9565b610140840152610160830152825160408051630c7940bd60e11b81526001600160a01b038e81166004830152915191909216916318f2817a9160248083019260209291908290030181600087803b15801561268e57600080fd5b505af11580156126a2573d6000803e3d6000fd5b505050506040513d60208110156126b857600080fd5b505161018083015260a082015160808301516020840151606085015160408601516000946126ec949093909290918d613959565b9050600c60009054906101000a90046001600160a01b03166001600160a01b0316632be212608d838a8a6040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001848152602001836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b03168152602001945050505050600060405180830381600087803b15801561279757600080fd5b505af11580156127ab573d6000803e3d6000fd5b505050508b6001600160a01b031660008051602061415a8339815191528461014001518561016001518661018001516002604051808581526020018481526020018381526020018260028111156127fe57fe5b60ff16815260200194505050505060405180910390a2610120830151604080519182525133917fa55c5f48fd29482ad55f4b59bf070cd1ac1a7132a31f7a136ebe8877ae37e1ff919081900360200190a26128738460200151856040015133866020015187606001518e8e8a6040015161398d565b505050505050505050505050565b6000826001600160a01b03166321e37801836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156128d957600080fd5b505afa1580156128ed573d6000803e3d6000fd5b505050506040513d602081101561290357600080fd5b50519050600181146107415760405162461bcd60e51b815260040180806020018281038252602e81526020018061412c602e913960400191505060405180910390fd5b61295281600d54612d0b565b1561298e5760405162461bcd60e51b8152600401808060200182810382526039815260200180613ed36039913960400191505060405180910390fd5b50565b60006129d383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a3a565b9392505050565b80836001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612a3157600080fd5b505afa158015612a45573d6000803e3d6000fd5b505050506040513d6020811015612a5b57600080fd5b505110156107415760405162461bcd60e51b815260040180806020018281038252603d8152602001806141ec603d913960400191505060405180910390fd5b600080612aa5610e82565b90506000612ab1610d72565b905086612acd57612ac8828963ffffffff61299116565b612add565b612add828963ffffffff612c6616565b915084612af957612af4818763ffffffff61299116565b612b09565b612b09818763ffffffff612c6616565b90506000612b1b838387600d54613099565b9998505050505050505050565b6714d1120d7b16000081101561298e5760405162461bcd60e51b81526004018080602001828103825260498152602001806140c36049913960600191505060405180910390fd5b836001600160a01b03166338d995a8826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612bb557600080fd5b505af1158015612bc9573d6000803e3d6000fd5b50505050826001600160a01b0316639dc29fac83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612c2d57600080fd5b505af1158015612c41573d6000803e3d6000fd5b5050505050505050565b6000610bf8826815af1d78b58c40000063ffffffff612c6616565b6000828201838110156129d3576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6006546001600160a01b03163314612d095760405162461bcd60e51b815260040180806020018281038252602981526020018061431d6029913960400191505060405180910390fd5b565b600080612d188484613ad1565b6714d1120d7b16000011949350505050565b8015612d7c57670de0b6b3a7640000821115612d775760405162461bcd60e51b8152600401808060200182810382526032815260200180613fee6032913960400191505060405180910390fd5b612dd6565b660e35fa931a00008210801590612d9b5750670de0b6b3a76400008211155b612dd65760405162461bcd60e51b81526004018080602001828103825260308152602001806143466030913960400191505060405180910390fd5b5050565b6000826001600160a01b03166321e37801836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612e3257600080fd5b505afa158015612e46573d6000803e3d6000fd5b505050506040513d6020811015612e5c57600080fd5b505190506001811415610741576040805162461bcd60e51b815260206004820152601c60248201527f426f72726f7765724f70733a2054726f76652069732061637469766500000000604482015290519081900360640190fd5b6000846001600160a01b0316635dba4c4a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612ef357600080fd5b505af1158015612f07573d6000803e3d6000fd5b505050506000856001600160a01b031663631203b0856040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015612f5157600080fd5b505afa158015612f65573d6000803e3d6000fd5b505050506040513d6020811015612f7b57600080fd5b50519050612f8a818585613b02565b600b54604080516340c10f1960e01b81526001600160a01b039283166004820152602481018490529051918716916340c10f199160448082019260009290919082900301818387803b158015612fdf57600080fd5b505af1158015612ff3573d6000803e3d6000fd5b509293505050505b949350505050565b686c6b935b8bbd40000081101561298e5760405162461bcd60e51b815260040180806020018281038252603a8152602001806142a0603a913960400191505060405180910390fd5b8061305c848463ffffffff612c6616565b11156107415760405162461bcd60e51b815260040180806020018281038252603c815260200180613f7b603c913960400191505060405180910390fd5b600083156130dc5760006130d3856130c7866130bb8a8863ffffffff613b7716565b9063ffffffff613b7716565b9063ffffffff613bd016565b9150612ffb9050565b50600019612ffb565b600082156131155761310e836130c768056bc75e2d631000006130bb888763ffffffff613b7716565b90506129d3565b506000199392505050565b6714d1120d7b16000081101561298e5760405162461bcd60e51b8152600401808060200182810382526037815260200180613fb76037913960400191505060405180910390fd5b670f43fc2c04ee000081101561298e5760405162461bcd60e51b81526004018080602001828103825260498152602001806142576049913960600191505060405180910390fd5b600a5460408051636eb1769f60e11b81523060048201526001600160a01b0385811660248301529151600093929092169163dd62ed3e91604480820192602092909190829003018186803b15801561320557600080fd5b505afa158015613219573d6000803e3d6000fd5b505050506040513d602081101561322f57600080fd5b505190508181101561330157600a546040805163095ea7b360e01b81526001600160a01b03868116600483015260001960248301529151600093929092169163095ea7b39160448082019260209290919082900301818787803b15801561329557600080fd5b505af11580156132a9573d6000803e3d6000fd5b505050506040513d60208110156132bf57600080fd5b50519050806132ff5760405162461bcd60e51b8152600401808060200182810382526041815260200180613e626041913960600191505060405180910390fd5b505b826001600160a01b031663c39bb11d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561334757600080fd5b505af1158015610cee573d6000803e3d6000fd5b846001600160a01b031663cfb9329a826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156133a157600080fd5b505af11580156133b5573d6000803e3d6000fd5b50505050836001600160a01b03166340c10f1984846040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561341957600080fd5b505af115801561342d573d6000803e3d6000fd5b505050505050505050565b6001600160a01b038116613493576040805162461bcd60e51b815260206004820152601e60248201527f4163636f756e742063616e6e6f74206265207a65726f20616464726573730000604482015290519081900360640190fd5b803b80612dd6576040805162461bcd60e51b815260206004820181905260248201527f4163636f756e7420636f64652073697a652063616e6e6f74206265207a65726f604482015290519081900360640190fd5b6000811161298e5760405162461bcd60e51b81526004018080602001828103825260378152602001806143766037913960400191505060405180910390fd5b811580613531575080155b612dd65760405162461bcd60e51b8152600401808060200182810382526030815260200180613ea36030913960400191505060405180910390fd5b8215158061357957508115155b8061358357508015155b6107415760405162461bcd60e51b81526004018080602001828103825260468152602001806140206046913960600191505060405180910390fd5b60008083156135d2575082905060016135d6565b8291505b9250929050565b60008060006135f08a8a8a8a8a8a613c12565b915091506000613604838387600d54613099565b9b9a5050505050505050505050565b831561364c5761362283613c6d565b8115613647576136358160e00151613120565b6136478160e001518260c00151613caa565b610b62565b6136598160e00151613167565b613676816020015182606001518360400151858560000151612a9a565b6101008201819052610b6290612b28565b6000610bf8826815af1d78b58c40000063ffffffff61299116565b6136bb826815af1d78b58c40000063ffffffff61299116565b811115612dd65760405162461bcd60e51b81526004018080602001828103825260438152602001806142da6043913960600191505060405180910390fd5b60008060008561379457886001600160a01b031663d3d6f84389896040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561376357600080fd5b505af1158015613777573d6000803e3d6000fd5b505050506040513d602081101561378d57600080fd5b5051613821565b886001600160a01b03166372423c1789896040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156137f457600080fd5b505af1158015613808573d6000803e3d6000fd5b505050506040513d602081101561381e57600080fd5b50515b90506000846138bb57896001600160a01b03166312610e928a886040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561388a57600080fd5b505af115801561389e573d6000803e3d6000fd5b505050506040513d60208110156138b457600080fd5b5051613948565b896001600160a01b0316639976cf458a886040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561391b57600080fd5b505af115801561392f573d6000803e3d6000fd5b505050506040513d602081101561394557600080fd5b50515b919a91995090975050505050505050565b600080600061396c898989898989613c12565b91509150600061397f8383600d546130e5565b9a9950505050505050505050565b81156139a5576139a0888888868561335b565b6139b1565b6139b188888886612b6f565b83156139c6576139c188866131ae565b612c41565b876001600160a01b03166364a197f387876040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015613a2657600080fd5b505af1158015612873573d6000803e3d6000fd5b60008184841115613ac95760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a8e578181015183820152602001613a76565b50505050905090810190601f168015613abb5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080613adc610e82565b90506000613ae8610d72565b90506000613af883838888613099565b9695505050505050565b6000613b20836130c786670de0b6b3a764000063ffffffff613b7716565b905081811115610b62576040805162461bcd60e51b815260206004820152601d60248201527f4665652065786365656465642070726f7669646564206d6178696d756d000000604482015290519081900360640190fd5b600082613b8657506000610bf8565b82820282848281613b9357fe5b04146129d35760405162461bcd60e51b81526004018080602001828103825260218152602001806140a26021913960400191505060405180910390fd5b60006129d383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613ce9565b600080878786613c3157613c2c8a8963ffffffff61299116565b613c41565b613c418a8963ffffffff612c6616565b915084613c5d57613c58898763ffffffff61299116565b613948565b613948898763ffffffff612c6616565b801561298e5760405162461bcd60e51b815260040180806020018281038252603e81526020018061417a603e913960400191505060405180910390fd5b80821015612dd65760405162461bcd60e51b815260040180806020018281038252603e8152602001806143ad603e913960400191505060405180910390fd5b60008183613d385760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315613a8e578181015183820152602001613a76565b506000838581613d4457fe5b0495945050505050565b604080516060810182526000808252602082018190529181019190915290565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101c0016040528060008152602001600081526020016000815260200160001515815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509056fe426f72726f7765724f70733a20436f6c6c61746572616c207472616e73666572206661696c6564206f6e2061646a75737454726f7665426f72726f7765724f7065726174696f6e733a2043616e6e6f7420617070726f766520416374697665506f6f6c20746f207370656e6420636f6c6c61746572616c426f72726f7765724f7065726174696f6e733a2043616e6e6f7420776974686472617720616e642061646420636f6c6c426f72726f7765724f70733a204f7065726174696f6e206e6f74207065726d697474656420647572696e67205265636f76657279204d6f6465426f72726f7765724f70733a20436f6c6c61746572616c207472616e73666572206661696c6564206f6e206d6f76654554484761696e546f54726f7665426f72726f7765724f70733a20436f6c6c61746572616c207472616e73666572206661696c6564206f6e20616464436f6c6c426f72726f7765724f70733a2054726f76652773206e65742064656274206d757374206265206c657373207468616e2064656274206365696c696e67426f72726f7765724f70733a204f7065726174696f6e206d757374206c656176652074726f7665207769746820494352203e3d204343524d6178206665652070657263656e74616765206d757374206c657373207468616e206f7220657175616c20746f2031303025426f72726f7765724f70733a205468657265206d75737420626520656974686572206120636f6c6c61746572616c206368616e6765206f7220612064656274206368616e6765436f6c6c61746572616c2077697468647261776e20616d6f756e74206d757374206265206c657373207468616e2074726f76652062616c616e63652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77426f72726f7765724f70733a20416e206f7065726174696f6e207468617420776f756c6420726573756c7420696e20544352203c20434352206973206e6f74207065726d69747465644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572426f72726f7765724f70733a2054726f766520646f6573206e6f74206578697374206f7220697320636c6f736564c3770d654ed33aeea6bf11ac8ef05d02a6a04ed4686dd2f624d853bbec43cc8b426f72726f7765724f70733a20436f6c6c61746572616c207769746864726177616c206e6f74207065726d6974746564205265636f76657279204d6f6465426f72726f7765724f70733a20436f6c6c61746572616c207472616e73666572206661696c6564206f6e206f70656e54726f7665426f72726f7765724f70733a2043616c6c657220646f65736e74206861766520656e6f756768204c55534420746f206d616b652072657061796d656e74426f72726f7765724f7065726174696f6e733a204164647265737365732061726520616c72656164792073657421426f72726f7765724f70733a20416e206f7065726174696f6e207468617420776f756c6420726573756c7420696e20494352203c204d4352206973206e6f74207065726d6974746564426f72726f7765724f70733a2054726f76652773206e65742064656274206d7573742062652067726561746572207468616e206d696e696d756d426f72726f7765724f70733a20416d6f756e7420726570616964206d757374206e6f74206265206c6172676572207468616e207468652054726f766527732064656274426f72726f7765724f70733a2043616c6c6572206973206e6f742053746162696c69747920506f6f6c4d6178206665652070657263656e74616765206d757374206265206265747765656e20302e352520616e642031303025426f72726f7765724f70733a204465627420696e637265617365207265717569726573206e6f6e2d7a65726f20646562744368616e6765426f72726f7765724f70733a2043616e6e6f7420646563726561736520796f75722054726f766527732049435220696e205265636f76657279204d6f6465a26469706673582212205f455190268213c9cfd879bd8faae5ed54a0ebe93cc67aea9b7a32faa8933bbb64736f6c634300060b0033
Deployed Bytecode Sourcemap
127214:31035:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;138788:191;;;;;;;;;;;;;;;;-1:-1:-1;138788:191:0;;;-1:-1:-1;;;;;138788:191:0;;;;;;;;;;;;:::i;:::-;;127460:35;;;:::i;:::-;;;;-1:-1:-1;;;;;127460:35:0;;;;;;;;;;;;;;144369:1381;;;:::i;138440:233::-;;;;;;;;;;;;;;;;-1:-1:-1;138440:233:0;;;;;;;;-1:-1:-1;;;;;138440:233:0;;;;;;;;;;;;:::i;121460:73::-;;;:::i;:::-;;;;;;;;;;;;;;;;121872:64;;;:::i;121325:43::-;;;:::i;120878:47::-;;;:::i;121207:51::-;;;:::i;127624:23::-;;;:::i;122141:31::-;;;:::i;127418:33::-;;;:::i;121636:64::-;;;:::i;127590:27::-;;;:::i;121378:42::-;;;:::i;158120:126::-;;;;;;;;;;;;;;;;-1:-1:-1;158120:126:0;;:::i;138110:202::-;;;;;;;;;;;;;;;;-1:-1:-1;138110:202:0;;;-1:-1:-1;;;;;138110:202:0;;;;;;;;;;;;:::i;121078:46::-;;;:::i;138987:532::-;;;;;;;;;;;;;;;;-1:-1:-1;138987:532:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;138987:532:0;;;;;;;;;;;;:::i;145883:153::-;;;:::i;122181:36::-;;;:::i;120749:46::-;;;:::i;123243:219::-;;;:::i;122047:29::-;;;:::i;122891:217::-;;;:::i;137587:470::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;137587:470:0;;;;;;;;;;;;;;;;;;;;;;:::i;125452:79::-;;;:::i;133567:3496::-;;;;;;;;;;;;;;;;-1:-1:-1;133567:3496:0;;;;;;;;;;;;;-1:-1:-1;;;;;133567:3496:0;;;;;;;;;;;;:::i;125818:92::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;133169:342;;;;;;;;;;;;;;;;-1:-1:-1;133169:342:0;-1:-1:-1;;;;;133169:342:0;;:::i;127309:50::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;130376:118;;;;;;;;;;;;;;;;-1:-1:-1;130376:118:0;;;;:::i;127777:33::-;;;:::i;130521:90::-;;;;;;;;;;;;;;;;-1:-1:-1;130521:90:0;;;;:::i;127656:38::-;;;:::i;121709:63::-;;;:::i;129073:45::-;;;;;;;;;;;;;;;;-1:-1:-1;129073:45:0;;;;:::i;123116:119::-;;;:::i;123470:124::-;;;:::i;127542:39::-;;;:::i;137113:388::-;;;;;;;;;;;;;;;;-1:-1:-1;137113:388:0;;;-1:-1:-1;;;;;137113:388:0;;;;;;;;;;;;:::i;121548:71::-;;;:::i;122083:49::-;;;:::i;130656:2505::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;130656:2505:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;121959:71::-;;;:::i;127504:29::-;;;:::i;138788:191::-;138894:77;138907:10;138919:1;138922;138925:11;138938:5;138945:10;138957;138969:1;138894:12;:77::i;:::-;138788:191;;;:::o;127460:35::-;;;-1:-1:-1;;;;;127460:35:0;;:::o;144369:1381::-;144455:12;;144420:32;144509:10;144559:9;;-1:-1:-1;;;;;144455:12:0;;;;144509:10;;;;144559:9;144581:53;144455:12;144623:10;144581:21;:53::i;:::-;144658:9;;:22;;;-1:-1:-1;;;144658:22:0;;;;144645:10;;-1:-1:-1;;;;;144658:9:0;;:20;;:22;;;;;;;;;;;;;;144645:10;144658:9;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;144658:22:0;;-1:-1:-1;144691:32:0;144658:22;144691:25;:32::i;:::-;144736:50;;;-1:-1:-1;;;144736:50:0;;144775:10;144736:50;;;;;;-1:-1:-1;;;;;144736:38:0;;;;;:50;;;;;-1:-1:-1;;144736:50:0;;;;;;;-1:-1:-1;144736:38:0;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;144811:43:0;;;-1:-1:-1;;;144811:43:0;;144843:10;144811:43;;;;;;144799:9;;-1:-1:-1;;;;;;144811:31:0;;;-1:-1:-1;144811:31:0;;:43;;;;;;;;;;;;;;;:31;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;144811:43:0;144877;;;-1:-1:-1;;;144877:43:0;;144909:10;144877:43;;;;;;144811;;-1:-1:-1;144865:9:0;;-1:-1:-1;;;;;144877:31:0;;;;;:43;;;;;144811;;144877;;;;;;;:31;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;144877:43:0;;-1:-1:-1;144933:91:0;144963:15;144980:10;144992:31;144877:43;121252:6;144992:31;:8;:31;:::i;:::-;144933:29;:91::i;:::-;145037:11;145051:58;145077:4;145083:5;145090:4;145096:5;145103;145051:25;:58::i;:::-;145037:72;;145120:32;145145:6;145120:24;:32::i;:::-;145165:42;;;-1:-1:-1;;;145165:42:0;;145196:10;145165:42;;;;;;-1:-1:-1;;;;;145165:30:0;;;;;:42;;;;;-1:-1:-1;;145165:42:0;;;;;;;-1:-1:-1;145165:30:0;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;145218:41:0;;;-1:-1:-1;;;145218:41:0;;145248:10;145218:41;;;;;;-1:-1:-1;;;;;145218:29:0;;;-1:-1:-1;145218:29:0;;-1:-1:-1;145218:41:0;;;;;-1:-1:-1;;145218:41:0;;;;;;;-1:-1:-1;145218:29:0;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;145290:10;-1:-1:-1;;;;;145277:63:0;-1:-1:-1;;;;;;;;;;;145302:1:0;145305;145308;145311:28;145277:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;145453:90;145464:16;145482:15;145499:10;145511:31;:4;121252:6;145511:31;:8;:31;:::i;:::-;145453:10;:90::i;:::-;145600:14;;145554:84;;145565:16;;145583:15;;-1:-1:-1;;;;;145600:14:0;121252:6;145554:10;:84::i;:::-;145700:42;;;-1:-1:-1;;;145700:42:0;;145725:10;145700:42;;;;;;;;;;;;-1:-1:-1;;;;;145700:24:0;;;;;:42;;;;;-1:-1:-1;;145700:42:0;;;;;;;-1:-1:-1;145700:24:0;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;144369:1381;;;;;;;:::o;138440:233::-;138573:92;138586:10;138598:1;138601;138604:11;138617:4;138623:10;138635;138647:17;138573:12;:92::i;:::-;138440:233;;;;:::o;121460:73::-;121510:23;121460:73;:::o;121872:64::-;121913:23;121872:64;:::o;121325:43::-;121361:7;121325:43;:::o;120878:47::-;120906:19;120878:47;:::o;121207:51::-;121252:6;121207:51;:::o;127624:23::-;;;-1:-1:-1;;;;;127624:23:0;;:::o;122141:31::-;;;-1:-1:-1;;;;;122141:31:0;;:::o;127418:33::-;;;-1:-1:-1;;;;;127418:33:0;;:::o;121636:64::-;121697:3;121636:64;:::o;127590:27::-;;;-1:-1:-1;;;;;127590:27:0;;:::o;121378:42::-;121417:3;121378:42;:::o;158120:126::-;158190:4;158214:24;158232:5;158214:17;:24::i;:::-;158207:31;158120:126;-1:-1:-1;;158120:126:0:o;138110:202::-;138223:81;138236:10;138248:1;138251:15;138268:1;138271:5;138278:10;138290;138302:1;138223:12;:81::i;121078:46::-;121105:19;121078:46;:::o;138987:532::-;139250:9;;:62;;;-1:-1:-1;;;139250:62:0;;139273:10;139250:62;;;;139293:4;139250:62;;;;;;;;;;;;-1:-1:-1;;;;;139250:9:0;;;;:22;;:62;;;;;;;;;;;;;;;:9;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;139250:62:0;139242:129;;;;-1:-1:-1;;;139242:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;139384:127;139397:10;139409:11;139422:15;139439:11;139452:15;139469:10;139481;139493:17;139384:12;:127::i;:::-;138987:532;;;;;;;:::o;145883:153::-;145991:15;;:37;;;-1:-1:-1;;;145991:37:0;;146017:10;145991:37;;;;;;-1:-1:-1;;;;;145991:15:0;;;;:25;;:37;;;;;:15;;:37;;;;;;;;:15;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;122181:36;;;-1:-1:-1;;;;;122181:36:0;;:::o;120749:46::-;120776:19;120749:46;:::o;123243:219::-;123295:4;123330:10;;:24;;;-1:-1:-1;;;123330:24:0;;;;123295:4;;-1:-1:-1;;;;;123330:10:0;;:22;;:24;;;;;;;;;;;;;;:10;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;123330:24:0;123383:11;;:25;;;-1:-1:-1;;;123383:25:0;;;;123330:24;;-1:-1:-1;123365:15:0;;-1:-1:-1;;;;;123383:11:0;;;;:23;;:25;;;;;123330:24;;123383:25;;;;;;;;:11;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;123383:25:0;;-1:-1:-1;123428:26:0;:10;123383:25;123428:26;:14;:26;:::i;:::-;123421:33;;;;123243:219;:::o;122047:29::-;;;-1:-1:-1;;;;;122047:29:0;;:::o;122891:217::-;122943:4;122978:10;;:19;;;-1:-1:-1;;;122978:19:0;;;;122943:4;;-1:-1:-1;;;;;122978:10:0;;:17;;:19;;;;;;;;;;;;;;:10;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;122978:19:0;123030:11;;:20;;;-1:-1:-1;;;123030:20:0;;;;122978:19;;-1:-1:-1;123008:19:0;;-1:-1:-1;;;;;123030:11:0;;;;:18;;:20;;;;;122978:19;;123030:20;;;;;;;;:11;:20;;;;;;;;;;137587:470;137721:31;:29;:31::i;:::-;137832:9;;:62;;;-1:-1:-1;;;137832:62:0;;137855:10;137832:62;;;;137875:4;137832:62;;;;;;;;;;;;-1:-1:-1;;;;;137832:9:0;;;;:22;;:62;;;;;;;;;;;;;;;:9;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;137832:62:0;137824:136;;;;-1:-1:-1;;;137824:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;137973:76;137986:9;137997:11;138010:1;138013;138016:5;138023:10;138035;138047:1;137973:12;:76::i;125452:79::-;125517:6;;-1:-1:-1;;;;;125517:6:0;125452:79;:::o;133567:3496::-;133784:9;;:62;;;-1:-1:-1;;;133784:62:0;;133807:10;133784:62;;;;133827:4;133784:62;;;;;;;;;;;;-1:-1:-1;;;;;133784:9:0;;;;:22;;:62;;;;;;;;;;;;;;;:9;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;133784:62:0;133776:127;;;;-1:-1:-1;;;133776:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;133916:36;;:::i;:::-;-1:-1:-1;133955:51:0;;;;;;;;133970:12;;-1:-1:-1;;;;;133970:12:0;;;133955:51;;-1:-1:-1;133984:10:0;;;133955:51;;;;133996:9;;;133955:51;;;;;;;134017:36;;:::i;:::-;134079:9;;;;;;;;;-1:-1:-1;;;;;134079:9:0;-1:-1:-1;;;;;134079:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;134079:22:0;134066:35;;;134165:22;;134066:10;;134134:54;;:18;:54::i;:::-;134112:76;;134201:64;134231:17;134250:14;134201:29;:64::i;:::-;134301:27;;134276:65;;134330:10;134276:24;:65::i;:::-;134377:12;;;;:26;;;134433:27;;:44;;-1:-1:-1;;;134433:44:0;;;;-1:-1:-1;;;;;134433:42:0;;;;;;:44;;;;;134354:12;;134433:44;;;;;;;:42;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;134433:44:0;134414:16;;;:63;134495:14;134490:230;;134541:107;134562:14;:27;;;134591:14;:24;;;134617:11;134630:17;134541:20;:107::i;:::-;134526:12;;;:122;;;134678:12;;;;:30;;;:16;:30;:::i;:::-;134663:12;;;:45;134490:230;134730:39;134756:4;:12;;;134730:25;:39::i;:::-;134780:93;134819:4;:12;;;134833:21;:19;:21::i;:::-;134856:4;:16;;;134780:38;:93::i;:::-;135035:31;135053:4;:12;;;135035:17;:31::i;:::-;135014:18;;;:52;;;135077:65;;;;;-1:-1:-1;;;135077:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;135174:91;135197:11;135210:4;:18;;;135230:4;:10;;;135242:22;;135174;:91::i;:::-;135163:8;;;:102;135331:18;;;;135351:22;;135288:86;;135318:11;;135288:29;:86::i;:::-;135276:9;;;:98;135387:341;;;;135422:31;135444:4;:8;;;135422:21;:31::i;:::-;135387:341;;;135486:31;135508:4;:8;;;135486:21;:31::i;:::-;135532:11;135546:82;135572:11;135585:4;135591;:18;;;135611:4;135617;:10;;;135546:25;:82::i;:::-;135532:96;;135683:32;135708:6;135683:24;:32::i;:::-;135387:341;;135786:27;;:57;;;-1:-1:-1;;;135786:57:0;;135829:10;135786:57;;;;135841:1;135786:57;;;;;;-1:-1:-1;;;;;135786:42:0;;;;;;:57;;;;;:27;;:57;;;;;;;;:27;:42;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;135854:27:0;;:70;;;-1:-1:-1;;;135854:70:0;;135900:10;135854:70;;;;;;;;;;;;-1:-1:-1;;;;;135854:45:0;;;;-1:-1:-1;135854:45:0;;-1:-1:-1;135854:70:0;;;;;;;;;;;;;;;:27;:45;:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;135935:27:0;;135993:18;;;;135935:77;;;-1:-1:-1;;;135935:77:0;;135981:10;135935:77;;;;;;;;;;;;-1:-1:-1;;;;;135935:45:0;;;;;;:77;;;;;135854:70;;135935:77;;;;;;;;:27;:45;:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;136025:27:0;;:66;;;-1:-1:-1;;;136025:66:0;;136080:10;136025:66;;;;;;-1:-1:-1;;;;;136025:54:0;;;;;;:66;;;;;:27;;:66;;;;;;;;:27;:54;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;136115:27:0;;:65;;;-1:-1:-1;;;136115:65:0;;136169:10;136115:65;;;;;;-1:-1:-1;;;;;136115:53:0;;;;-1:-1:-1;136115:53:0;;-1:-1:-1;136115:65:0;;;;;;;;;;;;;;;:27;:53;:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;136115:65:0;136102:10;;;:78;136193:12;;136225:9;;;;136193:66;;;-1:-1:-1;;;136193:66:0;;136213:10;136193:66;;;;;;;;;;;-1:-1:-1;;;;;136193:66:0;;;;;;;;;;;;;;;;:12;;;:19;;:66;;;;;:12;;:66;;;;;;;;:12;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;136288:27:0;;:60;;;-1:-1:-1;;;136288:60:0;;136337:10;136288:60;;;;;;-1:-1:-1;;;;;136288:48:0;;;;-1:-1:-1;136288:48:0;;-1:-1:-1;136288:60:0;;;;;;;;;;;;;;;:27;:48;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;136288:60:0;136270:15;;;:78;;;136364:41;;;;;;;136377:10;;136364:41;;;;;;136288:60;136364:41;;;136505:58;136524:14;:25;;;136551:11;136505:18;:58::i;:::-;136574:105;136588:14;:25;;;136615:14;:24;;;136641:10;136653:11;136666:4;:12;;;136574:13;:105::i;:::-;136763:25;;;;136790:24;;;;136816:14;;136749:128;;136763:25;136790:24;-1:-1:-1;;;;;136816:14:0;121252:6;;136749:13;:128::i;:::-;136908:10;-1:-1:-1;;;;;136895:98:0;-1:-1:-1;;;;;;;;;;;136920:4:0;:18;;;136940:11;136953:4;:10;;;136965:27;136895:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;137042:12;;;;;137009:46;;;;;;;137030:10;;137009:46;;;;;;;;133567:3496;;;;;;;;:::o;125818:92::-;125896:6;;-1:-1:-1;;;;;125896:6:0;125882:10;:20;;125818:92::o;133169:342::-;125664:9;:7;:9::i;:::-;125656:54;;;;;-1:-1:-1;;;125656:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;125656:54:0;;;;;;;;;;;;;;;133277:32:::1;130227:13;::::0;;;:8:::1;:13;::::0;;;:18;::::1;::::0;::::1;::::0;:54:::1;;;130266:15;130249:8;:13;130258:3;130249:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;130227:54;130209:118;;;::::0;;-1:-1:-1;;;130209:118:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;130209:118:0;;;;;;;;;;;;;::::1;;133322:23:::2;:50:::0;;-1:-1:-1;;;;;133322:50:0;::::2;-1:-1:-1::0;;;;;;133322:50:0;;::::2;::::0;::::2;::::0;;;133390:56:::2;::::0;;;;;;::::2;::::0;;;;::::2;::::0;;::::2;-1:-1:-1::0;;133502:1:0::2;133457:42;::::0;;;:8:::2;:42;::::0;;:46;133169:342::o;127309:50::-;;;;;;;;;;;;;;-1:-1:-1;;;127309:50:0;;;;:::o;130376:118::-;125664:9;:7;:9::i;:::-;125656:54;;;;;-1:-1:-1;;;125656:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;125656:54:0;;;;;;;;;;;;;;;129060:6:::1;130459:15;:27;130443:8;:13;130452:3;130443:13;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;130443:13:0;:43;-1:-1:-1;130376:118:0:o;127777:33::-;;;-1:-1:-1;;;;;127777:33:0;;:::o;130521:90::-;125664:9;:7;:9::i;:::-;125656:54;;;;;-1:-1:-1;;;125656:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;125656:54:0;;;;;;;;;;;;;;;130602:1:::1;130586:8;:13;130595:3;130586:13;;;;;;;127656:38:::0;;;-1:-1:-1;;;;;127656:38:0;;:::o;121709:63::-;121769:3;121709:63;:::o;129073:45::-;;;;;;;;;;;;;:::o;123116:119::-;123198:20;;:29;;;-1:-1:-1;;;123198:29:0;;;;123174:4;;-1:-1:-1;;;;;123198:20:0;;:27;;:29;;;;;;;;;;;;;;:20;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;123198:29:0;;-1:-1:-1;123116:119:0;:::o;123470:124::-;123552:20;;:34;;;-1:-1:-1;;;123552:34:0;;;;123528:4;;-1:-1:-1;;;;;123552:20:0;;:32;;:34;;;;;;;;;;;;;;:20;:34;;;;;;;;;;127542:39;;;-1:-1:-1;;;;;127542:39:0;;:::o;137113:388::-;137286:9;;:62;;;-1:-1:-1;;;137286:62:0;;137309:10;137286:62;;;;137329:4;137286:62;;;;;;;;;;;;-1:-1:-1;;;;;137286:9:0;;;;:22;;:62;;;;;;;;;;;;;;;:9;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;137286:62:0;137278:125;;;;-1:-1:-1;;;137278:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;137416:77;137429:10;137441:11;137454:1;137457;137460:5;137467:10;137479;137491:1;137416:12;:77::i;121548:71::-;121600:19;121548:71;:::o;122083:49::-;;;-1:-1:-1;;;;;122083:49:0;;:::o;130656:2505::-;125664:9;:7;:9::i;:::-;125656:54;;;;;-1:-1:-1;;;125656:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;125656:54:0;;;;;;;;;;;;;;;131173:21:::1;130227:13:::0;;;:8:::1;:13;::::0;;;130244:1:::1;130227:18;::::0;::::1;::::0;:54:::1;;;130266:15;130249:8;:13;130258:3;130249:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;:32;;130227:54;130209:118;;;::::0;;-1:-1:-1;;;130209:118:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;130209:118:0;;;;;;;;;;;;;::::1;;131221:14:::2;::::0;::::2;;131220:15;131212:74;;;;-1:-1:-1::0;;;131212:74:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;131297:14;:21:::0;;-1:-1:-1;;131297:21:0::2;131314:4;131297:21;::::0;;131497:35:::2;131511:20;131497:13;:35::i;:::-;131543:33;131557:18;131543:13;:33::i;:::-;131587:34;131601:19;131587:13;:34::i;:::-;131632:36;131646:21;131632:13;:36::i;:::-;131679:30;131693:15;131679:13;:30::i;:::-;131720:38;131734:23;131720:13;:38::i;:::-;131769:32;131783:17;131769:13;:32::i;:::-;131812:35;131826:20;131812:13;:35::i;:::-;131858:32;131872:17;131858:13;:32::i;:::-;131901;131915:17;131901:13;:32::i;:::-;131946:12;:50:::0;;-1:-1:-1;;;;;;131946:50:0;;::::2;-1:-1:-1::0;;;;;131946:50:0;;::::2;::::0;;::::2;::::0;;;-1:-1:-1;132007:44:0;;;::::2;::::0;;::::2;;::::0;;132062:11:::2;:47:::0;;;::::2;::::0;;::::2;;::::0;;132120:20:::2;:44:::0;;;::::2;::::0;;::::2;;::::0;;132175:14:::2;:32:::0;;;::::2;::::0;;::::2;;::::0;;132218:15:::2;:59:::0;;;::::2;::::0;;::::2;;::::0;;-1:-1:-1;132288:41:0;;;::::2;::::0;;::::2;;::::0;;132340:12:::2;:50:::0;;;::::2;::::0;;::::2;;::::0;;132401:9:::2;:41:::0;;;::::2;::::0;;::::2;;::::0;;132453:9:::2;:37:::0;;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;132501:22:::2;:46:::0;;;132565:48:::2;::::0;;;;;;::::2;::::0;::::2;::::0;;;;;;::::2;132629:44;::::0;;-1:-1:-1;;;;;132629:44:0;::::2;::::0;;;;::::2;::::0;;;;::::2;::::0;;::::2;132689:46;::::0;;-1:-1:-1;;;;;132689:46:0;::::2;::::0;;;;::::2;::::0;;;;::::2;::::0;;::::2;132751:50;::::0;;-1:-1:-1;;;;;132751:50:0;::::2;::::0;;;;::::2;::::0;;;;::::2;::::0;;::::2;132817:38;::::0;;-1:-1:-1;;;;;132817:38:0;::::2;::::0;;;;::::2;::::0;;;;::::2;::::0;;::::2;132871:54;::::0;;-1:-1:-1;;;;;132871:54:0;::::2;::::0;;;;::::2;::::0;;;;::::2;::::0;;::::2;132941:42;::::0;;-1:-1:-1;;;;;132941:42:0;::::2;::::0;;;;::::2;::::0;;;;::::2;::::0;;::::2;132999:48;::::0;;-1:-1:-1;;;;;132999:48:0;::::2;::::0;;;;::::2;::::0;;;;::::2;::::0;;::::2;133063:42;::::0;;-1:-1:-1;;;;;133063:42:0;::::2;::::0;;;;::::2;::::0;;;;::::2;::::0;;::::2;-1:-1:-1::0;;133118:31:0::2;::::0;;-1:-1:-1;;133118:8:0::2;:31;::::0;-1:-1:-1;;133152:1:0::2;133118:31:::0;:35;-1:-1:-1;;;;;;130656:2505:0:o;121959:71::-;122002:28;121959:71;:::o;127504:29::-;;;-1:-1:-1;;;;;127504:29:0;;:::o;139831:4530::-;140036:36;;:::i;:::-;-1:-1:-1;140075:51:0;;;;;;;;140090:12;;-1:-1:-1;;;;;140090:12:0;;;140075:51;;-1:-1:-1;140104:10:0;;;140075:51;;;;140116:9;;;140075:51;;;;;;;140137:38;;:::i;:::-;140201:9;;;;;;;;;-1:-1:-1;;;;;140201:9:0;-1:-1:-1;;;;;140201:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;140201:22:0;140188:35;;;140287:22;;140188:10;;140256:54;;:18;:54::i;:::-;140234:76;;140327:15;140323:165;;;140359:64;140389:17;140408:14;140359:29;:64::i;:::-;140438:38;140464:11;140438:25;:38::i;:::-;140498:56;140525:11;140538:15;140498:26;:56::i;:::-;140565:68;140591:11;140604:15;140621:11;140565:25;:68::i;:::-;140666:27;;140644:61;;140695:9;140644:21;:61::i;:::-;140866:10;-1:-1:-1;;;;;140866:23:0;;;;:102;;-1:-1:-1;140908:20:0;;-1:-1:-1;;;;;140908:20:0;140894:10;:34;:53;;;;;140946:1;140932:11;:15;140894:53;:73;;;;-1:-1:-1;140951:16:0;;140894:73;140858:141;;;;;-1:-1:-1;;;140858:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;141012:14;:27;;;-1:-1:-1;;;;;141012:47:0;;141060:9;141012:58;;;;;;;;;;;;;-1:-1:-1;;;;;141012:58:0;-1:-1:-1;;;;;141012:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;141211:44;141226:11;141239:15;141211:14;:44::i;:::-;141170:85;;141188:19;;;141170:85;141171:15;;;;141170:85;;;;141287:27;;-1:-1:-1;141287:44:0;;-1:-1:-1;;;141287:44:0;;;;-1:-1:-1;;;;;141287:42:0;;;;;;:44;;;;;;;;;;:42;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;141287:44:0;141268:16;;;:63;141344:18;;;:32;;;141511:15;:34;;;;;141531:14;141530:15;141511:34;141507:428;;;141578:107;141599:14;:27;;;141628:14;:24;;;141654:11;141667:17;141578:20;:107::i;:::-;141563:12;;;:122;;;141721:18;;;;:36;;;:22;:36;:::i;:::-;141700:18;;;:57;;;141812:99;;141871:21;:19;:21::i;:::-;141894:4;:16;;;141812:38;:99::i;:::-;141959:14;:27;;;-1:-1:-1;;;;;141959:40:0;;142000:9;141959:51;;;;;;;;;;;;;-1:-1:-1;;;;;141959:51:0;-1:-1:-1;;;;;141959:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;141959:51:0;141947:9;;;:63;142033:27;;:51;;;-1:-1:-1;;;142033:51:0;;-1:-1:-1;;;;;142033:51:0;;;;;;;;;:40;;;;;;;:51;;;;;141959;;142033;;;;;;;:40;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;142033:51:0;142021:9;;;:63;;;142262:9;;;;142273:10;;142285:22;;142228:80;;142033:51;142262:9;142273:10;142228:22;:80::i;:::-;142214:4;:11;;:94;;;;;142333:134;142359:4;:9;;;142370:4;:9;;;142381:4;:15;;;142398:4;:19;;;142419:4;:18;;;142439:15;142456:4;:10;;;142333:25;:134::i;:::-;142319:11;;;:148;142505:9;;;;142486:28;;;142478:101;;;;-1:-1:-1;;;142478:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;142679:92;142716:14;142732:15;142749;142766:4;142679:36;:92::i;:::-;142916:15;142915:16;:35;;;;;142949:1;142935:11;:15;142915:35;142911:314;;;142967:73;142993:46;143020:4;:18;;;142993:22;143005:4;:9;;;142993:11;:22::i;:::-;:26;:46;:26;:46;:::i;:::-;142967:25;:73::i;:::-;143055:57;143082:4;:9;;;143093:4;:18;;;143055:26;:57::i;:::-;143127:86;143157:14;:24;;;143183:9;143194:4;:18;;;143127:29;:86::i;:::-;143268:141;143295:14;:27;;;143324:9;143335:4;:15;;;143352:4;:19;;;143373:4;:18;;;143393:15;143268:26;:141::i;:::-;143252:12;;;143237:172;143238:12;;;143237:172;143433:27;;:64;;;-1:-1:-1;;;143433:64:0;;-1:-1:-1;;;;;143433:64:0;;;;;;;;;:53;;;;;;;:64;;;;;;;;;;;;;;-1:-1:-1;143433:53:0;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;143433:64:0;143420:10;;;:77;143608:9;;;;143619;;;;143433:64;143630:15;;;143647:19;;;;143668:18;;;;143560:12;;143575:129;;143608:9;;143619;;143630:15;;143688;143575:32;:129::i;:::-;143560:144;;143715:12;;;;;;;;;-1:-1:-1;;;;;143715:12:0;-1:-1:-1;;;;;143715:21:0;;143737:9;143748:7;143757:10;143769;143715:65;;;;;;;;;;;;;-1:-1:-1;;;;;143715:65:0;-1:-1:-1;;;;;143715:65:0;;;;;;;;;;;-1:-1:-1;;;;;143715:65:0;-1:-1:-1;;;;;143715:65:0;;;;;;-1:-1:-1;;;;;143715:65:0;-1:-1:-1;;;;;143715:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;143811:9;-1:-1:-1;;;;;143798:94:0;-1:-1:-1;;;;;;;;;;;143822:4:0;:12;;;143836:4;:12;;;143850:4;:10;;;143862:29;143798:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;143942:12;;;;143908:47;;;;;;;143929:10;;143908:47;;;;;;;;;;144054:299;144100:14;:25;;;144140:14;:24;;;144179:10;144204:4;:15;;;144234:4;:19;;;144268:11;144294:15;144324:4;:18;;;144054:31;:299::i;:::-;139831:4530;;;;;;;;;;;;:::o;150731:246::-;150835:11;150849:13;-1:-1:-1;;;;;150849:28:0;;150878:9;150849:39;;;;;;;;;;;;;-1:-1:-1;;;;;150849:39:0;-1:-1:-1;;;;;150849:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;150849:39:0;;-1:-1:-1;150917:1:0;150907:11;;150899:70;;;;-1:-1:-1;;;150899:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;151404:202;151486:50;151505:6;151513:22;;151486:18;:50::i;:::-;151485:51;151477:121;;;;-1:-1:-1;;;151477:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;151404:202;:::o;30199:136::-;30257:7;30284:43;30288:1;30291;30284:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;30277:50;30199:136;-1:-1:-1;;;30199:136:0:o;154761:258::-;154931:14;154896:10;-1:-1:-1;;;;;154896:20:0;;154917:9;154896:31;;;;;;;;;;;;;-1:-1:-1;;;;;154896:31:0;-1:-1:-1;;;;;154896:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;154896:31:0;:49;;154888:123;;;;-1:-1:-1;;;154888:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;157438:674;157674:4;157696:14;157713:21;:19;:21::i;:::-;157696:38;;157745:14;157762:21;:19;:21::i;:::-;157745:38;;157808:15;:73;;157855:26;:9;157869:11;157855:26;:13;:26;:::i;:::-;157808:73;;;157826:26;:9;157840:11;157826:26;:13;:26;:::i;:::-;157796:85;;157904:15;:73;;157951:26;:9;157965:11;157951:26;:13;:26;:::i;:::-;157904:73;;;157922:26;:9;157936:11;157922:26;:13;:26;:::i;:::-;157892:85;;157990:11;158004:76;158027:9;158038;158049:6;158057:22;;158004;:76::i;:::-;157990:90;157438:674;-1:-1:-1;;;;;;;;;157438:674:0:o;153688:181::-;121105:19;153769:7;:14;;153761:100;;;;-1:-1:-1;;;153761:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;149791:204;149909:11;-1:-1:-1;;;;;149909:28:0;;149938:5;149909:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;149955:10;-1:-1:-1;;;;;149955:15:0;;149971:8;149981:5;149955:32;;;;;;;;;;;;;-1:-1:-1;;;;;149955:32:0;-1:-1:-1;;;;;149955:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;149791:204;;;;:::o;122385:126::-;122447:4;122471:32;:5;121252:6;122471:32;:9;:32;:::i;29743:181::-;29801:7;29833:5;;;29857:6;;;;29849:46;;;;;-1:-1:-1;;;29849:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;154590:162;154678:20;;-1:-1:-1;;;;;154678:20:0;154664:10;:34;154656:88;;;;-1:-1:-1;;;154656:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;154590:162::o;123955:197::-;124048:4;124065:8;124076:39;124084:6;124092:22;124076:7;:39::i;:::-;121105:19;-1:-1:-1;;123955:197:0;-1:-1:-1;;;;123955:197:0:o;155027:476::-;155141:15;155137:359;;;28703:4;155181:17;:38;;155173:118;;;;-1:-1:-1;;;155173:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;155137:359;;;122002:28;155332:40;;;;;:82;;;28703:4;155376:17;:38;;155332:82;155324:160;;;;-1:-1:-1;;;155324:160:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;155027:476;;:::o;150985:231::-;151092:11;151106:13;-1:-1:-1;;;;;151106:28:0;;151135:9;151106:39;;;;;;;;;;;;;-1:-1:-1;;;;;151106:39:0;-1:-1:-1;;;;;151106:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;151106:39:0;;-1:-1:-1;151174:1:0;151164:11;;;151156:52;;;;;-1:-1:-1;;;151156:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;146079:536;146221:4;146238:13;-1:-1:-1;;;;;146238:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;146328:12;146343:13;-1:-1:-1;;;;;146343:29:0;;146373:11;146343:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;146343:42:0;;-1:-1:-1;146398:63:0;146343:42;146430:11;146443:17;146398:22;:63::i;:::-;146547:23;;146531:49;;;-1:-1:-1;;;146531:49:0;;-1:-1:-1;;;;;146547:23:0;;;146531:49;;;;;;;;;;;;:15;;;;;;:49;;;;;146547:23;;146531:49;;;;;;;;146547:23;146531:15;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;146600:7:0;;-1:-1:-1;;;;146079:536:0;;;;;;;:::o;153877:179::-;121361:7;153961:8;:24;;153952:96;;;;-1:-1:-1;;;153952:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;154064:264;154243:12;154206:33;:8;154219:19;154206:33;:12;:33;:::i;:::-;:49;;154197:123;;;;-1:-1:-1;;;154197:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;117363:471;117472:4;117493:9;;117489:338;;117519:17;117539:56;117589:5;117539:45;117577:6;117539:33;:5;117549:22;117539:33;:9;:33;:::i;:::-;:37;:45;:37;:45;:::i;:::-;:49;:56;:49;:56;:::i;:::-;117519:76;-1:-1:-1;117612:19:0;;-1:-1:-1;117612:19:0;117489:338;-1:-1:-1;;;117797:17:0;;116932:423;117035:4;117056:9;;117052:296;;117089:64;117147:5;117089:53;114444:4;117089:33;:5;117099:22;117089:33;:9;:33;:::i;:64::-;117082:71;;;;117052:296;-1:-1:-1;;;116932:423:0;;;;;:::o;153321:160::-;121105:19;153399:7;:14;;153391:82;;;;-1:-1:-1;;;153391:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;153135:178;120776:19;153213:7;:14;;153205:100;;;;-1:-1:-1;;;153205:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;148840:449;148947:9;;:56;;;-1:-1:-1;;;148947:56:0;;148975:4;148947:56;;;;-1:-1:-1;;;;;148947:56:0;;;;;;;;;148927:17;;148947:9;;;;;:19;;:56;;;;;;;;;;;;;;;:9;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;148947:56:0;;-1:-1:-1;149018:19:0;;;149014:225;;;149069:9;;:58;;;-1:-1:-1;;;149069:58:0;;-1:-1:-1;;;;;149069:58:0;;;;;;;-1:-1:-1;;149069:58:0;;;;;;149054:12;;149069:9;;;;;:17;;:58;;;;;;;;;;;;;;;149054:12;149069:9;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;149069:58:0;;-1:-1:-1;149069:58:0;149142:85;;;;-1:-1:-1;;;149142:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;149014:225;;149249:11;-1:-1:-1;;;;;149249:23:0;;149273:7;149249:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;149438:253;149588:11;-1:-1:-1;;;;;149588:28:0;;149617:16;149588:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;149645:10;-1:-1:-1;;;;;149645:15:0;;149661:8;149671:11;149645:38;;;;;;;;;;;;;-1:-1:-1;;;;;149645:38:0;-1:-1:-1;;;;;149645:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;149438:253;;;;;:::o;126802:337::-;-1:-1:-1;;;;;126876:22:0;;126868:65;;;;;-1:-1:-1;;;126868:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;127045:21;;127086:8;127078:53;;;;;-1:-1:-1;;;127078:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;151224:169;151324:1;151310:11;:15;151302:83;;;;-1:-1:-1;;;151302:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;150049:210;150158:16;;;:40;;-1:-1:-1;150178:20:0;;150158:40;150150:101;;;;-1:-1:-1;;;150150:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;150454:269;150580:16;;;;:40;;-1:-1:-1;150600:20:0;;;150580:40;:60;;;-1:-1:-1;150624:16:0;;;150580:60;150572:143;;;;-1:-1:-1;;;150572:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;146810:393;146959:15;;147017:18;;147013:183;;-1:-1:-1;147065:13:0;;-1:-1:-1;147110:4:0;147013:183;;;147160:24;147147:37;;147013:183;146810:393;;;;;:::o;156323:555::-;156601:4;156624:12;156638;156654:93;156674:5;156681;156688:11;156701:15;156718:11;156731:15;156654:19;:93::i;:::-;156623:124;;;;156760:11;156774:72;156797:7;156806;156815:6;156823:22;;156774;:72::i;:::-;156760:86;156323:555;-1:-1:-1;;;;;;;;;;;156323:555:0:o;151806:1321::-;152562:15;152558:562;;;152594:41;152619:15;152594:24;:41::i;:::-;152654:15;152650:165;;;152690:35;152712:5;:12;;;152690:21;:35::i;:::-;152744:55;152772:5;:12;;;152786:5;:12;;;152744:27;:55::i;:::-;152558:562;;;152872:35;152894:5;:12;;;152872:21;:35::i;:::-;152937:116;152963:5;:16;;;152981:5;:20;;;153003:5;:19;;;153024:15;153041:5;:11;;;152937:25;:116::i;:::-;152922:12;;;:131;;;153068:38;;:24;:38::i;122519:120::-;122575:4;122599:32;:5;121252:6;122599:32;:9;:32;:::i;154336:246::-;154463:39;:12;121252:6;154463:39;:16;:39;:::i;:::-;154445:14;:57;;154437:137;;;;-1:-1:-1;;;154437:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;147291:730;147558:4;147564;147586:12;147602:15;147601:174;;147720:13;-1:-1:-1;;;;;147720:31:0;;147752:9;147763:11;147720:55;;;;;;;;;;;;;-1:-1:-1;;;;;147720:55:0;-1:-1:-1;;;;;147720:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;147720:55:0;147601:174;;;147621:13;-1:-1:-1;;;;;147621:31:0;;147653:9;147664:11;147621:55;;;;;;;;;;;;;-1:-1:-1;;;;;147621:55:0;-1:-1:-1;;;;;147621:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;147621:55:0;147601:174;147586:189;;147786:12;147802:15;147801:174;;147920:13;-1:-1:-1;;;;;147920:31:0;;147952:9;147963:11;147920:55;;;;;;;;;;;;;-1:-1:-1;;;;;147920:55:0;-1:-1:-1;;;;;147920:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;147920:55:0;147801:174;;;147821:13;-1:-1:-1;;;;;147821:31:0;;147853:9;147864:11;147821:55;;;;;;;;;;;;;-1:-1:-1;;;;;147821:55:0;-1:-1:-1;;;;;147821:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;147821:55:0;147801:174;147996:7;;;;-1:-1:-1;147291:730:0;;-1:-1:-1;;;;;;;;147291:730:0:o;155664:541::-;155927:4;155950:12;155964;155980:93;156000:5;156007;156014:11;156027:15;156044:11;156057:15;155980:19;:93::i;:::-;155949:124;;;;156086:12;156101:71;156131:7;156140;156149:22;;156101:29;:71::i;:::-;156086:86;155664:541;-1:-1:-1;;;;;;;;;;155664:541:0:o;148029:733::-;148361:15;148357:218;;;148393:78;148407:11;148420:10;148432:9;148443:11;148456:14;148393:13;:78::i;:::-;148357:218;;;148504:59;148515:11;148528:10;148540:9;148551:11;148504:10;:59::i;:::-;148591:15;148587:168;;;148623:44;148642:11;148655;148623:18;:44::i;:::-;148587:168;;;148700:11;-1:-1:-1;;;;;148700:19:0;;148720:9;148731:11;148700:43;;;;;;;;;;;;;-1:-1:-1;;;;;148700:43:0;-1:-1:-1;;;;;148700:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30672:192;30758:7;30794:12;30786:6;;;;30778:29;;;;-1:-1:-1;;;30778:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30830:5:0;;;30672:192::o;123602:345::-;123684:4;123701:21;123725;:19;:21::i;:::-;123701:45;;123757:21;123781;:19;:21::i;:::-;123757:45;;123815:8;123826:90;123849:16;123867;123885:6;123893:22;123826;:90::i;:::-;123815:101;123602:345;-1:-1:-1;;;;;;123602:345:0:o;124160:262::-;124266:18;124287:40;124319:7;124287:27;:4;28703;124287:27;:8;:27;:::i;:40::-;124266:61;;124363:17;124346:13;:34;;124338:76;;;;;-1:-1:-1;;;124338:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;31115:471;31173:7;31418:6;31414:47;;-1:-1:-1;31448:1:0;31441:8;;31414:47;31485:5;;;31489:1;31485;:5;:1;31509:5;;;;;:10;31501:56;;;;-1:-1:-1;;;31501:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32054:132;32112:7;32139:39;32143:1;32146;32139:39;;;;;;;;;;;;;;;;;:3;:39::i;156886:544::-;157130:4;;157173:5;157204;157232:15;:66;;157276:22;:5;157286:11;157276:22;:9;:22;:::i;:::-;157232:66;;;157250:22;:5;157260:11;157250:22;:9;:22;:::i;:::-;157222:76;;157319:15;:65;;157362:22;:5;157372:11;157362:22;:9;:22;:::i;:::-;157319:65;;;157337:22;:5;157347:11;157337:22;:9;:22;:::i;151614:184::-;151703:20;;151695:95;;;;-1:-1:-1;;;151695:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;153489:191;153598:7;153587;:18;;153579:93;;;;-1:-1:-1;;;153579:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32716:345;32802:7;32904:12;32897:5;32889:28;;;;-1:-1:-1;;;32889:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32928:9;32944:1;32940;:5;;;;;;;32716:345;-1:-1:-1;;;;;32716:345:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://5f455190268213c9cfd879bd8faae5ed54a0ebe93cc67aea9b7a32faa8933bbb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.